Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 2 P+ H5 S& o! E: y4 O% c; I
: @ _' P! e* c+ b8 J
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
5 n' ]1 d; [# H& |* t' S+ T
& O- ]! o+ T2 g0 }: Z$ r- eШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния./ e. W! B; i' ~+ S: o, ` H4 x
6 U |( W) R3 c' t8 a- // Пакет для состояний монстра; D. ^ e" O' T. [5 \
- package org.l2jmobius.gameserver.model.actor.state;
3 a2 b. S6 Q) @
: k- n% `# ?: C- // Интерфейс, представляющий состояния монстра: Z8 M# u ~( \( F8 r
- public interface MonsterState {
- Z2 n {9 t& u3 t# L' V7 Y9 A3 P - void handleState(Monster monster);
3 ?( y6 n4 S! m$ z6 M - }
: o& p7 b, c& x, t) x% b
Скопировать код
0 ?& I5 y* c6 `1 iШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
) s4 U; R& o: k" S+ y1 c
! h7 D1 C4 {+ x% y) U L8 tЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.5 M: v' o" F! I f6 i# ?
/ C6 ^# G2 Z' D: q1 n3 T
Класс для начального состояния монстра:
6 H8 {/ k$ h; K' _6 A4 y# X- // Пакет org.l2jmobius.gameserver.model.actor.state
" w2 l" N0 g; }2 d, u. A5 M - package org.l2jmobius.gameserver.model.actor.state;
. D6 S% O& r/ M `' \. | - - a5 E% r; i3 i* h+ v9 ]/ |( Q
- import org.l2jmobius.gameserver.model.actor.Monster;
7 \; k$ j% D' j. V8 f
$ i, r( `4 G8 g2 }3 w. W$ Q% e- public class InitialState implements MonsterState {
1 i& ^7 ]6 B }7 Z - @Override
b% }, \5 w$ R - public void handleState(Monster monster) {; v7 A+ o! i% D; f7 [' |
- // Начальная фаза боя# U6 d) b0 W+ ]* o" m2 W& _
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");( A& j; ]0 ~% H+ r# j v& L% f. X
- }
$ {! B! }% Z) m5 C - }
9 v$ Y, y$ |: Q+ [+ R! c) y
Скопировать код Класс для агрессивного состояния монстра:! `4 Z4 c, u3 G9 v, I; V: y1 f, L) Z0 {
- // Пакет org.l2jmobius.gameserver.model.actor.state
/ C' j5 C0 @ p3 _9 \! s - package org.l2jmobius.gameserver.model.actor.state;
' g4 s- |' S) w0 Y9 f
' T9 X6 [3 Q1 i# j ]/ P' ]& ]6 @- import org.l2jmobius.gameserver.model.actor.Monster;! ?8 r' e! u0 Y7 p8 X9 |
- & E% Y$ j" s% S7 C# S& G3 o* U
- public class AggressiveState implements MonsterState {
& M0 |8 X( e2 i) f E: D2 o" q! T - @Override
? M5 A( }# M) V% w: e+ Y+ [ - public void handleState(Monster monster) {* K! G+ x, n/ |. [( |: R2 k/ Z4 \
- // Агрессивная фаза боя
! N7 H" ~2 e4 t- ~4 B. }9 c+ m - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");; y8 S0 x0 Q. l0 Y/ R1 W1 h
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки, Q0 @* q( T3 l' G# w
- }9 q8 e4 h" k9 [% G/ B
- }, i6 S7 z, o1 q- l, E8 p$ k
Скопировать код Класс для финального состояния монстра:. N6 [4 ~5 v$ l$ V8 N! X5 h m
- // Пакет org.l2jmobius.gameserver.model.actor.state, H* Q! O0 d0 n g) r
- package org.l2jmobius.gameserver.model.actor.state;! I$ c6 C$ _2 V; c d& E ^2 Q" R/ [7 E
* N4 f' t3 P2 B; L! L$ k- import org.l2jmobius.gameserver.model.actor.Monster;
) Z( y, l3 E4 [
; M* Q }+ x2 T& q( z; \, f% b- public class FinalState implements MonsterState {
. I+ k3 ?* C$ c d - @Override& D& M+ G6 N& F2 Z3 P& R
- public void handleState(Monster monster) {
" C4 H8 ]5 w7 A8 ~ - // Финальная фаза боя8 ~. A0 O- v% P) p% \
- System.out.println(monster.getName() + " готовится к финальной атаке!");
, T, X4 D5 F+ J4 d+ @ - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
1 Z% C0 G& g* g. p" Y, ~! w - }# r: I0 r! f7 M# W
- }, G9 N8 @) B) J
Скопировать код 5 J7 u, a6 ~+ }
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.: ~: p! K3 O( F0 n+ q: S
- // Пакет org.l2jmobius.gameserver.model.actor
/ q6 w/ X! g1 Y, _! s9 F- Q - package org.l2jmobius.gameserver.model.actor; K; q- Y! p1 ] t
- 0 F! I l9 @1 C* f
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
5 E' L# u# H+ o8 x1 L* ~+ E - import org.l2jmobius.gameserver.model.actor.state.InitialState;
! g, a0 K) ]: K. |5 K - 1 T( l. F& G+ s! d: Y4 E
- public class Monster extends Creature {4 h0 ]3 b1 c& f! D0 h( {& X
- private String name;
6 e: i( `& N1 d+ ~7 z - private double attackPower;
: }! x# W& a2 I* B1 z - private MonsterState state; // Текущее состояние монстра; {( a8 u e: t3 J- L% d0 E
- $ b0 z, s* w% Q' x, C1 T4 V
- // Конструктор монстра
% {! m4 }% \, d4 V/ w' X - public Monster(String name, double attackPower) {* R: R) a& y5 R- N( P' _
- this.name = name;+ p! I- E0 j3 M! E: z8 J
- this.attackPower = attackPower;
6 ~; V# P* I9 L2 L K - this.state = new InitialState(); // Устанавливаем начальное состояние
* b/ g1 I5 e, ^6 u - }9 V& x, r0 ~& L! X3 h! C/ e( J" y; M
- - b- R1 [8 `: p% O+ o/ u5 Y( H
- // Метод для смены состояния. F$ q9 Y3 o+ f9 ]; y
- public void setState(MonsterState newState) {& z4 V( p2 S6 i( u8 [! p
- this.state = newState;* i! J2 c0 v, L2 k; M; l
- }
' S a. u% o" r ?$ B2 z
! s; N3 Z3 c0 N: B# K% w5 R: x7 f- // Выполнение действий на основе текущего состояния% g0 K; I! R& \4 a
- public void executeState() {/ E6 z2 f6 }* Z2 o: u
- state.handleState(this);+ r/ ?, Q9 a' n. P2 n' `" S
- }: {% c5 J7 Z) W& ^
- / P* [9 v7 I2 M! ^
- // Геттеры и сеттеры. u: J3 E- N+ C/ e- j \/ y
- public String getName() {
2 Z6 T$ a; z& ?" r' K - return name;
: T- c2 u9 l j I: m - }& U( {5 W+ v" E# y, I2 Y# ~
- ) I. q3 v# C# H+ P9 Y
- public double getAttackPower() {! G# E/ Y, E) G+ x- X* J6 ~0 b& a
- return attackPower;
0 t' ], ^" K0 X: a% ]! j4 x - }
+ @: O$ l8 L k- C
5 v+ [- P7 C/ w8 u6 d6 Z- public void setAttackPower(double attackPower) {
7 g! u" k+ t5 l! L6 l! B - this.attackPower = attackPower; M: p0 n9 l d5 n$ a5 q; F' H
- }8 m$ I. n$ X+ c) t# ]
- }$ g- _4 z- q _ i
Скопировать код
, c/ ` O6 a% Q, P! ZШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.* |. p$ p6 g/ `
. x3 `: t4 Q0 b- s3 y1 E
- // Пакет org.l2jmobius.gameserver.model.battle7 p2 o K8 e& T: d: h( R! p, e: P
- package org.l2jmobius.gameserver.model.battle;
: x; Z& c: m( {6 T/ ? - 5 r9 e) l* w5 F0 U# ]
- import org.l2jmobius.gameserver.model.actor.Monster;9 ]1 [: ]0 h E: k" D" F6 i# g
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
+ w- V+ ?1 t3 M - import org.l2jmobius.gameserver.model.actor.state.FinalState;
0 g! H$ [1 m" y
9 E! {; a O/ l+ n) [- public class BattleSimulation {
K5 B/ T. Z0 Z - public static void main(String[] args) {
) X9 Z+ i" v& {& d0 Y& P/ l0 C: d - // Создаем монстра с начальной атакой
$ _2 ~+ P. Y. C8 U; c2 g8 H - Monster monster = new Monster("Дракон", 100);* `5 t1 }$ n2 g( n9 Y! I
3 y- ?+ o: B: x: D6 \* F& R0 L- // Начальная фаза# L! Q5 H4 t2 I" g4 |
- monster.executeState();
1 |8 |' E) ]+ u - ' x9 h" x) o/ j/ R
- // Переход в агрессивную фазу
0 q% d. V0 R2 V: i8 I - monster.setState(new AggressiveState());4 t, s7 W. ?3 N# x" d8 Y
- monster.executeState();
2 F6 F4 X9 I0 k) [. _' w
1 w' c$ M0 C# ~6 J- // Финальная фаза$ `& D- m" }5 `9 E, l6 u) }
- monster.setState(new FinalState());4 s$ G' _4 Z% m% Z
- monster.executeState();% ?; r; ^& d/ @) P: n) G
- }
# n1 c. E4 [6 ~5 K - }
/ c; P( P7 R6 y. H4 p- a
Скопировать код 0 k$ C E. j5 c" W
Комментарии по структуре пакетов и классов:9 }! Z4 D8 Z @ Y& ?: r
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.+ `( U6 w6 R/ Y5 C/ K* ~$ I9 ~
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
1 g3 r6 }0 V3 s& QЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
" _" J4 c# {5 ]
5 P* v( |0 b6 K j' G/ S7 t2 u" z' k' G
4 L- ~5 @6 A9 n) d
; M# k" t5 K! a: R' @
( V5 J: t7 m. X$ {: H" N* w: F
+ u8 }+ m% p* E+ A6 |* x% ?, h, k9 Z0 b8 J. j" q
% k0 a' @9 U8 J7 X+ H' z9 T* M
# H+ n0 R H P. |" |3 H* G
, V3 ?: t$ i$ Z9 h+ z3 p6 y* w! M& K/ ~+ ^ }
9 _& Z6 d" d3 [' S; D6 w; q- ], `& w4 v
* U6 ?6 G5 Y$ `1 p |