Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
$ s. |7 @, E$ }8 O4 {8 C/ j7 w0 F4 ~8 T6 W C& t8 j2 I
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
. k4 |' R% u4 `1 \
* Y$ t. e( w$ Q! K' l7 MШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
" K* A% ?3 o6 Q, z: |1 }/ g3 g" a( ?8 c# R8 t/ O
- // Пакет для состояний монстра) d: ^6 ], y2 B! w$ ~
- package org.l2jmobius.gameserver.model.actor.state;7 h. e. d' o! l
. _" k+ k/ y& I% p" T- // Интерфейс, представляющий состояния монстра; G$ _* H( x8 ], X0 V
- public interface MonsterState {
' v H3 K c9 Q, e. Z8 v0 I3 e - void handleState(Monster monster);+ `" o% y: p$ Y2 p9 g' y
- }+ M7 Z' H. B7 I }/ [
Скопировать код 6 C" z3 O, D7 E* U& L2 [ d4 v
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 7 o) L( k; a9 Q7 i
3 S; m: s. w* ?: K2 h' P1 V# P, z
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
1 M: @3 C/ _$ S& L, [- ]3 M3 O6 ?- X0 l: M* b1 Z, y
Класс для начального состояния монстра:
2 y D, m. S8 E- // Пакет org.l2jmobius.gameserver.model.actor.state
5 S) L8 n, y6 g6 _ - package org.l2jmobius.gameserver.model.actor.state;
7 A! D" Q1 _% A: _( T7 X6 d
2 Z( a" T1 W6 f; @- import org.l2jmobius.gameserver.model.actor.Monster;
( v1 p# R% O+ a Z( ] - ; R- E5 r* E3 _& ^
- public class InitialState implements MonsterState {: U& H, S% j; m1 c
- @Override) M3 }% P& W$ P, H* o) Q9 t7 e
- public void handleState(Monster monster) {0 \ q. ?$ _8 ^; T
- // Начальная фаза боя
) ~9 f, g5 L$ F - System.out.println(monster.getName() + " начинает бой с обычной атакой.");
) `" o/ H6 Y5 l7 E6 I - }
3 }( [% g$ N4 s6 l' s S - }
3 c& f7 T! K! q4 _7 q2 k( `
Скопировать код Класс для агрессивного состояния монстра:! U2 u4 ?$ D3 t k& p. B
- // Пакет org.l2jmobius.gameserver.model.actor.state4 V) G: ^! g- H) \
- package org.l2jmobius.gameserver.model.actor.state;( O' Z3 j; x% E9 A+ w
- 7 y- Y+ P& a4 l$ K# B
- import org.l2jmobius.gameserver.model.actor.Monster;3 Z! ?% h, \$ @* e6 s" T/ B
- ( v# S% }+ K; N: N4 |7 Y8 [
- public class AggressiveState implements MonsterState {1 ^% b8 U6 ]6 o# x- Z5 S
- @Override' R' _$ h* H) `4 I
- public void handleState(Monster monster) {( T) v k) {' `
- // Агрессивная фаза боя3 `: i& \8 W' U( z. w
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
2 h) I* ^/ {, B; w, B - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки1 ^, k8 Y8 r7 ^1 E! d% x
- }
& Y4 v: q! p1 E2 L - }& }& Q+ a/ J9 w
Скопировать код Класс для финального состояния монстра:5 w" r) K! B- @6 G
- // Пакет org.l2jmobius.gameserver.model.actor.state
' O+ q- F1 b+ L0 f* D - package org.l2jmobius.gameserver.model.actor.state;
" J9 i! K% _7 F% \ O
& n% U! A" p. x* K) Q- import org.l2jmobius.gameserver.model.actor.Monster;8 P1 z* Y+ g V3 X
- 1 K+ H. I: [8 |( c
- public class FinalState implements MonsterState {
5 G- T) E0 c; p; S/ @; }1 P0 e - @Override6 q" z0 L" o' [6 u& p
- public void handleState(Monster monster) {; L5 p8 l- W2 A1 T0 n
- // Финальная фаза боя
, a3 \( Y+ A) y# E0 z2 E' }7 i4 Z - System.out.println(monster.getName() + " готовится к финальной атаке!");
( S. a6 t4 d& N4 ]. [7 v - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
2 y# l+ p9 ^( y* K9 N - }/ }0 v; O4 C+ C: h
- }1 c% G V7 y4 x, }9 P
Скопировать код / W3 g5 O( G9 n h
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
+ u" x5 V) ]; Z1 S" }& E5 g- // Пакет org.l2jmobius.gameserver.model.actor$ I% a4 v1 J/ @# e+ R
- package org.l2jmobius.gameserver.model.actor;
0 ]$ v3 E, [8 Y! O+ ]5 s
9 s$ l% p$ S0 S% R$ M- import org.l2jmobius.gameserver.model.actor.state.MonsterState;" D% F0 n* q8 }9 r
- import org.l2jmobius.gameserver.model.actor.state.InitialState;
2 W. Q. C5 R) c - 9 z# J% `' M* [0 p0 ? ]2 ]9 `
- public class Monster extends Creature {8 t# l8 E( c" M! a: Z. {* S
- private String name;, z2 u/ [: d' l+ p4 H
- private double attackPower;2 A: S2 M! n V0 D& e
- private MonsterState state; // Текущее состояние монстра
9 Z7 @! }0 @* T2 |# o
9 O: u- m) K6 Z U+ k/ m$ Y7 Q, l- // Конструктор монстра& w; u, e" D! W) }" K8 C0 @
- public Monster(String name, double attackPower) {. v% q: L7 Z4 C& f6 [- K
- this.name = name;
- L0 x# Z( p1 l8 i0 u8 B - this.attackPower = attackPower;
9 e" v6 O' r% }4 X4 D T8 }+ B - this.state = new InitialState(); // Устанавливаем начальное состояние$ E5 @+ t% I! u3 r; `0 q
- }
3 Q) `& O, p6 H$ j/ O( R+ n( C
" m3 S. k1 L/ N6 [1 z0 u- // Метод для смены состояния
4 g' l2 x& y: V. | - public void setState(MonsterState newState) {
! C/ k6 `7 ~6 q) C# g, U - this.state = newState;
( Z1 \8 V9 e" V6 H2 z - }4 ]) T V- v: O6 h& I$ e6 }
- ) O' }+ t/ \3 K9 H! i0 D2 G' ~
- // Выполнение действий на основе текущего состояния/ j: ]( G6 E, k( h; ?' a
- public void executeState() {
7 i( g: P7 d" u( o/ W - state.handleState(this);
) y0 I" r6 j/ U$ [; i$ k, @ - }" Q" t4 b% J2 h8 T" a( h
- ' d8 `, X3 ~3 Y9 J, F
- // Геттеры и сеттеры
* Z- q; E& f. [2 S8 F - public String getName() {" L' T3 {1 R, f% o" T, i" F7 @2 i
- return name;
- z9 G/ d! n! W( ]' |+ h& {- h - }
4 I4 o+ z9 s3 h4 X( y$ E f4 h2 Y% q
3 g1 o+ H' ]3 Q9 G3 ~8 D0 I- w- public double getAttackPower() {
/ e5 l1 C7 K+ ~1 K' d - return attackPower;
$ r2 k1 g% s% \2 P/ b: K8 m5 f5 C& [ - }
$ p8 ?3 v" T; i( N( p4 R' G - S$ o" H1 I Z" N2 u. H
- public void setAttackPower(double attackPower) {' P7 A O. W; I6 a, Q6 k* u% F" L
- this.attackPower = attackPower;/ S/ {' g4 w8 P3 B. a* F M
- }
2 ^) V+ f, N6 t- F; m - }, l5 a4 |3 |9 l1 t6 q" X0 _3 Z/ d
Скопировать код
5 X6 H) f. G) k1 P2 B8 ?5 MШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
5 F' y' z0 o+ k0 ^# m& j) X c4 Q: G- A, g( w) p7 E: Y+ m
- // Пакет org.l2jmobius.gameserver.model.battle+ N! w/ T! @$ E& g Q ]
- package org.l2jmobius.gameserver.model.battle;3 ^0 s( J' Q+ z+ u' u
- 0 t1 ^8 W1 v7 d: M
- import org.l2jmobius.gameserver.model.actor.Monster;
4 l9 x, z8 K5 k# X - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
! X5 E' Q1 z6 y2 A) Q4 U - import org.l2jmobius.gameserver.model.actor.state.FinalState;
- u/ J! R( n; s( s/ O, Q, L - % x3 d7 k$ Y) v: o L
- public class BattleSimulation {; B7 c ~" [( F1 P
- public static void main(String[] args) {. X, v7 H! {6 J/ J( D {
- // Создаем монстра с начальной атакой
4 v/ R! E0 i" _3 p- ]# \5 J- e) V - Monster monster = new Monster("Дракон", 100);( `! E$ q" a) x& ]# i, {' }! L2 t; A
- ( E' |8 }1 b! f5 |$ p1 e, `
- // Начальная фаза* i& o% z. o: i
- monster.executeState();
& Z! {9 o, W h+ e% ^9 J1 B# R3 t4 L
* U0 f' s8 y3 B E8 n- // Переход в агрессивную фазу
- R4 Y* [; v7 [6 W* ]+ ^# ]) n9 M - monster.setState(new AggressiveState());
) s" _: ?* f- G$ Y( Q - monster.executeState();
; t, O8 f1 t6 ] - 2 f" z" r# k- ?3 J# c$ a
- // Финальная фаза
1 g. Z8 \! h# f( X: K0 ^& K - monster.setState(new FinalState());
- w S' x$ E k - monster.executeState();/ f9 a$ [1 [/ Q+ C
- }
! q/ t$ b4 W$ J# P- O+ I - }2 u% J! b! L) y2 D+ T; |
Скопировать код 9 @4 ]- X5 E- T: ?* e9 m
Комментарии по структуре пакетов и классов:
9 B, C" c4 m% ^. [/ F7 A7 {3 W- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.3 _+ D9 z r. a2 v8 t' U
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
! Z$ j' T6 V$ u$ IЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!+ r5 x* L: ]; o: {5 A- b( r; p5 V7 a
' l F) O1 W+ v
0 F2 U* \3 P' C8 V1 J
- O8 z* @; |; f8 R- C: K4 W4 A
2 V$ M, t# c& E% G/ O1 {3 j* `8 r/ g+ ^6 F. a% j! `* p
4 x# K& q! i# X! ^3 m
5 V! e d' P# N/ [1 c) I7 J, U& `( n6 L
: m8 r9 _5 v5 G6 t, i. Y! s3 p
4 Z$ a. h, ^3 a2 L
9 P: ] A, `1 o1 J' W$ n% T, J) a: C
! Z/ `3 z. e/ U, z9 \5 J
9 z5 d2 U0 k+ k2 B, [
|