Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 5 j! b! g2 N7 T/ M
, K( x2 n$ P1 A$ g- z4 PЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.6 j j5 [; X- L) u! A
1 }. V: }& {7 w M7 d+ i4 z9 uШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.& f! S# } y( N& v2 `
# e4 F: |! R5 F- R. C. N5 g( `8 k
- // Пакет для состояний монстра3 \& v, h4 U1 l$ b
- package org.l2jmobius.gameserver.model.actor.state;
& | V( ^" O* }) S2 H - 7 `# A! i* V% d# A5 ^% H$ i4 `
- // Интерфейс, представляющий состояния монстра
/ J" H4 l% N# f# R9 ] - public interface MonsterState {( L7 ~! Z* w6 S. T% M
- void handleState(Monster monster);! I! \) ?) n7 j3 d) D/ N
- } o8 I5 ?6 Z1 d! K; A" U/ A) F
Скопировать код
2 M+ z! P3 R, D* F7 [# v3 KШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
0 i1 I9 h* x' A* r5 e$ M, n1 z6 _" R
; \+ x5 c; B4 T6 E4 j8 HЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя., F- C5 P/ p+ _ S) g1 \
! N) c; Y! G. B, U$ e) [7 J3 b. u- ^! s
Класс для начального состояния монстра:2 B" D0 a2 i; t' E j
- // Пакет org.l2jmobius.gameserver.model.actor.state4 L/ _) m( X! N+ Q& q, k
- package org.l2jmobius.gameserver.model.actor.state;
; o: [! i1 e* o* O" P- g
5 K& C$ u# z' z1 j) a- import org.l2jmobius.gameserver.model.actor.Monster;3 p; [2 B% f+ \' c
- n. K' b) r8 f4 R) F! `
- public class InitialState implements MonsterState {
# \) O% |9 R3 P3 G, V4 P3 P# g - @Override
0 z2 v9 Z" e' b$ q( i - public void handleState(Monster monster) {. g5 M/ [7 _) S* I
- // Начальная фаза боя
9 S/ l) p3 |7 j" A# V - System.out.println(monster.getName() + " начинает бой с обычной атакой.");
$ x( E& g/ P6 e" s. E - }
+ d+ d8 S3 H/ O6 s; g4 ? - }; E* r% g) S4 f/ h9 |8 D+ C
Скопировать код Класс для агрессивного состояния монстра:8 H4 K$ C# X( T) l" h+ G
- // Пакет org.l2jmobius.gameserver.model.actor.state
2 f9 m8 f. Z- ^2 W0 e5 m2 f5 t - package org.l2jmobius.gameserver.model.actor.state;5 ^6 V8 F: s9 N1 t! V7 f
0 D9 S6 O: G) v/ E* @- import org.l2jmobius.gameserver.model.actor.Monster;5 y! y. B& t2 C. S/ r$ _1 ]
- . x" N! U# J/ N$ o
- public class AggressiveState implements MonsterState {
3 U: ?7 R: E( Z& ^ - @Override
) Q# c7 m- k! n# s; @' n" o+ @ - public void handleState(Monster monster) {* l F- ?$ e# |
- // Агрессивная фаза боя
1 g8 }' c& ^3 M% l$ X6 P1 C - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");" L0 b Z( P" z: u% P
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
' @0 q9 p5 l0 F) ` - }2 D( V) p9 F3 F
- }
+ H8 _1 l1 E5 d0 s* M
Скопировать код Класс для финального состояния монстра:
& H( K* t# c6 P& }9 c% C) h' H- // Пакет org.l2jmobius.gameserver.model.actor.state
! f! d% B4 `: Q0 ]( F2 z - package org.l2jmobius.gameserver.model.actor.state;
7 {2 Z' u$ n8 V- F' Z6 @- x
* y+ @0 z) H4 Z- import org.l2jmobius.gameserver.model.actor.Monster;! l4 c% N% x' i; ~9 }6 [! l
- l# K4 q2 a8 }9 }6 z" W- Y" c; ]- public class FinalState implements MonsterState {
; y9 }* m. s+ H) W( P- {) k v( f% J - @Override
$ i# W0 U; k' R3 h8 L - public void handleState(Monster monster) {( z3 j- m0 V: t; k
- // Финальная фаза боя
& u' D: b* P8 b/ a( _9 w% }; ] - System.out.println(monster.getName() + " готовится к финальной атаке!");
) V E! N' A. V) P" K+ f - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
- w, |( b3 U9 R) {) O2 i% w: m) b - }. \% E% W. ]( i5 o% ~; C ?0 T
- }
8 y% x- c+ x, f, s; R& R
Скопировать код
& N; t; ]7 @6 g S) oШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
: I8 H* |* M' G+ D" u* }- // Пакет org.l2jmobius.gameserver.model.actor' s. a3 B4 G" j
- package org.l2jmobius.gameserver.model.actor;
/ B* A/ N/ F1 L( @2 M/ r - $ ]- w: S O1 d: J& n* A: i
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
# |; T8 `/ u6 w$ L* U& r5 W - import org.l2jmobius.gameserver.model.actor.state.InitialState;& n1 C3 G% i0 F$ l$ \
! k/ {0 q( L( V" o( O- c( q- public class Monster extends Creature {
) B& m, y! \8 w# `$ z - private String name;
7 F" `! p) G; b - private double attackPower;
( t" Y! c: `3 r2 g6 w5 K - private MonsterState state; // Текущее состояние монстра
" X3 r: [0 H$ O0 Z" H/ f5 m
2 r' C2 [: J2 Y9 L* w6 P- // Конструктор монстра6 T( l# Q6 H( j$ t& B
- public Monster(String name, double attackPower) {) T6 \6 @7 m( t
- this.name = name;7 \6 K2 M- i" z" l
- this.attackPower = attackPower;
& m; U- b" |: l$ j* [ - this.state = new InitialState(); // Устанавливаем начальное состояние* ^9 z! ~1 I6 ]
- }
2 {* w: M/ ^( M: H$ _1 o
5 K( z% r, ^9 J# [- // Метод для смены состояния% x; {5 ^, N8 C1 d4 J: E& c' a
- public void setState(MonsterState newState) {
# b3 v8 J* J- u% A! G1 ~! @% y - this.state = newState;
2 X G& F c$ K2 q$ { - }. p, }) e* q) w' F% S& V2 r
- 6 ?9 |9 W5 t' a& E6 W7 S
- // Выполнение действий на основе текущего состояния
' Z8 }3 R2 @: n2 U+ _ - public void executeState() {
. }0 q0 u0 @# C/ M- T0 ]$ H - state.handleState(this);
4 B/ f) \- w' R/ ] - }
$ h; p9 A' P& j6 J7 H- R; x
* w$ I+ t# k3 h- ~$ L+ i- // Геттеры и сеттеры" t y4 c$ H5 _& c9 \! U; K5 z
- public String getName() {
( u+ M! a K) c) M5 o, O! m - return name;0 r4 R# `$ _# e* _+ O
- }
1 W- K4 t* n) R f" u3 { - 2 W' u: m$ \+ `' Y: C: V# c5 }$ x
- public double getAttackPower() {8 I: {( A% c4 l
- return attackPower;
% E8 ]! h2 n) S/ P' _( v0 u/ F0 c - }
4 }! n0 S x: L9 S5 k+ f
4 I7 J. h9 F9 i- public void setAttackPower(double attackPower) {
% Q2 |! g- ]2 D3 e5 r, } - this.attackPower = attackPower;0 r7 h- D, s0 S" ~+ c1 c j% T
- }0 m- _9 u9 U: F7 E0 a! `
- }
' G$ Z1 X" o4 n; H0 ~# v
Скопировать код
8 P ] l6 w1 L' dШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
| k0 C7 X2 M8 a& m! m9 W! J: [1 i, Q4 n
- // Пакет org.l2jmobius.gameserver.model.battle
, \0 ^- \# b) F+ V0 |' S - package org.l2jmobius.gameserver.model.battle;" t; N3 c* e, H, g
/ N: |; H c2 \- import org.l2jmobius.gameserver.model.actor.Monster;
3 F; D" [" i. H( O! g8 q# X: }/ l - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
3 D5 W! z. t1 s- \; f# u3 o5 k - import org.l2jmobius.gameserver.model.actor.state.FinalState;
' X5 y$ e: n6 W* u. y - , \- J+ V+ @* Z( ~# z; C( x4 a! W
- public class BattleSimulation {
, B* k, ~& w# g7 i - public static void main(String[] args) {
3 j* V" ]' p3 `* {* Z - // Создаем монстра с начальной атакой0 \& x Z( N* l" d% L' ]
- Monster monster = new Monster("Дракон", 100);
9 r3 b0 h: R. K6 l( b3 m. y6 H - ! M% n2 Z* H2 k" \( C3 i5 I
- // Начальная фаза: X k4 G3 ?5 x& n& r+ f, E" T
- monster.executeState();1 O( L9 z& d) k @+ I5 t
- & c M6 Q1 Y( G% Y: g: L5 A# u
- // Переход в агрессивную фазу' o% b- e- t3 ]7 L. x( Q
- monster.setState(new AggressiveState());1 A8 ?8 E/ H9 c
- monster.executeState();
! x/ W/ ?1 [( r; J0 b& j - ; |2 L* w$ A# I" P/ X. c8 }# _
- // Финальная фаза
1 J$ H6 `% Y2 K7 U3 t1 ~) H- s" g - monster.setState(new FinalState());: y; G. g+ j/ L
- monster.executeState();
0 K6 G' D: d9 g F4 I - }( d$ n7 x0 T# J3 m+ z1 D' _. S
- }' l7 j. z# I5 B
Скопировать код
% v- F+ ]( Y( t% s$ R3 ^4 VКомментарии по структуре пакетов и классов:
, ~4 ]4 U6 r+ Y- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
, G! f& O& N* w+ F' `" T1 h$ ?$ O4 ]7 ~ ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
% H& I% c7 j- S$ k! Q9 TЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
3 @% A* }, R) N( s2 y+ R6 h% k" z) C; n ~# M4 U
! u+ S+ B# l7 f# x
5 D6 u3 m" q( J- ], ]3 f. m, X# P% X7 D- \" T# g% T* E7 w" b0 Z; O A
; _5 v( ^: ^( j! z+ `* T- x2 k( g# I t. P
/ e. X+ o/ U2 D( w( h. B
2 P) [! [' p$ }' M4 m1 Q5 H9 l/ N! i8 d. R R
% e/ e$ g1 i" M# {1 i& i7 S2 i$ K, n
; Z/ R. G1 j n5 u& ]: E2 j z7 J
9 Y* J S& a6 q, ?# J1 m7 \, J1 T9 K' Q
|