Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). $ N, k- E. T7 ~9 W) {
; C2 v+ m( D8 S3 R
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.2 v Y/ s& ]! s! I0 w3 M
3 a" n& U- _- r7 xШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.% [( q: Q) G$ M2 r, J7 u
0 V3 k3 a; m: K: I5 S4 p- // Пакет для состояний монстра
8 w* e8 m0 @1 ]& n0 S6 j - package org.l2jmobius.gameserver.model.actor.state;
$ g' `7 ?- S- O
! K' o6 y, B v( \" Y- // Интерфейс, представляющий состояния монстра2 f1 b0 ?3 `% l2 F$ c
- public interface MonsterState {7 t" K5 {; r8 x0 q# W
- void handleState(Monster monster);
" ~, |( u" E+ t. W2 B6 U( I, I - }
# X4 S$ s: M6 |0 C9 c- ?/ x& G9 O
Скопировать код 0 q$ E7 u7 j# M' W) C/ ~8 o1 o
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. ( U& E, W+ ~. \6 g, T
1 Q' ^% o: u! A; t6 V) O1 zЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.5 Q" y4 L& P/ \; j/ _
7 V. g, W5 O. ?' r, ]Класс для начального состояния монстра:5 g! W4 M# r j7 M1 d
- // Пакет org.l2jmobius.gameserver.model.actor.state8 h1 S; a& f$ _5 r. P
- package org.l2jmobius.gameserver.model.actor.state;% j% P# { M& T: E- q2 n$ e
- ( P5 o$ r% A, ~
- import org.l2jmobius.gameserver.model.actor.Monster;
6 P" r8 H O4 E) n& y0 Q
" ~. B0 i @3 b. {8 p9 X- public class InitialState implements MonsterState {
# P) }! x2 k0 a - @Override! K' O& z8 P& q& o: A
- public void handleState(Monster monster) {
) u% l1 |+ ]( R1 D+ }+ l+ _* p& D - // Начальная фаза боя+ N0 f [1 j4 R2 v
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");
8 h$ z# M5 X' U# O) B - }9 }; B& b2 U+ w% x' a. d! @: ^$ I
- }0 v7 V4 W! J9 m9 T' Y1 u8 @
Скопировать код Класс для агрессивного состояния монстра:1 n; F* n M, g7 k
- // Пакет org.l2jmobius.gameserver.model.actor.state
: g( K% h8 m6 V! x - package org.l2jmobius.gameserver.model.actor.state;
2 B; v' T8 q* [ - ) F; E) v9 c* J5 @7 u" ]3 Y
- import org.l2jmobius.gameserver.model.actor.Monster;4 U4 l% [5 w1 i. P w* r
7 Y8 ^" q) J% h% Q; v8 ]3 {- public class AggressiveState implements MonsterState {
& s e: {" Y$ y% K0 I. | - @Override# K# O: d; p' N: i3 D `% S
- public void handleState(Monster monster) {
4 U0 C2 ?1 d5 e$ [- A - // Агрессивная фаза боя/ m( J2 P4 d0 k5 l9 M" g9 d
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");; S/ Z2 x8 ^3 h& F
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки: e: _! Q/ @- {" y5 \* t
- }
. A9 V/ f. S' h8 _' h! j. l - }
5 n, P, V( S1 t* D4 \
Скопировать код Класс для финального состояния монстра:
9 W! @) S* r5 J0 w0 l+ ]8 g, f# Y- // Пакет org.l2jmobius.gameserver.model.actor.state
4 V0 r: I! V: C3 Y0 i6 B - package org.l2jmobius.gameserver.model.actor.state;
( U, W, Y/ v& _! ~- K1 D& ^7 c. [
, E6 ~! T! ^4 v1 ~ D) ]$ q- import org.l2jmobius.gameserver.model.actor.Monster;
! p! F2 N+ R, ` - . ~- A( }- k7 y6 h3 M& P1 R9 q: M
- public class FinalState implements MonsterState {
0 _* e/ d3 q0 Y# P5 M" p - @Override
6 P# ^& f e0 E! [" c$ @. o - public void handleState(Monster monster) {6 O5 [$ q3 N* K9 e2 n
- // Финальная фаза боя9 T, p! a" t9 u( K
- System.out.println(monster.getName() + " готовится к финальной атаке!");
; L6 }% M9 O0 D& x D4 z0 {5 S+ x - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки$ B$ a5 D( }+ t" ~. |: a* V
- }
9 ?1 K+ a" A' s0 k/ d; | - }
( P0 L, v7 e7 y7 U
Скопировать код . E8 n4 l: S( b ~5 l3 v) _9 _
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.& J% p' b- C; i
- // Пакет org.l2jmobius.gameserver.model.actor
& T5 j& n- u/ x$ ?2 a# W" \6 g - package org.l2jmobius.gameserver.model.actor;' `. @6 `5 N( R
( d8 ?( q$ Y) ?3 h- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
3 Y F/ U3 q2 Z/ K% u - import org.l2jmobius.gameserver.model.actor.state.InitialState;+ U1 P: z3 R8 |8 V v" v0 W
- % D2 H( h/ O N+ F- Y& Z! h% \
- public class Monster extends Creature {) m% `! s- A1 k. x# P% |: U
- private String name;
. ^2 w. P* _. b5 Z- U, J ~3 J( d - private double attackPower;4 p1 \" g( }/ z( d/ D, N
- private MonsterState state; // Текущее состояние монстра
7 a) e/ t+ F8 Y$ [/ v
9 s% P* A1 J, \4 Z4 s* e6 I) c- // Конструктор монстра
; _5 [7 Q, ?2 a( p - public Monster(String name, double attackPower) {
, h8 c8 E5 D0 g9 @4 i: E - this.name = name;7 V' Q; }. {" K0 {+ b9 J* \
- this.attackPower = attackPower;
1 [8 O8 C$ @. t- B" b% H" F - this.state = new InitialState(); // Устанавливаем начальное состояние
/ }* O* p4 A# Z+ s! s o9 z - }
$ _: R) Q; J$ w: f - * b3 _4 k4 |" T
- // Метод для смены состояния8 q4 i2 E# B1 v/ O- w
- public void setState(MonsterState newState) {' S0 K, j: r+ h$ S/ d& z
- this.state = newState;1 A* _6 p2 J: q+ c, S' k, m% b7 u' {, {
- }5 X) X- s9 g% [2 c% f, c
/ t- y+ x" M' ` R- b9 @- // Выполнение действий на основе текущего состояния
$ T' p2 W- |5 E0 F# B6 s - public void executeState() {
% R4 U- s$ ]' r0 ? [" B- X - state.handleState(this);6 o& o% a2 c- k# w( d m9 F
- }' i8 W) J% K. O% g
- ! T! A$ A7 ?( Q; T& ~9 p
- // Геттеры и сеттеры! X. J# p4 O C5 k7 h
- public String getName() {+ r7 s- T! Z+ V8 M0 a1 Z( x
- return name;
: R X8 \" F/ P# a - }
3 ?3 F% k _3 a: F: L - + n' U: I* |# \0 {2 M7 @7 P! ~# F
- public double getAttackPower() {. l' W) w4 @& S/ v4 V
- return attackPower;
! M4 U$ l& j ]3 p1 Y - }9 D9 B+ P8 z+ n1 Y/ Q/ x( B7 V* x
5 T- `3 ? k! @+ A0 Z7 \- public void setAttackPower(double attackPower) {( G0 _3 F$ w% W
- this.attackPower = attackPower;
, @! M: I7 _" M - }. b- s1 ~! n% d/ u# t/ C; e
- }
6 f: @' s* ?5 d
Скопировать код
; @2 D- v3 |. S; JШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.2 Z8 M2 P" F; h" E. x. b% t1 Y
0 f- Q' L) c2 m( x$ v `0 i
- // Пакет org.l2jmobius.gameserver.model.battle
1 I0 u+ Q0 {( y. ~/ U' A5 D! P - package org.l2jmobius.gameserver.model.battle;9 @5 }: y' d" m0 @- |7 K. P
- ( H8 g1 ]- x& b
- import org.l2jmobius.gameserver.model.actor.Monster;
$ P0 ~) W* o" q9 ~9 m6 M - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
) _" G4 U" s' t9 d' F* _! { - import org.l2jmobius.gameserver.model.actor.state.FinalState;
2 h# K9 L4 j, d# S! Z7 P - : z4 u: F. E" t: ~) E
- public class BattleSimulation {% Q+ J% [; j' x3 f' c
- public static void main(String[] args) {
8 B7 e3 {5 u, c - // Создаем монстра с начальной атакой
8 _/ {3 m( B& r6 H& _0 { - Monster monster = new Monster("Дракон", 100);" W* ~. ]# M; d" g! S, g' Q
8 Q: G0 O; E! m8 y- // Начальная фаза8 w* Q0 S' B% M+ e% F
- monster.executeState();" U, ~' [4 V! G7 Q# u$ c
- & V b- m' Y7 v# c2 x0 d, V
- // Переход в агрессивную фазу1 U2 {( _1 e, f/ O6 l" q$ |
- monster.setState(new AggressiveState());
! N* E u! M/ {9 v& {# W% s4 I - monster.executeState();
1 z* ?) W. w3 ~ a
& H |, F1 W2 ]- // Финальная фаза0 j; c! Y+ X1 A7 f/ q* u5 j$ F
- monster.setState(new FinalState());
* e1 Y S# l1 A/ V+ a- m) ` - monster.executeState();, ^% e' B. ~7 U+ L2 c
- }1 t' M4 d6 Q) Z" v
- }
. r) q4 {4 o7 v9 _0 F9 d
Скопировать код
; ]# _& _6 j! G0 K* Y7 DКомментарии по структуре пакетов и классов:
' |; t5 s' p5 u+ I) t- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
6 y" L4 D" S# {$ E, ?$ K ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.$ P* e3 P9 C8 h+ l
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!: M( E' P4 L9 T( @; } X
$ t. F6 k" Y1 q. @4 X& u: v4 N$ r! t4 x
$ `/ W8 C4 [! q6 D$ u! [3 [
0 `& [( b3 ~4 D4 a0 V5 @3 ?! S& r+ a, `! L, e2 }4 r/ Y
% f' f2 q# j4 l7 a' N p
( \$ s& s) F1 U3 V- \/ C h3 F1 N+ ~7 v) e. L7 i5 H* f( Y
5 d' M0 V, L! Z4 k; S2 _ ^
Z5 s/ ]( @1 R% S' m3 i/ W' w2 j- l+ i
" e- A+ n/ n7 [5 J7 C- {
8 u* J, Q, d& l7 U0 v k1 w
! z5 l& n, D9 Y; |4 n. p |