Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
1 g! U* b5 d" H& g
9 r& t6 v* J) w7 f* G; P2 NЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.! b/ c; V6 K m$ t
5 ~. z3 j/ T$ M. r3 f2 m
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.) P- \+ a( ?- o: l6 O
$ ]; u7 e1 I/ N3 E# ]) Q7 i4 F4 W- // Пакет для состояний монстра
0 r7 P* Z; N; s0 E7 Q - package org.l2jmobius.gameserver.model.actor.state;) j8 [% v( T; l& |6 U( A
- 3 k5 C1 Y/ b0 P5 @+ S. Y
- // Интерфейс, представляющий состояния монстра* v W4 ]0 s0 }" c) P
- public interface MonsterState {5 v, `3 U1 Q. L, D
- void handleState(Monster monster);
* x* z9 l: g/ M% Y) ^; X, G - }
# _) n, A/ e5 _, u- m0 w2 j
Скопировать код 2 E- p% A* f7 ]7 ~3 |5 ]- K8 g
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. ~3 p7 I7 {/ K' Z- u
9 `, B% k4 I# G! WЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
7 `8 v8 e# o, b) u ~4 h
9 E. `& |. O7 qКласс для начального состояния монстра:) e: w/ {4 M$ O
- // Пакет org.l2jmobius.gameserver.model.actor.state
; e, U8 @" |" b% _* l* X7 t - package org.l2jmobius.gameserver.model.actor.state;$ F4 G' Q4 X |9 y r
, ~- t2 G1 U# K" p- import org.l2jmobius.gameserver.model.actor.Monster;4 r x2 j+ z& [9 \! ^- f* P
- 4 a" E" s& f5 N3 q6 _9 Y) {
- public class InitialState implements MonsterState {
4 m( F1 q: l a! P( A - @Override
3 u, I5 Z: s. M7 \ - public void handleState(Monster monster) {
, U! L, V2 C( r& j - // Начальная фаза боя
t( B+ }% N5 G' t+ Y - System.out.println(monster.getName() + " начинает бой с обычной атакой.");
3 U1 Z" ~0 K0 i7 I x - }
8 c0 U, s6 x6 q0 z; R - }3 q+ ?' [( P' m2 g' x) E& k# E* y
Скопировать код Класс для агрессивного состояния монстра:! Y. F8 q3 c) O- H% O" Q
- // Пакет org.l2jmobius.gameserver.model.actor.state& z% d$ ^4 U) p) N( `
- package org.l2jmobius.gameserver.model.actor.state;1 N% l7 |; X/ n8 i- A0 c# i- e
2 N# S q9 Z6 R: z- import org.l2jmobius.gameserver.model.actor.Monster;
# h, @% k3 Z8 c& k; s; m, f
, U6 O; |- U- v7 r- public class AggressiveState implements MonsterState {$ w, T: q3 R4 J5 n
- @Override9 ?3 z# }+ H6 g
- public void handleState(Monster monster) {# I) V$ r- S' `. \, A" w' q$ I
- // Агрессивная фаза боя
8 A/ o: ]7 T7 P2 i" w - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
! a% T6 `" Q1 U' \; \' @ - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки* m2 A% y; V4 n1 f4 [6 a0 u1 E8 M
- }$ }5 H1 z( ]" h+ C
- }& H) J" r5 x8 M( i3 h1 e6 w7 U; c: X* j$ v
Скопировать код Класс для финального состояния монстра:
( q- e: [5 s6 s7 t' c; Z3 [- // Пакет org.l2jmobius.gameserver.model.actor.state. p* H/ v: q$ u A( t: N4 v2 V
- package org.l2jmobius.gameserver.model.actor.state;2 f* |" x) h% S$ ~# o: e% P
- + ~8 L6 V, N, N# A4 Q/ T2 j4 Q/ S
- import org.l2jmobius.gameserver.model.actor.Monster;/ u e8 _5 h2 X4 u K' n
- t6 k$ B! Y' F* S! G* G! s- public class FinalState implements MonsterState {+ p3 V9 k$ `3 \; Y
- @Override6 c$ ~ u) r. V; }" X
- public void handleState(Monster monster) {/ p+ `: }: C! t
- // Финальная фаза боя
: M+ e1 H; S8 D. Y! y - System.out.println(monster.getName() + " готовится к финальной атаке!");
. d- Z. `2 F0 C6 Q0 ?1 T$ R; p& g( n - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
0 b |& c6 {. h6 j - }
$ L+ x' h8 h9 \' N' |; u { - }* Q H7 B+ X. l
Скопировать код
1 H, M( V( [( J7 V. |Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor., |8 S* P; H' ~
- // Пакет org.l2jmobius.gameserver.model.actor0 l% G0 q1 _ A5 ^6 S% f. c9 T
- package org.l2jmobius.gameserver.model.actor;; B! {% F& h0 Y* B, ]; D# x
6 S+ t/ E0 m* Q, k* K- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
& j. ]5 o, [/ ~* S; w' U - import org.l2jmobius.gameserver.model.actor.state.InitialState;
" e3 E! k' z+ k( M7 i - 9 @8 R0 B5 b: D" _5 ]) @1 e
- public class Monster extends Creature { K4 z# N( N/ W. m4 _& q- c
- private String name;
+ }+ h2 E1 o) M% p2 F3 I - private double attackPower;$ O! |3 m5 T0 \! s
- private MonsterState state; // Текущее состояние монстра
3 Q. s' A5 [$ M! o0 Y3 L: P
3 A$ S# g9 p- |2 v! f4 }5 J- // Конструктор монстра
8 s! M B# @' z( r# s5 Q% L/ Y+ e% T - public Monster(String name, double attackPower) {2 o! f1 ~- T+ }. t. h
- this.name = name;
% r; |" p+ w0 \6 g. l8 ]. { - this.attackPower = attackPower;/ j5 O, f+ b/ g E- K" r
- this.state = new InitialState(); // Устанавливаем начальное состояние7 J9 ~3 m4 V) r$ d6 V4 ~
- }
9 a" u" k7 U; N7 G - 1 u! g4 Q% p$ C4 P6 ~1 ]5 {6 P
- // Метод для смены состояния& ~) B( L* L( R2 V# ?
- public void setState(MonsterState newState) {
! {7 i& Z. O# b' f" g2 h - this.state = newState;
2 {3 [( g) O* M% h - }8 n0 y2 s3 n) @0 n) @; o
- 8 Y- [" U3 }3 o: Q3 K
- // Выполнение действий на основе текущего состояния
; Z, h% `0 _, y2 g y- i+ Z - public void executeState() {8 W, Z4 ]! u3 W
- state.handleState(this);" O: x+ ^: N4 L; T; `" L
- }
1 c! T/ f q5 x2 h
- x& h* y# i l- // Геттеры и сеттеры" V- z1 H! U8 ]3 x% C8 ~! e
- public String getName() {) s1 ] Y/ E+ o l
- return name;
8 X6 T) \: K! f! F - }* r3 o8 `! ]6 Q" r) H
6 u9 d* V6 o: N( ~- public double getAttackPower() {
( T @7 |' B& ^- B: P4 `* P6 a, d - return attackPower;5 Y j; }8 g; m
- }
# N7 H* F) ^; g7 @' `
/ Q. l2 M. }) A, k: F- public void setAttackPower(double attackPower) {$ X: f$ W$ u( K+ T* e
- this.attackPower = attackPower;
; J* A1 P+ j. x6 Q& X C - }
6 |7 h! C4 z7 m! ~5 O" H6 S0 s! E - }
( Z( m6 w5 U1 H; `
Скопировать код ) q7 n' u k, T' V8 E! I$ |2 f
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.* F3 i9 F9 K9 F c. f
3 |7 l ]% a7 |- // Пакет org.l2jmobius.gameserver.model.battle
4 ^$ ~$ s9 i) r! h - package org.l2jmobius.gameserver.model.battle;# p+ |( Y0 N% N9 U0 v9 a
7 i" z- o" ^7 Y& D: ~- import org.l2jmobius.gameserver.model.actor.Monster;" Y7 {1 @) @0 n3 o( W+ k
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
: J2 U- K2 e! `# M* n! U. J6 g - import org.l2jmobius.gameserver.model.actor.state.FinalState;
% @2 I) Q) Y# _* U* J - 2 g9 {4 y0 j- [. |) k9 u) j
- public class BattleSimulation {( R3 D9 K; e6 k- C. G
- public static void main(String[] args) {
2 \7 w \- t$ A8 y# s7 O - // Создаем монстра с начальной атакой
, B& m7 ~8 K6 K; W }1 [ - Monster monster = new Monster("Дракон", 100);9 f4 m1 k H) A) X m
, O! R! y$ D! R4 d( B, a" Z( e- // Начальная фаза
; n; d( F! e: U( j1 l) a" r - monster.executeState();
! n2 O3 i, B7 d - ; U! [2 {( ]: v; y' P
- // Переход в агрессивную фазу Y x! Y4 o* n
- monster.setState(new AggressiveState());- A' h: o3 l+ `9 S4 U! ^
- monster.executeState();9 \( V5 R8 Z; m* U2 U
- % r$ L4 V' j! V: _$ G
- // Финальная фаза8 X: N, u7 n( w8 a" B1 {) }
- monster.setState(new FinalState());, Z# o) q, k+ h
- monster.executeState();
' f4 Z/ |- i& }, Z - }
1 A# _3 T1 @. W) E; ~) P - }
6 }& L9 H, \2 k6 t2 t2 U: l
Скопировать код
+ f, i9 l0 }1 S. @1 I9 ^2 g7 cКомментарии по структуре пакетов и классов:. F* Y' G0 i6 p
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
+ Q% m4 ? O* M8 o0 V" U( D' {! ?; Y! ^ ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
/ A8 M: f& P4 r g% GЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
4 i$ i0 C& {0 K& o( f$ b& U' j8 g( }+ p" X3 o4 f9 F
% z) X( ^0 H8 B8 u% N; ^, i
7 b' n7 K' a# x ^
# L: m3 A! \% `/ R0 {
* N" K+ N# }9 Z5 w" k: M7 x4 ?. Q9 E8 M6 S9 B* A
5 {' u& w2 _* @" D5 x
' J/ s" e7 D( O* Q
, W4 W& n4 H9 m1 l5 ]
7 |* F5 ~' \$ X9 D2 l- _
/ x4 v# c3 Y! H( H8 K7 R) u6 x: P' b* S- ?" g
& X) o1 A9 K3 [5 d* w
" {" E5 q+ L. b9 h" }3 ?2 V |