Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
6 y/ s9 @/ ^. g7 ?/ A' m% k: x! u/ l+ ]( l
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
( W* g9 _" a4 W% L1 \ @- H8 y0 m2 p
# H7 W$ e" v) H, uШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния." c: H* e$ a( q* k# G: @
$ u \/ q" q1 ^2 {0 X/ v
- // Пакет для состояний монстра% |+ Y) y: B" C2 y; ?
- package org.l2jmobius.gameserver.model.actor.state;1 d' f- s9 X v9 O3 L
- 1 m: I% ?2 N; }$ y5 y w
- // Интерфейс, представляющий состояния монстра
3 ~* x# w2 F: L, l/ g7 g! J+ L4 }4 e - public interface MonsterState {
' }4 ?6 S1 K/ h - void handleState(Monster monster);0 `. f! n8 S# P
- }
% e+ M! r, Z+ ]8 f
Скопировать код # G% V# K: t- x, Y/ N! v- Z) u
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
* y$ h. [4 E& G7 R% k6 k1 K/ d. r% i5 F2 r' A
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
4 I9 k" K; w3 A9 H g/ y# K2 ^, {" p+ C4 \3 X. i
Класс для начального состояния монстра:' U7 k6 D/ G0 O# H
- // Пакет org.l2jmobius.gameserver.model.actor.state. Q: j. g: T. S, P
- package org.l2jmobius.gameserver.model.actor.state;; A, l e$ ]3 c, c$ _" E* y
- 7 ~( _6 w8 [" m3 @
- import org.l2jmobius.gameserver.model.actor.Monster;1 Z0 G$ \' Q" [4 P9 C% `0 |
- ) m* J8 _1 }0 U$ d8 K% w
- public class InitialState implements MonsterState {
9 {; L9 |$ v8 q7 l6 s& K - @Override
$ p0 Q9 q2 C( \+ g1 U4 W0 H - public void handleState(Monster monster) {
) `- [- h) ?2 z7 u - // Начальная фаза боя% ]' {2 ?2 T4 x* `
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");
1 ]; g. ^* N# T" { - }) l. ^2 f3 I& O- V, j0 ]! [$ E
- }
5 i% ^- k& [2 b
Скопировать код Класс для агрессивного состояния монстра:
6 g' e3 m- x% K- // Пакет org.l2jmobius.gameserver.model.actor.state
' n) z% E1 W8 M. ^4 d% f - package org.l2jmobius.gameserver.model.actor.state;; f) }3 h" M" V
- . I5 f0 |( k8 q2 [2 o
- import org.l2jmobius.gameserver.model.actor.Monster;
2 } Z4 {3 w/ M; c) i
% ]4 @/ }0 q7 ?0 k; N- public class AggressiveState implements MonsterState {
' t' V0 G. z8 O" M# a - @Override5 y* r0 K5 B' g5 U9 i6 ?- d/ l
- public void handleState(Monster monster) {
: ?; o* O0 K6 V1 G - // Агрессивная фаза боя
3 U7 Z( i* T* _- `" Q; X. u: o - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются."); O, D: c! r- w* t9 l9 E$ _# f/ z
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки. {/ L! h r1 ?; N% K+ V
- }
5 f9 W$ a& c9 c: k2 {9 L - }! j' L$ {! ~2 \! j; O$ p
Скопировать код Класс для финального состояния монстра:
$ ?! H4 r+ ]2 D( S' H6 F- // Пакет org.l2jmobius.gameserver.model.actor.state$ s: _" Z6 Y8 N) z- x% V) v
- package org.l2jmobius.gameserver.model.actor.state;
5 p6 U5 v1 U) f' ?. t# ~
1 ^2 @+ f: [/ R* A# W- import org.l2jmobius.gameserver.model.actor.Monster; Q- ?' \9 `; d
Z% U$ M) A( Y/ m8 y% \- public class FinalState implements MonsterState {
3 y3 F2 R. n9 V$ o5 d6 q! X) k - @Override
/ ]! w/ B( Z+ B( _. E - public void handleState(Monster monster) {/ F* N, p" p! @0 Y5 T
- // Финальная фаза боя
g4 [3 K2 j( ?5 m/ A - System.out.println(monster.getName() + " готовится к финальной атаке!");0 S" D. [$ N5 H3 s- r, D; r# H9 l
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
0 D6 S7 T! z% E6 _" j - }
) t" g, b5 a8 A% g1 K- C6 w - }
) C, F* r5 F2 E1 J. p0 I8 U1 w' ^
Скопировать код
6 _& K( t& H; Q4 x5 NШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.0 O( L' E2 m' n
- // Пакет org.l2jmobius.gameserver.model.actor
: j( T+ f" M$ ^2 f6 y/ C - package org.l2jmobius.gameserver.model.actor;
A+ N4 y! t$ N7 M( B2 x1 c
3 b4 v+ P# `7 p! N- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
: U2 F, a" V) m3 m6 K! ? - import org.l2jmobius.gameserver.model.actor.state.InitialState;/ W6 V9 ^+ a) G; `
- ; X( J$ O+ [1 u T0 A4 K, A
- public class Monster extends Creature {2 a! e- a/ D. g$ S( E5 Z8 \
- private String name;; T ~6 |1 s; H w# x$ S# J
- private double attackPower;. i+ H3 ^! W0 O/ Z. r) n1 \; S
- private MonsterState state; // Текущее состояние монстра
$ I4 M& x( T! o* y% g, X - 7 z. S* W; f9 v& n% S
- // Конструктор монстра
/ P) b( [- x) I# p* m8 y - public Monster(String name, double attackPower) {
) I$ j" l; }4 w( h; r; Y3 Q) P - this.name = name;
- W( W5 V% U$ t- c& K9 O - this.attackPower = attackPower;
; b7 m6 v2 v, T a b+ g - this.state = new InitialState(); // Устанавливаем начальное состояние
! c! f! ?: A* f; {( ], [ - }, P* t* g) O+ o: C1 U
- ) Q) l: }- `" K4 s$ z1 ]
- // Метод для смены состояния- A4 {* R; }) V8 h% V
- public void setState(MonsterState newState) {
* W8 _( ^6 \) i! P5 _. ^( X+ x - this.state = newState;& `0 j% g+ u3 l' y6 E8 b, S& G1 `! w& \
- }
+ r6 F. V+ v4 ]5 n" G
8 g u P+ k% e! {' S% e, N- // Выполнение действий на основе текущего состояния
( Q' `* W$ H3 [; T8 M - public void executeState() {
4 F7 q9 M3 N2 a& A6 G - state.handleState(this);+ b( T9 C- ]! J4 E9 Q
- }$ F* C. A% d, _7 k
! t. h5 i! P5 y9 N- // Геттеры и сеттеры
6 h1 y( b M; {" J7 _5 U5 h! V - public String getName() {
8 y: q7 R- Q% U5 `- i0 w - return name;2 h3 c; \* \/ ~7 `* ]$ t1 b/ y
- }" u( ?- u0 ^" ^- _/ ~ M
- 5 X a% x4 ?9 N* c; Z# a+ |0 ^
- public double getAttackPower() {
4 L+ }3 ?; ^- v/ A7 ` - return attackPower;
% b6 _# u! n5 Q. t# c - }
V/ a/ L% S3 {% j+ T0 l3 c - . Q) s0 R- e0 t4 y" F I4 i
- public void setAttackPower(double attackPower) {4 U$ M( U6 m3 @5 {" Y9 s8 C4 l
- this.attackPower = attackPower;) Q: T; K6 r% m- K, f8 J
- }
- h3 T( Q" u* ] a# E8 v2 z- x" s+ N - }$ S' V3 g2 F' `/ A; T
Скопировать код " ?& j3 H/ `4 `$ Y, U+ e1 T, {) V
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.: r3 N. i9 Z0 Q4 j% K _! Y" m' w; c
) q$ f6 m7 i0 C9 v- // Пакет org.l2jmobius.gameserver.model.battle
4 Y( C6 i" W7 Z) x6 K - package org.l2jmobius.gameserver.model.battle;
, A: G% V. `! ^$ S7 `* t' u- I - ; I5 O! r5 J2 c
- import org.l2jmobius.gameserver.model.actor.Monster;% R/ L) ^ x# x( Q2 |
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
7 ~- O5 n4 p7 z2 V/ l" {4 | - import org.l2jmobius.gameserver.model.actor.state.FinalState;3 L3 m$ c4 x/ E; j5 o! U
, o) P2 X4 O& Z0 S2 n Q% U- public class BattleSimulation {+ \/ v5 E- w& X: l
- public static void main(String[] args) {6 H( b" h) @4 j l6 u( ?9 I
- // Создаем монстра с начальной атакой
. N4 t$ }6 C, f- I+ U+ K5 A - Monster monster = new Monster("Дракон", 100);
$ v [6 G- `& e6 V2 ^ - 3 Q. Z; d" m' B3 ?: j
- // Начальная фаза; R0 x5 G h# k: }- n" j
- monster.executeState();
$ B* j& Y+ C4 v - ! z8 x+ [7 v* {1 c: b$ s9 w
- // Переход в агрессивную фазу
3 c! v& J& l! y% E0 P0 Q - monster.setState(new AggressiveState()); {7 k/ Q* u$ u; l2 O
- monster.executeState();0 h5 ]& O/ p# \( {0 P- Q
- * M$ A& v3 t' |5 L* K+ f8 c# K$ r
- // Финальная фаза7 _0 v! z9 U% r' r! s
- monster.setState(new FinalState());
6 k% G- v# y. W( i - monster.executeState();
; ?8 N2 f! X! M( t- F - }
2 e* }, i! b5 H$ D - }; v- p4 k* X1 u8 b) S) Y
Скопировать код
3 r( N0 ? u. k! zКомментарии по структуре пакетов и классов:
9 |, G( ?2 n# J; D/ L" B) W- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
9 U) D% j+ X8 l& {2 {% t; a ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
0 K* R1 B" c# J7 U: }9 dЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!( g% X, a2 k8 H N$ Q( c! m: |
7 t, c8 V1 o/ K O' X
6 B2 K; f" d) |( C Z# Q0 X% w. q5 f! o, l
2 t& S7 v' g o6 |7 _6 |0 K
9 ?& @* t! K1 _" A3 o5 y! }
1 ~9 l: z7 n, T6 y3 z; _# B
. _- l' w9 k E* A' v! m& h) m4 b' t+ U' u# k
& }9 K- X3 G6 N
6 x) c% U! t9 r
6 p+ D" D; {3 S; l
`. }& l% i5 i
# Q! @. C/ e6 d0 ? q0 ~/ r
( [5 T1 ^: p0 n0 t+ `4 q
|