Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
* `! @5 h4 n$ p2 M0 i: B( @' w: p
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.2 {& U' r: H( M8 ~
8 j' F/ k# G! |/ s. j+ S% w1 k
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
1 l5 L% s# b- U$ c: T) j0 K+ i) ]% M( F6 M# k$ i) Y3 s+ }
- // Пакет для состояний монстра* {! b. y" D- }* f
- package org.l2jmobius.gameserver.model.actor.state;
5 m. m( m. P+ w0 Q/ c
6 [6 w* _! ^0 f: f9 S% m- // Интерфейс, представляющий состояния монстра- K8 u n* X5 q* \: X
- public interface MonsterState {
0 `7 `1 y; o5 ~& A - void handleState(Monster monster);% P, e3 F1 I0 V8 Q
- }8 h4 |' p# f$ T$ j
Скопировать код ! p ^4 d* _3 l2 h+ K
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
/ ?* d2 {. ?' n4 r
4 Z- G" R9 H/ a7 Z ?Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.( n/ ~9 o2 \7 w: ^1 Z0 W6 E/ }
. `5 l( r# l9 L! u6 _Класс для начального состояния монстра:6 g6 |8 I* i0 @2 t0 l/ w8 N0 d
- // Пакет org.l2jmobius.gameserver.model.actor.state1 h7 }. Y1 S: K9 L1 t1 R$ P7 K
- package org.l2jmobius.gameserver.model.actor.state;* L0 R; d, K/ R4 Y! D5 a
- ) {: h1 ?3 e' K
- import org.l2jmobius.gameserver.model.actor.Monster; J4 b. ^- ]* p* A: o
- ) R* Q: H8 [2 G: X1 F
- public class InitialState implements MonsterState {
! a) ?. q% m) m) K) Z! d - @Override
6 D9 ?2 o1 E; U( T3 }5 i; U9 S3 } - public void handleState(Monster monster) {8 e# T( z" v4 }( c) Z
- // Начальная фаза боя
% x( c: G/ W% J- {4 V - System.out.println(monster.getName() + " начинает бой с обычной атакой.");
1 k4 _- Y, B% w# X2 q$ l - }8 h8 [$ ^1 j; c
- }1 [7 P" I5 [$ J& x. N
Скопировать код Класс для агрессивного состояния монстра:
" ]1 b2 `. W! u- I3 A6 z' y7 g K7 @- // Пакет org.l2jmobius.gameserver.model.actor.state8 P- S4 w+ ]% f, D4 U
- package org.l2jmobius.gameserver.model.actor.state;
. R) Q* u3 k# {: j3 L
( q( Q% C6 F% X- import org.l2jmobius.gameserver.model.actor.Monster;
, e4 r% _8 b5 m5 _' }5 p, c1 a+ c
8 l" z$ K/ \% ^0 D! u9 D- public class AggressiveState implements MonsterState {
+ Q1 Z! w4 H: h7 J - @Override4 I& I: [6 \/ \/ g4 e$ x
- public void handleState(Monster monster) {
" P8 \ f6 @) N: q6 J2 B - // Агрессивная фаза боя* S6 o8 D9 j+ Q$ _" d, s% s
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
- W3 h+ y; T) [! N8 C" o - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
1 a+ ?# a6 `1 f/ @0 | - }
6 R0 Y. |% Y: ]7 u6 Q/ I - }" `6 ^% I7 l) b9 F/ [( e
Скопировать код Класс для финального состояния монстра:$ K5 h" C" p U: o$ H) }
- // Пакет org.l2jmobius.gameserver.model.actor.state% U# o5 U5 G2 M# I( [
- package org.l2jmobius.gameserver.model.actor.state;% z9 _6 K8 b% Y: R/ Q$ H6 j: O- E: j
- ! p$ H) h. ]; T- U5 T' h& p
- import org.l2jmobius.gameserver.model.actor.Monster;2 H! B4 S) U! r4 t( Z- D
- $ w. f2 M/ Q, ]$ i5 C
- public class FinalState implements MonsterState {
$ b* y" p$ S7 x7 M) y - @Override
* j; m4 C- E1 T/ c4 z% v6 ? - public void handleState(Monster monster) {3 O3 N* h3 ~' ]# \
- // Финальная фаза боя3 f) ^) E+ f- N1 J; e6 n
- System.out.println(monster.getName() + " готовится к финальной атаке!");, g6 [( K) E$ C% D% V1 e
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки5 J5 y. ~1 O! s6 ^2 e9 O- r
- }
( R" ^! f" k. W1 L - }
1 j- r5 u% `1 \7 P2 z5 A; H
Скопировать код 7 j, h/ j2 L! n$ l
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
* x p& q! }5 X8 @- // Пакет org.l2jmobius.gameserver.model.actor
0 ? [+ y1 T+ W" g - package org.l2jmobius.gameserver.model.actor;
+ H! q% p1 A- l. V5 F - " |* R' n- G( ]
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;' m2 a8 y/ @5 X w1 w6 Q4 E+ P
- import org.l2jmobius.gameserver.model.actor.state.InitialState;1 t; {4 Q# `- ^! m; G
- 1 Q7 A* f- e5 r% J; W7 m2 i
- public class Monster extends Creature {
. M4 d6 V2 T' ]* I3 j" L - private String name; I9 u( K/ i, o. d% C& p5 R5 Z" y
- private double attackPower;& P. d3 A0 K2 f+ [9 D* J8 N& D- _0 Z
- private MonsterState state; // Текущее состояние монстра2 ?( P# S) x$ q. u: U; F% A
, r% v5 P; e) b3 d/ m/ H: [% @- // Конструктор монстра! v; }' r' l+ e7 u
- public Monster(String name, double attackPower) {
* g% J/ o& p8 q q - this.name = name;/ x8 F; G' ]4 K
- this.attackPower = attackPower;* y& g4 W2 p$ b! I4 q
- this.state = new InitialState(); // Устанавливаем начальное состояние* H2 E1 o) w. H( p) v
- } X7 Q2 y. H/ g. g
- - u* {3 E6 I0 t2 I7 B3 P- P
- // Метод для смены состояния
& I- b! f% l0 V, A4 V6 h1 g' A9 e - public void setState(MonsterState newState) {
; J" a4 Q9 k7 T5 H, ?& O1 O2 l - this.state = newState;
3 ] M& |+ A% p+ j+ s* E - }& X0 R4 }9 [& K( ^& l# G3 X
, _2 a0 X1 Y- r" A q$ _- // Выполнение действий на основе текущего состояния. e8 ?+ Q) u* ~: ] f
- public void executeState() {9 c* B0 Q' C, k+ ^' B) _5 @
- state.handleState(this);) w6 P, S9 [3 P( k; a5 n
- }
p; }8 Z$ o$ |7 b( W2 ^ - . j' M1 U) G) S5 M' Z# Q
- // Геттеры и сеттеры
' ?% ?" v7 K; ]' A ? - public String getName() { d, n' w4 v5 W
- return name;6 _# A; @6 F, H3 ?
- }
% f9 d9 r4 }" x& r - - @" s/ |4 a# k
- public double getAttackPower() { Q, { j3 g+ x$ v, Q8 [5 g& `/ m4 W
- return attackPower;% J& m% n' T% l4 l3 {4 P: p" \
- }
' ^6 e- E2 |1 E) ?7 j - ! G# L3 J' O6 E0 p
- public void setAttackPower(double attackPower) {( T4 ^7 e2 d9 J8 K h
- this.attackPower = attackPower;: k/ G6 j4 l+ ~4 H8 H
- }, ~/ W: K& u: N
- }
) A6 C/ t2 w) ~4 J t: ^) S
Скопировать код
8 R2 k+ q. f: G8 j& bШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
- |) d7 \# N/ I: M- f: v
0 r1 t" w' B- H6 v; N$ s- // Пакет org.l2jmobius.gameserver.model.battle
" \9 ~: H0 r7 T - package org.l2jmobius.gameserver.model.battle;
: P$ a4 f3 J$ v( V# g
% z5 x& s5 X% n: ^! v2 k9 ]$ G- import org.l2jmobius.gameserver.model.actor.Monster;
) Y- k ~7 @; _, e( s - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
& G! K4 P, n) _5 e - import org.l2jmobius.gameserver.model.actor.state.FinalState;
8 j! V# G S ]# r$ G! s* c0 j$ B2 q" p - 3 W0 n9 g9 D3 b5 B
- public class BattleSimulation {
8 e0 ~- e( e, m4 G. H - public static void main(String[] args) {& | U; K# l! g
- // Создаем монстра с начальной атакой
: e, E3 m0 k; ]- ~9 Q. j, H - Monster monster = new Monster("Дракон", 100);
) K3 a3 F' `( y$ N% A - h8 E9 w8 {9 T! U6 a4 `; \! J
- // Начальная фаза
* t, n% O8 Y. {7 r - monster.executeState();6 s, {; a; O5 ?7 \
- 7 t" w2 t' Y, x" Y& m+ M4 `
- // Переход в агрессивную фазу+ @; u' M; r) |' S; U/ ^5 Q. _
- monster.setState(new AggressiveState());
! q0 q& E; U; V - monster.executeState();
. F- H8 j) ~" S5 u: H
( x3 t I! k4 n7 K* Z3 [* `- // Финальная фаза
" `4 P/ \2 ~( f$ D6 g - monster.setState(new FinalState());
# ? v5 i9 q: r- }5 F5 u( T* |' x6 n - monster.executeState();
4 _ E0 c8 j* b' ~ - }# o& }6 ]0 ~3 }) R* X
- }
% E1 w0 \. D+ A( \# b' v) I- ]
Скопировать код
0 Q* _6 l* L! u+ ?/ u& y3 S! LКомментарии по структуре пакетов и классов:, h$ U$ R# s5 V7 v
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.1 B y' j! M P/ ?& S: }' y
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
9 U' Q! ]6 r4 @7 \Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!' \' f$ D6 g0 J7 {1 E# _
. T& ^, \, C- u; m* F9 M* F) j6 D9 M# M, Y+ F& ]% T
+ e( W0 `5 ?8 D
+ B/ C% K9 ~( s, m; W
' n+ c) X: }8 Q- k. ?! V! W1 D* n; q' h
7 ~1 g' k! t+ g
; _& e, H2 @! S: A( M7 }
* N# X: t4 Q; ~+ ?8 U/ m' m. A6 Z3 ^
1 f7 X& m5 u d1 e+ U! ]
% D2 {2 Y% x8 @6 [- C r6 Y; a% k/ O3 D3 p0 b, h6 P# b3 R
% Y8 y# l9 [( x- S# G |