Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
* l+ v8 V- G6 [4 U* e& U% H" V7 q' s
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра., f+ ^; d# ]: G4 k0 k" _+ K
$ X6 i/ K8 a' o" NШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
, K; w) f8 y, |2 ? ^: h8 ]& N: P
+ w$ f! f0 M0 ]& B- // Пакет для состояний монстра
, F4 v1 i& u5 } - package org.l2jmobius.gameserver.model.actor.state;
. d% |( D4 E5 p* _
" [4 G7 D2 ^% y3 H, X- // Интерфейс, представляющий состояния монстра
b5 L- c( N9 h3 d0 j" |* y - public interface MonsterState {
8 l3 {7 Z/ ^) y3 K2 L2 s - void handleState(Monster monster);* j" A7 N( }' t/ X' ]
- }. B3 q* J4 F: \7 h5 w" \* `
Скопировать код
: b! c3 j1 K2 t* N/ X- zШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 3 A+ F; X H* r5 P) Z* k7 g
& ?1 A4 r2 K& l3 b
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
0 w8 U$ P6 J; i& o- \/ |. l
( @3 n% I& C, i9 F1 iКласс для начального состояния монстра:
* ]- n* N6 ]+ h4 M$ c- // Пакет org.l2jmobius.gameserver.model.actor.state9 o6 z, H. E% }2 f4 c" {& a
- package org.l2jmobius.gameserver.model.actor.state;
' _4 [9 J3 t" _$ c# u% |/ G( T# l
; z: h1 O# X" p& v7 J% N& s& J- import org.l2jmobius.gameserver.model.actor.Monster;
. M! }5 _4 G c3 J( y, c3 ^' g. f
" j. v- A0 e7 M" K- public class InitialState implements MonsterState {
* g/ W6 n. R( @( [5 x - @Override$ @. s$ w; J* p$ ]+ N$ o# k
- public void handleState(Monster monster) {
. Z6 u q2 e' O0 g9 O - // Начальная фаза боя8 N: D, ?3 Z( Y9 _/ F# x# X/ B
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");
3 l, S# _0 `! O4 D$ ` - }1 A& V) f) ?" C# R# H* q
- }
2 L7 u. w: |( I0 {
Скопировать код Класс для агрессивного состояния монстра:
3 ?. E+ X: A: ?) C; \- // Пакет org.l2jmobius.gameserver.model.actor.state
9 g% _/ B) H% O) f - package org.l2jmobius.gameserver.model.actor.state;
9 H4 }/ P ^7 A& Q1 V* p
1 @& x# {% S$ @- O& s- import org.l2jmobius.gameserver.model.actor.Monster;/ D2 j; U6 y! D& z7 |% q
- 8 E. E# `4 R$ L# p( I
- public class AggressiveState implements MonsterState {
7 `& f' b' `% j$ R - @Override
- T: ?) ?6 m* j - public void handleState(Monster monster) {2 B/ o: ]% Z8 t4 L
- // Агрессивная фаза боя" J {" a, z+ A: o& r! y
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");- `. S' v6 ]; \# p
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки$ l- T5 \; p) i- O4 m% j, ]
- }
r2 E) a+ U5 U1 g - }4 x5 X1 n* h' Z! _ @. |! }
Скопировать код Класс для финального состояния монстра:
* J' v" l, G7 H' F- // Пакет org.l2jmobius.gameserver.model.actor.state, ]6 [3 Z7 h0 F' E& T
- package org.l2jmobius.gameserver.model.actor.state;7 P2 c3 t+ q9 D! i( \" @5 H* Z
: A9 k8 }2 ^$ d5 t7 _- import org.l2jmobius.gameserver.model.actor.Monster;- X3 g# g, o* g; f$ N, m
- 1 [2 L: w) r4 f& Q
- public class FinalState implements MonsterState {9 z4 M1 k# {- y* l1 [/ R
- @Override
- Y9 ]* A( A/ h+ N9 y" N - public void handleState(Monster monster) {1 S9 Q6 T7 e1 b- U9 K' l) K5 I
- // Финальная фаза боя; ~; q1 c, d2 A0 W" ?8 f& t
- System.out.println(monster.getName() + " готовится к финальной атаке!");
6 X7 V3 F {" x' V2 X9 Z3 q - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки3 F& Y- i0 y( x3 k: {9 c, A1 @
- }
1 F4 J! V9 J7 F0 V - }
* z$ u1 {6 ^0 P6 O+ h
Скопировать код ) B0 s1 S1 S6 b- s
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.) c- [$ l( _& D& ]8 c/ e
- // Пакет org.l2jmobius.gameserver.model.actor
0 a% b2 q: e9 _2 W' F) K - package org.l2jmobius.gameserver.model.actor;# C6 q1 o, R0 q, H8 R
- ) X* z0 u( l3 O0 P4 [
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;. p- v& }& L% Z8 g8 l
- import org.l2jmobius.gameserver.model.actor.state.InitialState;
6 b3 t& w( S; H% F2 C/ \ - " N7 {( Z! `, `: n( z5 ]
- public class Monster extends Creature {% ^, u, ? o' r2 w5 M6 U" O @
- private String name;( l' w( T+ U2 J+ L. O: s
- private double attackPower;
& ?# `. s6 O+ A0 U8 b- W - private MonsterState state; // Текущее состояние монстра2 X Y* a6 D* V. H) J, q% [3 I" N
, ~+ B" G+ k" g! Y- // Конструктор монстра
4 B* J" I& G2 t! h9 s - public Monster(String name, double attackPower) {1 b+ s. [# ?3 C# U7 a
- this.name = name;8 F0 b. j2 J& r* a* v
- this.attackPower = attackPower;$ J+ |% u! `1 B' V' z+ k
- this.state = new InitialState(); // Устанавливаем начальное состояние
( J/ M$ f b: K( a; l# x! ` - }
9 o) U) l% W7 z/ @
% Z1 H, p; T" B" p9 I! f8 V9 ]- // Метод для смены состояния
3 L: G. k% W& p6 p' i - public void setState(MonsterState newState) {
; N, E8 T" E2 Q: a/ Q - this.state = newState;& }/ h1 ]2 F& Y9 k% r
- }
, j# n- C L* @1 D7 k* T2 G - " _2 U7 R4 \* E- @' Y
- // Выполнение действий на основе текущего состояния
3 v9 A8 Z1 U: M% R2 E; ~ - public void executeState() {* S$ ?2 C9 B. q- R- X5 g
- state.handleState(this);" b" @+ [& F# j0 p% t C. k: a6 h
- }
5 _# b6 G0 L& A
. U; F: g$ `4 I- // Геттеры и сеттеры
8 X7 x, y; b n. h6 r9 }: t - public String getName() {3 H, i5 q9 {# O: U9 B$ n1 ~
- return name;+ W, U0 M5 w1 D
- }
- _9 v/ u, q; m2 u+ ^: n, U8 H
* f) v* @% ~; A9 @' l9 w& {! v- public double getAttackPower() {
; w3 u+ c5 N0 o' R$ l" W - return attackPower;
# `, H, ?! d5 x6 ]0 q* P - }
+ U4 X8 w; m R - 0 \0 D) U) v. ?
- public void setAttackPower(double attackPower) {+ x2 ~) L6 k* z9 Q5 q3 l
- this.attackPower = attackPower;( t2 m" n; A; Q I+ |( Z1 O
- }
- g% o" b0 a- V8 r, v- O - }0 Z" w5 _" F @6 v# `9 ~/ X
Скопировать код 4 i, C( _' y6 W4 F: A3 {3 w
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
6 u5 D. L- X) s2 E; X* {0 l" ^9 w* M+ e! D3 {4 ?/ p
- // Пакет org.l2jmobius.gameserver.model.battle% F9 F: d' j" ?" m8 q( y9 C0 E
- package org.l2jmobius.gameserver.model.battle;9 x# K2 E% i) T6 o6 x
- $ B: x) c& l2 _4 h6 _* ]& y. w
- import org.l2jmobius.gameserver.model.actor.Monster;
z# a1 [1 Y' k Y( _) C- } - import org.l2jmobius.gameserver.model.actor.state.AggressiveState; {8 u! e8 }+ x
- import org.l2jmobius.gameserver.model.actor.state.FinalState;0 w$ I, U3 v: Z" ?$ O
. D2 T, k8 Y+ h- k1 R: V: n: H- public class BattleSimulation {
- j! \ w) B( k# c5 | o s - public static void main(String[] args) {3 [5 |7 E) e- G# C
- // Создаем монстра с начальной атакой
M2 a) t' ^0 `9 R# q - Monster monster = new Monster("Дракон", 100);
g; Y9 Z3 \- Q7 ` - 4 O- G9 G" |8 z: ^: n# B) i) D) k
- // Начальная фаза
1 ~6 @: v8 X5 h+ P( r+ A7 k - monster.executeState();
6 n& V" ?8 ^: J# c
* E) O. V4 A! j k( _' R6 D! ` B% |- // Переход в агрессивную фазу
- r# ? N1 ~( z# B& h. j - monster.setState(new AggressiveState());4 `0 T/ K8 D& p
- monster.executeState();
+ p* l3 i2 G) @! {% `0 m8 G
# K3 i% u7 ~# s& f- // Финальная фаза
. [ d, \& Y7 r9 n J* k - monster.setState(new FinalState());7 P% v4 z5 o" o5 M- F' h7 h. l
- monster.executeState();
! B8 |9 N. N$ m5 l - }, N! Y1 B+ Q/ O: v4 M# x) c' I
- }
8 }9 [( S9 q, L. S
Скопировать код ' Q8 D; F s7 i2 r, y
Комментарии по структуре пакетов и классов:
9 V9 Q) `# t0 O! f0 b5 V- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.; `% n& [9 O( L- [9 D
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.; [2 n3 u0 ?2 Z6 @# M8 r; y/ T
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
( M3 v) s; y% U/ s' i7 L
3 c" C: p& W: d6 Y* E7 Z1 C& V4 p1 Z" H3 g- u5 E% S, o
- e8 Z+ }* R# ]' o, f7 T% M; m, s& h2 M7 A1 E
6 L" F# K) k: }* D7 f+ |4 t1 Q& U& c1 V+ k, [1 S! l0 H0 U4 j
6 N# X7 ^, W& E! t
- n7 ]" i3 E/ l7 K
7 `" e. h& B ]1 g& Q6 Q8 ]
2 W% }' ?* I" m. g8 S ?! y/ o5 y3 M6 W4 C0 f
( ^: h& X6 |( I
0 g8 D6 G) Y; Z; e- [2 U/ _0 z& d( V% k6 @; K6 r# C: h1 ?
|