Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). . m: K3 m0 E) [4 o C8 `
m) B9 j- k3 v) z3 fЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
$ v/ ], x T0 O6 S+ U9 \9 r
3 t S3 t4 o& w2 L b8 }, z1 EШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
* Z9 P `) L5 J: Q+ }, d8 D% K3 R7 v; l7 B
- // Пакет для состояний монстра
+ O# p" f" F( ?! ]) p O - package org.l2jmobius.gameserver.model.actor.state;
# Y2 N6 ~4 X* P3 J - ' N. z c9 d* v4 p* f. }
- // Интерфейс, представляющий состояния монстра
: Y$ b" ?! j5 N4 ` - public interface MonsterState {2 K, o, w8 ^0 M! x* X, \2 l& }9 f
- void handleState(Monster monster);
+ d, C. K$ V: N - }6 [" ]' N: a7 |' x
Скопировать код , W3 Z: B( [9 [& T
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
$ p3 K# _" {; s3 V+ T
8 H! r1 m- C9 |! K8 S: |/ gЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
) k9 k* [" ]& s: U( E# n/ r
- _" w$ p: B7 _5 ~+ }7 f! vКласс для начального состояния монстра:
& b, M1 O( J4 N# Q4 d- // Пакет org.l2jmobius.gameserver.model.actor.state+ `( V d* [0 `! P0 }8 e" v
- package org.l2jmobius.gameserver.model.actor.state;* O l" F- l" j0 r. w! s
- 1 R5 D( V: u+ N" S" e: h
- import org.l2jmobius.gameserver.model.actor.Monster;
6 u/ B" s( T, u+ K
# ^) K4 L4 E6 n+ s" D/ O- public class InitialState implements MonsterState {
$ c/ `( S) d. }3 X* p2 J4 R9 @ - @Override& h5 v. @& h) _
- public void handleState(Monster monster) {
' e) ~6 d1 H6 x9 T' j - // Начальная фаза боя& z; g7 D8 W& K4 l. F9 j+ Y
- System.out.println(monster.getName() + " начинает бой с обычной атакой."); a( u, y, a! T! v$ y
- }
- m; O( A7 c9 f1 h - }/ _& O8 M5 a) T, L, F
Скопировать код Класс для агрессивного состояния монстра:
8 `+ d+ m0 x/ J, \) ^- // Пакет org.l2jmobius.gameserver.model.actor.state! v+ u& C3 X8 D- V4 Q
- package org.l2jmobius.gameserver.model.actor.state;7 `' j4 ~3 n# q. Y4 a' `
- * O/ {; g8 T @# c- ~- |# k
- import org.l2jmobius.gameserver.model.actor.Monster;
0 R4 Z9 _: V4 l9 u9 ?3 } - + g# k( Q) z/ s( @. z
- public class AggressiveState implements MonsterState {
- r$ _ O# D' J; u) ~5 K5 O: ? - @Override
) r& ]' ?1 G# O - public void handleState(Monster monster) {1 |3 [/ c3 R$ C! y0 i5 f
- // Агрессивная фаза боя6 j0 k# ?8 t/ F/ J& Q3 e
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");* C4 X# J8 t( T) }) | v
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
; K) d4 o9 U3 u7 \ - }3 Y, M! W3 S" o4 b: z$ x9 V. K7 F7 @
- }
9 P J9 [* S) k7 V, R" g2 \
Скопировать код Класс для финального состояния монстра:
- E& |1 ]' r" F3 e2 Y) [0 Q3 i% o- // Пакет org.l2jmobius.gameserver.model.actor.state* b9 b$ {: u; O1 e
- package org.l2jmobius.gameserver.model.actor.state;" ^+ z: i( z4 Q" b8 T- }' e
- . F. \# z; O5 g2 q5 x7 @9 D2 V1 S
- import org.l2jmobius.gameserver.model.actor.Monster;- _5 J, v! P( A7 w6 X
8 \- z" z; ~' f" N3 m- public class FinalState implements MonsterState {
( n$ g8 M5 l" S9 ? - @Override- D$ m# d. x1 ]
- public void handleState(Monster monster) { D) {- a' S8 c& z3 Q8 ^
- // Финальная фаза боя
* Y. L; Q* v0 H8 Y( f8 O - System.out.println(monster.getName() + " готовится к финальной атаке!");
2 s, H7 s9 u; {9 O0 h4 o. M - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
; H# x& L/ f& E" B- s I E - }
/ y% k7 }$ p" ` - }) K) t# v7 P; h% w
Скопировать код
: ^+ Y1 k/ g) @9 R4 iШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor., S: x& z% Y- w# S
- // Пакет org.l2jmobius.gameserver.model.actor0 j# ^/ N/ E% p5 J, @" X
- package org.l2jmobius.gameserver.model.actor;
. O0 K8 I! v& t0 i" u0 C' B" H
$ F2 B9 B2 L$ [' K- i9 D8 `- import org.l2jmobius.gameserver.model.actor.state.MonsterState;3 L2 q2 ]$ ?8 A" K7 U1 @7 L
- import org.l2jmobius.gameserver.model.actor.state.InitialState;6 ?9 |- F. N* r, m! L
- . K$ _* Y4 H9 m6 q) r7 t$ ^
- public class Monster extends Creature {
1 e8 a: M' V; V s8 h$ D" k - private String name;: f: `- [0 t+ Y# U
- private double attackPower;
' ~* Y3 t' F7 p- y - private MonsterState state; // Текущее состояние монстра
1 R! K3 v5 e$ F) t
. j" Q! B0 S& Q* C* E8 Z- // Конструктор монстра% d Z2 O& P6 s f/ R. d
- public Monster(String name, double attackPower) {
# k$ u2 s A- R. \2 k( T - this.name = name;
% W2 N' j) e: d; D1 T% H# u - this.attackPower = attackPower;
9 t: \% m8 N; N3 Z8 R - this.state = new InitialState(); // Устанавливаем начальное состояние: D$ W( a# H$ [$ V2 m* C- T& J3 i
- }
0 O, [* c. [! K/ _) }. s" ? - , F4 J; T9 J% @- @. d
- // Метод для смены состояния
" n& f- y( n2 o3 S: E - public void setState(MonsterState newState) {1 f1 `5 A# [' C
- this.state = newState;
* T( L- C# D4 n: H8 |& Z - }
9 h, u/ L X* J - & N' b1 c) b# [- W
- // Выполнение действий на основе текущего состояния- r! x, Y+ N4 Z- k& Z) Y3 A* L
- public void executeState() {
% r7 ^- h d7 M- j! W I - state.handleState(this);
: `- ]* Y2 r9 c! T% P { - }
( \1 I* a) K5 w, \6 R$ t - , K" o" b0 b F/ J
- // Геттеры и сеттеры/ C5 r7 w9 {$ B/ \* e/ N: C( K
- public String getName() {& B1 s- X, U' X/ p' l, u
- return name;
) P5 b8 C+ b3 S) m6 y/ q1 b( q; b - }' B) n) ~7 v8 D; u* t" a6 Y
" _$ Y( z; B" {4 |6 j2 ^ ~8 m4 X' o- public double getAttackPower() {) G9 W5 U1 w* Q2 l: q
- return attackPower;, N$ D7 P* q" U4 O2 I$ C- B! P
- }
% x- g- G; a" Y - 9 a6 k, m3 N0 q
- public void setAttackPower(double attackPower) {
+ R( ? ]9 n9 s) j5 W0 B- c - this.attackPower = attackPower;3 p) l4 d) W3 g& g
- }
* }0 Y2 q( _; ?, q# _8 y - }
( \& o8 j9 `& x7 O. `6 f
Скопировать код
- n( H1 _" V/ P8 jШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.' b/ J5 o4 A4 {# E% H9 [; n
3 u% @% R: r( a0 O6 u- // Пакет org.l2jmobius.gameserver.model.battle
) g, K+ l4 B3 R5 N5 ? - package org.l2jmobius.gameserver.model.battle;
) X j) `+ b5 |8 N' J7 D' v
5 X" E, s5 O7 C. O- import org.l2jmobius.gameserver.model.actor.Monster;
8 F: k0 x0 h% d& b C* f - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
' z8 c$ u5 d3 L3 N" z - import org.l2jmobius.gameserver.model.actor.state.FinalState;
* ^; L: f+ g4 A1 e5 X3 ^
* m1 R ?, u, h9 m. h- public class BattleSimulation {
! a, Q: }+ k8 g - public static void main(String[] args) {% w3 A& h* i( { u' H, ?" S! k( c
- // Создаем монстра с начальной атакой0 n! P+ j$ F$ h3 j8 i* }
- Monster monster = new Monster("Дракон", 100);
& _" i( w$ B+ L ~ - " C8 L1 {$ B$ n# N
- // Начальная фаза
6 m( g, {: L( ^8 ]. f - monster.executeState();
7 L( D+ E" b( @% b& ~5 ?$ v Z - $ z4 c/ @0 r# v. _$ o8 ^2 S
- // Переход в агрессивную фазу* @7 t& ?( Z- \7 ?0 X
- monster.setState(new AggressiveState());
* A" `. U. [3 T* d5 V ~3 [* g4 p: a - monster.executeState();# L+ K6 J- W, s+ A6 F/ e; E
2 n- p/ V* F2 ^, u# x* c& E3 d- // Финальная фаза, I2 P$ j1 u: M" ?
- monster.setState(new FinalState());
y! c! F, Z8 |8 l2 f - monster.executeState();
! p) [- F: A# O8 d d - }
+ R/ g A! I5 u1 V$ k5 z6 W: \% U6 Z - }7 D9 {2 b1 h5 i
Скопировать код
% m6 L3 @8 I6 PКомментарии по структуре пакетов и классов:- p1 `% B3 ^% ^
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.# c0 u7 l% q- u" J
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
! T0 h+ T# ?$ CЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!6 d- V7 e8 N4 |4 T
% m& m) _+ a8 h
: S4 u- C W) ^
/ H% z1 U8 m, `6 b. K- ?
) ]5 }; t% b6 L& u, C1 p* \! }6 S8 R) t: O
$ B7 }" k3 k- u3 T q0 E
0 h' L& E- D5 z
3 U) d8 [ ]! B5 @
( L9 {9 Q6 X; C% Z2 G. m
+ p1 C/ G" C9 o5 p+ h1 C2 I
9 o" Z' ?6 d5 B; ^; a. s' L1 E5 Z$ O+ U
" I# Z; X+ Y% H* M# m: U
0 }6 h* n* ?& e9 ~5 |5 H' X |