Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
1 l; c" Y' t( m" b1 X0 V: Y& c3 l/ f2 h, Q
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
?5 J) x; i! A0 u" E! P: g! Y6 q* ^$ p( t: g0 ?1 ^
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
; V8 q9 F8 h1 ^# }# H9 [/ [+ s
4 {$ n' R8 k3 P: `: m2 O3 c- // Пакет для состояний монстра4 o, B) s0 y: W3 L/ I% P( L. q
- package org.l2jmobius.gameserver.model.actor.state;7 @9 _. u" A% D
- 2 x) {, E$ x9 \$ H% y4 w4 h
- // Интерфейс, представляющий состояния монстра) H! S' i( G" C8 F9 R2 n/ U
- public interface MonsterState {! e# H- T* y" L ?5 h- n9 @
- void handleState(Monster monster);; C. s/ @5 v! w9 M; ~( [8 J( ]: ~
- }1 y, E+ L# H5 H( `2 l: W
Скопировать код * X6 @% e3 T) o
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. & Z/ R3 ]: u5 x2 n# W
, K0 R8 w* [# s1 L
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя. H4 S4 p+ x4 ~& g3 O
2 s8 v2 k& i8 ^* b$ J z& q
Класс для начального состояния монстра:4 {* |2 K+ S( D8 y! J9 R/ K/ v
- // Пакет org.l2jmobius.gameserver.model.actor.state
% m9 P- g7 C' u+ v+ x) ~/ A& ~ - package org.l2jmobius.gameserver.model.actor.state;- n! l1 R) d; g* Z0 B d
- 1 |$ A, ?% @2 ^1 T
- import org.l2jmobius.gameserver.model.actor.Monster;+ d+ R `+ x. t+ u/ ~2 S8 E
- a4 o) h. W2 Q" h' ^( ]
- public class InitialState implements MonsterState {. C8 t* R# d9 I# U+ M; o
- @Override( c" X7 M" d* M; y
- public void handleState(Monster monster) { G2 K) L+ U* q+ ~% `
- // Начальная фаза боя
( W7 z, X8 s$ { - System.out.println(monster.getName() + " начинает бой с обычной атакой.");
& C7 i6 ]" h: d) }& l- f; L - }
6 V6 ?# f. V5 Z. T% c9 H0 R - }% J# r4 x! `4 d0 x- D
Скопировать код Класс для агрессивного состояния монстра:( s" n" u- V3 R: Z3 B
- // Пакет org.l2jmobius.gameserver.model.actor.state' q" k I" S6 |$ @2 O7 c6 w
- package org.l2jmobius.gameserver.model.actor.state;* V6 J7 \- k: M1 R% X
% Y x- D; a& k( m2 C- import org.l2jmobius.gameserver.model.actor.Monster;
8 ]# Z c! Q4 ^6 [! y; j/ Y3 \
0 U' n5 G3 r7 Y; l- public class AggressiveState implements MonsterState {
+ f; Q" K' [( i9 | - @Override* ^9 V4 a8 C1 ^2 ?0 C7 S
- public void handleState(Monster monster) {; O* t. t) z* s/ c9 @
- // Агрессивная фаза боя
( ?& P6 v5 |! z - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");9 x3 ~( E# C% H6 b! P9 x
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
/ n) V* q0 t; }2 Y - }5 x N4 |* E Z/ C
- }
% F/ y$ r* }. x( r8 ^
Скопировать код Класс для финального состояния монстра:
& b& `* w. V" W% g# J, `- // Пакет org.l2jmobius.gameserver.model.actor.state
0 Q+ o( E2 L2 h; h3 S9 A; g - package org.l2jmobius.gameserver.model.actor.state;) i( @/ }3 F+ M: U" Y
! i7 \7 O* B4 n& _" |- import org.l2jmobius.gameserver.model.actor.Monster;
# e. C+ }* T- f& I. Q6 D - 5 G1 L6 e, @$ k% e$ h2 o
- public class FinalState implements MonsterState {
8 y+ z9 `8 k$ I3 b7 b/ o6 |( |* h - @Override9 [5 F, g% j: N0 t \. ]: j. X
- public void handleState(Monster monster) {
! F) x" R( V9 E! t - // Финальная фаза боя" k* ?* |. B# s v% C, b: m
- System.out.println(monster.getName() + " готовится к финальной атаке!");( B. V& Q& O. B% u; F' W+ Q
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
* D5 a1 z4 ~2 e) m, F I' k - }
' t/ o3 G- q4 s" w, T - }
% B8 Y h' g! E/ K7 F+ L" A1 }* o9 o
Скопировать код
; O* z5 }3 }1 p3 `: ^7 eШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
6 R* g" x7 a- u& k7 ?8 L, y2 b h- // Пакет org.l2jmobius.gameserver.model.actor
: U( F- y6 m: ?. v+ g - package org.l2jmobius.gameserver.model.actor;* K# V# N+ a3 K" W& Z
m( L! }% G5 P4 _- J- import org.l2jmobius.gameserver.model.actor.state.MonsterState;* l! p* \! C" ^$ W
- import org.l2jmobius.gameserver.model.actor.state.InitialState;
6 a* l) a, o4 b) f# _* Q \4 B - $ l; k" Q& P' \. O6 t5 J4 \8 G
- public class Monster extends Creature {
4 L) K! X1 p9 _3 \ - private String name;
4 v3 q7 N; i. ]. H, m3 [7 X - private double attackPower;
3 O( R* m% D: R" O7 V - private MonsterState state; // Текущее состояние монстра3 k' t! L n, j) q+ N
- * L( k$ @9 e( |0 `, e
- // Конструктор монстра' C: F7 E# U, r( Q6 x- i% i
- public Monster(String name, double attackPower) {0 T8 @. n' k4 x9 }0 ]
- this.name = name;
5 _! k0 j& {9 ^ K$ B) [3 c - this.attackPower = attackPower;
" A6 Y) a9 L- M ] - this.state = new InitialState(); // Устанавливаем начальное состояние! D& u& g7 y/ b* h& o" a+ K
- }1 J/ Y6 j! ]. u& z2 \! E2 C) `; z
; F& `- o0 r/ f# |7 p! X- // Метод для смены состояния5 R* o) e0 F5 n
- public void setState(MonsterState newState) {
4 K, Z/ C6 l4 B. X% o% [3 R. { - this.state = newState;0 N: Q( m1 s8 ]( T# a
- }0 B. N0 K1 b8 _! U, R
+ f5 U& @$ R! p$ F2 [9 r7 j- // Выполнение действий на основе текущего состояния8 j0 }3 n g4 n. y0 a3 J" M9 o+ ^
- public void executeState() {, a' h5 _- l9 [0 e# q8 q
- state.handleState(this);$ z& y3 X( d; e
- } _& x3 T2 s3 I) s* t J3 j
* I1 X! N( K! ]1 H- // Геттеры и сеттеры7 \ f2 S1 t6 q5 `
- public String getName() {' l; d' ^2 e8 C
- return name;8 K0 P8 B& [' O* i& i8 [7 t
- }
- e3 o0 }) [# [; `' Z
- S! F) x. Z8 f& t& \- public double getAttackPower() {: m1 p: s6 h; q$ V* `
- return attackPower;
9 t6 {' H4 D; G- _8 Z - }
# f0 i# c1 Z" x3 z$ x$ z( d7 C/ Z1 t8 b - , U! N$ n0 f) J' h: r; J
- public void setAttackPower(double attackPower) {7 M( V* T0 k& B# p0 G5 d
- this.attackPower = attackPower;* r' |! a4 A7 _% s4 z/ u
- }, e3 b6 w, d6 }; @
- }
. o% B7 g/ q: k. r
Скопировать код : W2 `( A( t$ ~+ O' r
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.& q& F7 ^3 }1 q
) S1 O$ h7 A! v# v- // Пакет org.l2jmobius.gameserver.model.battle# b# K. P( w% @5 L8 T# U0 c$ V
- package org.l2jmobius.gameserver.model.battle;
( ?+ |! ^0 e, Z9 \, r6 |
' K* o% Q5 h5 s" W0 Q" S- import org.l2jmobius.gameserver.model.actor.Monster;
U5 D4 M, H0 A; C- L - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;5 h1 O5 P' g* X8 ~( z( n
- import org.l2jmobius.gameserver.model.actor.state.FinalState;
, T5 j+ b7 d! U6 U - E/ o* g" T% `" ~$ e% Z
- public class BattleSimulation {7 o- K5 |+ r" @' h# s
- public static void main(String[] args) {' |! i( x/ e5 F* f0 u
- // Создаем монстра с начальной атакой7 e3 J% }& I t; V) Z
- Monster monster = new Monster("Дракон", 100);
) G0 k! c5 r; ?0 m9 ~0 _! e - & c, a9 ~: B( ?( U
- // Начальная фаза6 [$ J4 ]0 ] E0 |
- monster.executeState();
0 y6 X# g7 O: G9 i* h1 ~
8 z& Y* R7 w! }3 j( A- // Переход в агрессивную фазу% h) @6 c; g- o+ Z% q
- monster.setState(new AggressiveState());
5 f8 E2 a& D. Q - monster.executeState();
! _/ G0 K0 T& Z/ L. p
4 s8 |. x" M* m* h$ S+ r6 k- // Финальная фаза' b* e) c: F- o
- monster.setState(new FinalState());3 u9 P! g. Z9 M3 t
- monster.executeState();
) `. f$ _. S" T! z X3 ?3 L, e6 i! Q - } ~7 C2 ]" c5 d- l y$ C
- }" L: {) f0 D( R+ g f- `
Скопировать код 9 U. \* L4 z! i1 I9 h6 L. J
Комментарии по структуре пакетов и классов:" o) h3 U) ^" B0 Q; L1 V" R
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
1 c- f( _7 c2 v* ^7 ]! {2 n ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
/ \) J1 k0 D; ^* M3 t/ eЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!0 E2 O' y7 U* x% M, h" C6 e
+ V; g' H- ] O: A2 H
$ ~# f& ~2 g6 j; Z7 j& B2 L5 q* O! V% x. x5 O& j8 _( L
6 k# {0 n5 P: @: g9 N
2 v8 Q2 O: z, m: u( C/ ^+ u8 @: D! G
& b6 k6 {" O* Y7 \( P$ A
& E4 M7 U& x: }6 a5 p& f3 _
+ O, x; T5 L( z) i4 B
# Y+ J7 e F- k/ b2 A3 r0 u
8 O5 j) N+ _' I% V5 c
- Y; \+ M ]6 |( D$ U' q" B, z, ^2 `0 N S
5 g8 D9 a% O/ X* i0 H# ^ |