Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
& \( Y5 N0 f- h& J( b. r: z A9 {% t/ V T3 f1 {" G
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.+ [! g3 V5 Y' |7 ^$ x: A+ I
1 q" L4 e( n. N, X! Q
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
) L- H+ N6 I+ s
4 _2 `2 u# V. u' G3 v! Z4 e/ R5 L- R- // Пакет для состояний монстра) e2 b* }8 Y$ i' Z2 N/ E
- package org.l2jmobius.gameserver.model.actor.state;
; G! L* M. u2 S7 M9 {
! b8 ?2 |# q5 o# z+ h3 r- // Интерфейс, представляющий состояния монстра3 h5 B1 ]5 s+ K
- public interface MonsterState {: y ?" Z( X0 f; g
- void handleState(Monster monster);4 h3 u- \( m: {5 K7 N1 X* W: K
- }- @ r6 \3 Q2 [
Скопировать код
' v- S; J* {1 Y) [. UШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. % T3 E+ v) j J. i$ [; P5 W
5 d7 R* R: ~) d8 pЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
" x z9 w$ _; P2 c5 `% {# m- z) }0 g2 x8 @* u8 [' z
Класс для начального состояния монстра:2 T' D& V% L* h! Y7 E$ a0 W
- // Пакет org.l2jmobius.gameserver.model.actor.state
, G8 e* D- n2 R2 V; @: H - package org.l2jmobius.gameserver.model.actor.state;+ A% F/ u# ]3 R4 J: v
- , X% l8 z ]$ L' S9 n
- import org.l2jmobius.gameserver.model.actor.Monster;
8 V8 _5 o4 Z, r( Y: W" V - ' Q$ m$ f1 T: i# E$ }+ J. R
- public class InitialState implements MonsterState {
6 W: |0 g; ^/ }, R0 q - @Override3 u5 a1 p! U# t( m6 I
- public void handleState(Monster monster) {( K) M0 k; i* x- A
- // Начальная фаза боя7 \, F, b0 C+ |7 G/ P. ]2 F* {
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");
5 J- b5 _* y( |+ O8 a - }* Q5 }3 x) [5 Y3 n/ V8 U" h
- }
# }' s0 r# C5 X
Скопировать код Класс для агрессивного состояния монстра:5 H: s4 I* g1 T6 y! O
- // Пакет org.l2jmobius.gameserver.model.actor.state
9 Z" w/ d3 z& ? - package org.l2jmobius.gameserver.model.actor.state;
& Z, [* x* W2 g& ]/ R# ~ - / S2 X8 U+ O2 p7 j$ }
- import org.l2jmobius.gameserver.model.actor.Monster;
0 ?3 ~ Z3 _! F+ R2 A9 |% B$ ]1 G' |
. r' p. e+ u* r0 V- public class AggressiveState implements MonsterState {
0 `4 P6 c8 }# u: L# r - @Override
: q: _% k( [- ~7 S - public void handleState(Monster monster) {. a* M3 E7 y8 | J# |& q; F
- // Агрессивная фаза боя; P( Q t# W& l1 K+ s
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");: {0 R k, v" o+ @9 u
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
% l/ C- {+ n4 M S* S* _4 c0 } - }6 S5 d$ f- K$ W; p5 _5 z0 ^
- }
9 u, l5 |5 g- I q, }5 D' j H
Скопировать код Класс для финального состояния монстра:
, E7 Q) c% g* l- // Пакет org.l2jmobius.gameserver.model.actor.state) f; \: o8 S' n$ C/ t
- package org.l2jmobius.gameserver.model.actor.state;8 T% H( e4 c/ a
- 3 d2 s! v3 q$ @) F) j0 D
- import org.l2jmobius.gameserver.model.actor.Monster;
- n1 x$ H4 |; n" m9 b - ' @9 o: _; Y1 L) h1 k
- public class FinalState implements MonsterState {8 R. a( k! g7 D2 P
- @Override
# ~) l) [( I" j3 ^' l" c9 h9 G - public void handleState(Monster monster) {( {3 t& m& j. U {" w
- // Финальная фаза боя
* B* o% g- V! O6 I# X2 Q& Z - System.out.println(monster.getName() + " готовится к финальной атаке!");, c9 f' n6 p4 Q) \/ Y8 E* M
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
" N* N9 s8 |) w2 s g. T" ] - }
' Q# G: @: ~9 o+ m - }
! s- }# C0 n0 |, M5 y
Скопировать код
" U9 P9 T" A5 X5 }Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.- E8 c' P5 `4 X0 _3 A& D
- // Пакет org.l2jmobius.gameserver.model.actor+ Z D2 n6 v( M
- package org.l2jmobius.gameserver.model.actor;
/ l! l' l6 K3 `. @7 Q- @/ q
% R2 x/ a9 [6 w- import org.l2jmobius.gameserver.model.actor.state.MonsterState;" H& r% J2 R) B$ b. @0 B4 U
- import org.l2jmobius.gameserver.model.actor.state.InitialState;" w1 {5 D3 z9 U4 i) m. k
' X! Q) | p- h3 A5 h$ o: [" S, L- public class Monster extends Creature {2 r! ?. K+ i& ?7 b/ n8 Q" L
- private String name;1 a3 W, W* d+ i
- private double attackPower;
" M0 Z7 l) I$ b, a( [& o# u - private MonsterState state; // Текущее состояние монстра
# k! a0 h( k4 R, g* s
; G+ t8 |' s* |* d- // Конструктор монстра
" s+ B _ X' G3 T6 \4 b( l - public Monster(String name, double attackPower) {8 K6 V# ^( k* v5 @$ z4 v1 z
- this.name = name;
' T% B0 i/ g- e) S5 D - this.attackPower = attackPower;1 W+ M9 b, d% S/ h6 ]8 F
- this.state = new InitialState(); // Устанавливаем начальное состояние+ l5 G6 j( H. q( q2 J( w
- }8 u2 q+ J) n1 m1 |4 }
- ( S' l0 F& p( v" W3 O6 {, ^: c
- // Метод для смены состояния4 P x3 v6 g+ X) q; d/ ]2 Q, b
- public void setState(MonsterState newState) {
1 g S9 c: t: ]2 L8 v. s. i - this.state = newState;; B3 L7 W C" E: Z2 ^# C
- }) ?: b, t( M$ D% ^# h$ X. ~. n# I
- . K4 {1 F; C' ]1 Y8 z* X
- // Выполнение действий на основе текущего состояния
! }9 ?" x! Q! M" z: ^ - public void executeState() {& d) R a1 P9 K
- state.handleState(this);( x3 Q0 `! Q0 `4 ^3 n R+ ]. E
- }
: A: l v1 b! s2 m T - " B( C% `# A$ @: X, X( Q
- // Геттеры и сеттеры
0 z9 g! e% Z5 t( K2 T B - public String getName() {
9 j. O) H" x# i# \ - return name;: [7 a5 p8 Y7 [* e8 K: d: q4 q
- }
5 P% l+ L2 W5 O0 B& l
7 v$ C l9 O8 s- public double getAttackPower() {; K H$ H) ~3 L4 E
- return attackPower;
7 ~- G+ y2 [0 ]/ c2 P9 d - }
' D |$ N) ?0 C0 Z J( |4 F& E
; { E; l2 ?" v* l& v- public void setAttackPower(double attackPower) {' g$ r, O: E" J( x
- this.attackPower = attackPower;
[7 m, e, M+ y7 W W& S! N - } P7 D2 P- @! X' {, _ d" @
- }
7 ]- v4 ~/ Y" B; V
Скопировать код
+ K! B+ } E- [/ c# C- YШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
9 o: r* Z2 p4 p0 m& T4 E
8 V/ L" ]$ }& I! `, X% `- // Пакет org.l2jmobius.gameserver.model.battle# F. W& o3 `, ?9 s
- package org.l2jmobius.gameserver.model.battle;
5 y; v4 [" s; g; v
8 a: \( I8 y; K; l/ b- import org.l2jmobius.gameserver.model.actor.Monster;
@1 a/ a; v! J/ ]! K: { - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;& C; P8 U$ C9 f' J& }+ D
- import org.l2jmobius.gameserver.model.actor.state.FinalState;1 S0 v& C$ Y2 B8 ~
- " s2 x& E5 @. [% @
- public class BattleSimulation {: k. G; W! i S* a4 ?/ B \
- public static void main(String[] args) {0 S6 c- {% q3 \4 a4 [
- // Создаем монстра с начальной атакой* a) O# O+ H1 X$ o4 G3 I
- Monster monster = new Monster("Дракон", 100);
Q& n1 N) i0 T" i9 E7 {" Z - 3 ~4 a1 [* A& _7 C0 {8 d
- // Начальная фаза
$ _$ Y- B5 @( a V$ j2 `7 m - monster.executeState();: q& u: V- \* S& E
- " g7 B6 J7 e/ W2 L
- // Переход в агрессивную фазу5 `2 J6 ]2 h- U) F4 i- F, O2 L
- monster.setState(new AggressiveState());
$ P- p& K" h7 @+ M6 n3 p. ]4 k - monster.executeState();/ Q8 S7 Q( t5 v3 h+ i5 ^% ]
- 1 c0 y8 N6 X0 `% F, n5 \; ~
- // Финальная фаза A7 ]# U3 ?( ]7 W; I
- monster.setState(new FinalState());
4 {& m1 S0 o" w - monster.executeState();) q0 N# ^# z3 @9 F' z7 g* c" W
- }
5 F! M+ z% p; q& E% X7 ] - }
; Q8 K! `5 t) K: A9 E' M
Скопировать код
3 i) H- c# Y; b8 }8 S: ?7 G6 T8 s% @0 LКомментарии по структуре пакетов и классов:: r* o# m6 _! ~2 ~- ~
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.+ n8 }! e/ e+ w$ p+ L9 H+ f% s
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
4 `/ ]! X' y& Z {' I# rЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
# d6 m$ P! E( F" N9 S5 P
9 |* S* b" N8 a+ X' o, w. z- D8 J9 \* h9 h. v/ P# s
: X! X% _+ W1 ]% U F: ?
1 G) `/ }+ k2 M% c. o3 i" ]8 }
( @* J7 z: D' Z' t5 `7 V
" k t- c r# v, O
w5 }! U( b0 y0 W4 V+ `# B; r* S2 S6 g- s1 I- d+ D
3 ^/ j( ~9 {' K, n5 Q6 v* C# S& |5 f: X
$ T; d; m& \ z
7 F+ w/ z% y d* T+ E1 h" S; D
. D6 N* k4 {) R) z9 c; |' A4 E3 T
& d% b5 j) L1 A7 d' ]; n: ~0 ?( k. t |