Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). * ], ?; o! C% D: Y5 Q9 C9 R
8 p6 o% e3 n7 o. L. LЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.' K3 [$ \# b8 s7 N6 L8 k3 t
; `3 B0 R, i9 o' p, J) TШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
0 d+ ~* ?# `1 T: ]' a H$ v, _9 X+ Q! m0 K& W7 {8 y. e8 \
- // Пакет для состояний монстра
/ g" g' d6 ?! C' p4 I* M2 g, k - package org.l2jmobius.gameserver.model.actor.state;+ } j* s# _, ~
- ! D* k! T/ v! p; f* w5 Y# K
- // Интерфейс, представляющий состояния монстра
7 [/ H4 A) x7 j5 b, [+ \ - public interface MonsterState {
' d7 e1 w/ j) u% |" p$ M' z - void handleState(Monster monster); a5 A0 I2 W Q4 o: g d
- }
6 G' g3 W; C+ C& I' p" @# Q, f
Скопировать код ! O$ A/ B1 [8 s$ O
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. . d9 b9 Y) J. x) W+ z# ~5 f# x
8 m7 g8 t; G p
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
}+ }% R) ^0 U
) _2 d4 x6 d6 PКласс для начального состояния монстра:
9 Q6 S+ f9 P {& A- // Пакет org.l2jmobius.gameserver.model.actor.state
& D9 j' X2 o9 A - package org.l2jmobius.gameserver.model.actor.state;
# E. s4 `0 [$ m; x6 \( b8 n: O' y4 l
9 [% |% X( q8 d) |- import org.l2jmobius.gameserver.model.actor.Monster;4 I, O& y, c1 V7 \
& t0 }5 `9 r: @- public class InitialState implements MonsterState {! C' [6 ]2 B& o! _ z l. G( q6 {3 N" P
- @Override
5 X9 X. b) F" E - public void handleState(Monster monster) {
) p( |" C c: M# V* z0 l$ a( B- I - // Начальная фаза боя( h. f4 Z9 w* x7 T
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");
: I+ I/ u! L" l N1 U. L. D - }
j" e5 o# m: W4 }9 i - }/ f" z0 d$ J4 J! ]' m* a( a
Скопировать код Класс для агрессивного состояния монстра:0 `$ v) p |: H$ \* q& W
- // Пакет org.l2jmobius.gameserver.model.actor.state
3 o3 r2 T! M( L# j! _8 l5 S( g( ^ - package org.l2jmobius.gameserver.model.actor.state;3 T* \* `& p7 m
- ?8 J+ r/ N; M* p' g$ J7 i- import org.l2jmobius.gameserver.model.actor.Monster;: s. p6 T: R( t5 g$ P! u; r
- 0 r( d V# F1 N4 e9 V" S" q
- public class AggressiveState implements MonsterState {4 t% a+ q1 F2 N8 X
- @Override
: l3 @6 e. q) O) d - public void handleState(Monster monster) {7 @; [0 `4 ] k+ n( {
- // Агрессивная фаза боя
% y8 P$ U& G/ z8 m' t' { - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
/ r2 a2 k1 v- R" w- o3 }# O/ w7 G - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки; w$ U$ h N8 i7 U3 j: c+ b
- }3 t. S2 A' }3 _7 R. o
- }
( I& ~# A+ I' Z* t4 i' y
Скопировать код Класс для финального состояния монстра:1 _. {* v3 C) O* d! {5 q; s1 V
- // Пакет org.l2jmobius.gameserver.model.actor.state
: `- `# ^7 H$ S! h - package org.l2jmobius.gameserver.model.actor.state;
7 ^ J+ u% Z! j$ K - ; h3 `, Z2 I, f% x6 t
- import org.l2jmobius.gameserver.model.actor.Monster;
$ ^9 F" F3 z9 A/ _* ]# d7 |1 b6 } - ( z% n/ n6 J; i! x O# k
- public class FinalState implements MonsterState {
; q- O) V3 u# w+ N' C, v - @Override$ i/ D+ I; k4 _' f/ m' W
- public void handleState(Monster monster) {
0 D- G3 X3 B W0 T! }2 H5 J; t, a - // Финальная фаза боя1 R/ y" K/ C8 l# x! P& {7 h
- System.out.println(monster.getName() + " готовится к финальной атаке!");
; v( d, u4 M( X% ?( F - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки& c5 m0 S0 O6 O) s
- }
1 v5 q3 U2 ?/ T) A7 b Y$ m( h - }
8 P: W5 `: q, X" |, X! j$ p
Скопировать код % n) q) o0 Y7 w
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
; P3 x4 H; K6 v+ w- // Пакет org.l2jmobius.gameserver.model.actor# d1 E6 r: w3 R5 U9 B
- package org.l2jmobius.gameserver.model.actor;
# j! Z0 x7 a! U* ^: b - $ n% e3 Q* j4 X2 ^: Y
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
3 u' v5 g6 a3 T3 \ - import org.l2jmobius.gameserver.model.actor.state.InitialState;! d/ q+ R! d# C1 v. j1 G% _
- 1 B& Q$ V2 F P) h" ?; j9 z
- public class Monster extends Creature {' n7 ?2 g+ F% I. A8 N4 }
- private String name;
9 ?% S/ }$ a# d' R' S6 @ - private double attackPower;3 G* o' O |- V! h4 ~3 X, z
- private MonsterState state; // Текущее состояние монстра* W! V% e0 j* c e& e" Q; _
0 e- t; X- `- m, i9 x- // Конструктор монстра, a+ x% [; Q. n& B+ {
- public Monster(String name, double attackPower) {
& W8 m6 J: Z: o8 _$ G! Z% { - this.name = name;
9 |' F+ q9 [5 l* b, F/ g - this.attackPower = attackPower;
5 E7 V3 Y# t: n- K4 q; b - this.state = new InitialState(); // Устанавливаем начальное состояние
1 h1 ?$ t/ x {) @0 _3 i& Y - }
3 `3 z, T; x' h' m( ^+ K/ T" v
1 _) @8 l2 s2 H- // Метод для смены состояния
/ {) ~5 M" Y* i% W) Z7 y, l - public void setState(MonsterState newState) {- P" a; l1 J0 g, L5 _
- this.state = newState;
7 M: b/ \: \. q3 { - }
$ y! y$ x2 Y/ T6 T! J5 `9 f/ L$ n7 K
& V8 _& W, h- |- // Выполнение действий на основе текущего состояния. j) X% C5 S0 _& ]
- public void executeState() {. c9 S1 |7 y0 Y2 i+ w
- state.handleState(this);
/ [9 q( y1 c0 I5 Q% p. l; ^7 f4 | - }
F) A ]0 j6 G# y
; m4 ]8 C" R- @5 G, }8 Q' ]- // Геттеры и сеттеры! s ?& v# J9 Y; J0 h" Z$ t1 }
- public String getName() {
$ R( t# d8 V2 ^8 c2 X; X& |1 d - return name;
! w; k2 ~4 ^8 [, u) s# e - }
# j' ]8 C( X) O8 H5 n( ?7 \ - + i7 M/ S! T7 S: {
- public double getAttackPower() {
* u: n% d" U- N6 k- f - return attackPower;5 I5 u/ O& |7 s
- }+ y1 k( I: b6 j; x
9 ^. O3 L$ _% _5 K Y- public void setAttackPower(double attackPower) {- e S# X9 ?0 r) m
- this.attackPower = attackPower;8 ~' j/ L, T3 Q! C' w* |- o7 _7 y
- }8 h' ^1 D/ C6 C. M% ], l7 `
- }
3 L$ ~; |+ U5 L7 r1 Q
Скопировать код
. @; \% h7 m! D4 y+ |Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
! b+ h1 N! n2 l
' a, [/ n# E, Z/ T! q- // Пакет org.l2jmobius.gameserver.model.battle/ d0 b" O. G* T' S! z
- package org.l2jmobius.gameserver.model.battle;
l: e, C3 g* j# Q8 Q6 @2 s# ^! D
0 c! I* I9 x# Z- import org.l2jmobius.gameserver.model.actor.Monster;
$ P# `! T) n! s: J) w/ i: ` - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
" x3 a! s3 ^+ C, i - import org.l2jmobius.gameserver.model.actor.state.FinalState;
) v: B6 x* n6 T% i4 z; q4 z" I( U y - 1 j2 ^' Y( X1 i2 F$ k3 ?) }
- public class BattleSimulation {% R. `) l m9 Z) w0 L' O1 M H
- public static void main(String[] args) {
+ ]3 I z6 I. @$ M" D4 L+ t - // Создаем монстра с начальной атакой$ h' }) @; k- q C
- Monster monster = new Monster("Дракон", 100);
& r- B: g% V: M; }7 | - : r1 g' B8 b0 G! u s+ v
- // Начальная фаза
" a! E+ P( Q3 {, O6 P - monster.executeState();
9 r1 r- w" N# Z( z! ]* o0 Q+ W - & H8 o x0 \3 x' j/ v! X
- // Переход в агрессивную фазу
+ v8 J' a% u, G! O# ]+ V - monster.setState(new AggressiveState());
4 ?+ W8 g5 f* f" Z% O* s - monster.executeState();) O* g2 d) R( S- \+ }8 l# Y
- 1 c0 [' O* g& q7 b$ A! h b
- // Финальная фаза' f6 G9 G: t6 ~& |/ O
- monster.setState(new FinalState());' b! W+ u; n8 G" }' K
- monster.executeState();& j! Z! Y2 p; q% N
- }
3 P0 u7 M5 h5 C' d( W- s E0 O - }% _/ p0 {, }5 t8 C8 b' b8 L5 Z7 ~2 g
Скопировать код 4 i. u5 R9 M; Z5 c
Комментарии по структуре пакетов и классов:
) b& G0 \1 F5 ]% [ s. ]$ z& T- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
1 E" s t# o4 M ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
2 L% A6 I* \. e) _8 Q4 |5 ^Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!) j4 _: G; \% J- e
" v9 B' _% o: n8 Q$ c" V
/ ~; V$ v4 Y( K9 i7 k. |5 h% O2 c3 r% E
) x! ?9 Z' a: p0 W- }+ z
) e# x, K6 R' b/ M1 `1 N: l7 n6 f/ ^ H6 `4 [
! u$ b. V# F% z" R9 t
& f( P9 P; {/ ~( J. ]# P
7 ^, l* }: l5 P& v8 W: I- Z7 V; v$ L4 S* h; E6 h: f0 t6 \
* D0 @, J- W& T5 E& [
5 ` i7 g$ I9 \$ @3 `& u
, w o7 t; F4 \
, f/ O( ?5 W" m u8 ?5 ~
|