Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). / J8 `5 I, ~* W8 x6 n( s' d
; _3 |0 f4 Z/ x4 P/ E+ B0 V
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
$ w! p2 v& A; ^) c1 Q9 ^* |0 K0 C/ k, R7 J) {# ^
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.: |4 {0 Y+ [1 S
4 I. I# m6 ]. K/ L1 D3 h+ T
- // Пакет для состояний монстра, f* o3 u& _+ E9 U9 ?* G
- package org.l2jmobius.gameserver.model.actor.state;/ E0 ^# G( z( H# Z7 q+ U
7 @. a! M' X0 m9 J- // Интерфейс, представляющий состояния монстра6 U/ ?4 C3 U) ]/ q2 M& B Q
- public interface MonsterState {
; I! }0 ?8 A% O. y - void handleState(Monster monster);" S# T6 A9 S( o( `
- }% u L& R+ ~* B$ w5 g2 q, }
Скопировать код
! ]8 N: F3 x% Q# |5 f7 ^& g3 ~7 \Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 6 n& M; |& A) T5 y
' ?2 j7 P) \; F$ {Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
' J3 B& ~/ F# x/ r8 p; ?2 h1 s
3 p. h- {2 O4 o' l9 X$ VКласс для начального состояния монстра:
, c; E3 c" }& W- // Пакет org.l2jmobius.gameserver.model.actor.state$ b; u7 E3 }: K" X% R O0 G
- package org.l2jmobius.gameserver.model.actor.state;
2 L/ g% Q; M8 l$ p o$ t - 3 h6 L- e/ N( v- L
- import org.l2jmobius.gameserver.model.actor.Monster;7 G0 s8 N6 {% _
- 0 o+ V( M2 T; l! z4 \9 y6 Q
- public class InitialState implements MonsterState {
/ W! V/ M, s5 i* p( H- i3 w - @Override
5 K, J) B: S" Z$ `) V - public void handleState(Monster monster) {+ T5 i; a; W K
- // Начальная фаза боя
) V, q6 L4 n0 p" u4 N6 r0 ? - System.out.println(monster.getName() + " начинает бой с обычной атакой.");
7 J0 M2 ] N- d: ^( E7 Z8 S8 b - }
/ n3 ?; }7 ?4 b8 h1 I% j - }, ?. u% X6 F! a! J
Скопировать код Класс для агрессивного состояния монстра:
8 h7 s; J4 b/ ^* p! `- // Пакет org.l2jmobius.gameserver.model.actor.state
# |# R( c+ z1 A - package org.l2jmobius.gameserver.model.actor.state;
* u6 M+ P+ Y( c/ V3 U& ?! |
# g- a( T% i: K! i0 y3 S- import org.l2jmobius.gameserver.model.actor.Monster; T6 _1 ]" F$ k0 N; t! U' R
- 4 B: a( v) p G p @* L7 C
- public class AggressiveState implements MonsterState {
; n: M$ t# [; O" Z) B! Y - @Override
3 L3 D2 \1 a5 T- \; @ - public void handleState(Monster monster) {) q1 Z/ |0 J4 L& p' R! w1 j
- // Агрессивная фаза боя7 b8 m% V3 {- E8 ^
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
0 C2 V+ B; Q+ u7 D& E1 O3 Q - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
" n0 k5 L7 d+ b - }
. K7 D5 z1 _0 O1 Y) X$ o - }( H$ \8 Z. _* j& ^) y; H2 `
Скопировать код Класс для финального состояния монстра:
$ o0 N( h) H3 I r- // Пакет org.l2jmobius.gameserver.model.actor.state
3 U: I1 |- v' x - package org.l2jmobius.gameserver.model.actor.state;7 n# Q* D1 e7 c- j# A
7 h0 {6 ^5 l& w% u! _% I1 ?- import org.l2jmobius.gameserver.model.actor.Monster;+ Z: }5 w$ f" |( i! ?$ L3 X
6 t/ M* K. U v3 G, N( p& v- public class FinalState implements MonsterState {8 X) h7 ], p/ k: Y
- @Override: [: G" J6 { q1 B7 Q
- public void handleState(Monster monster) {
5 W1 X( I1 E9 G1 m - // Финальная фаза боя5 h5 z. ]0 J# S# A" `
- System.out.println(monster.getName() + " готовится к финальной атаке!");, Y7 i. Z |/ A9 ~+ f9 U2 d
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
# H6 ?: {7 y/ J% O3 D - }: U! p M& ]$ d0 d Z$ d
- }# g5 n7 e: p+ l7 v( [$ L0 e
Скопировать код
8 \9 m$ s5 x6 ^Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
% h+ H* U: v$ J! ^6 `/ A8 Z- // Пакет org.l2jmobius.gameserver.model.actor
1 ?0 M. H1 I2 V% k - package org.l2jmobius.gameserver.model.actor;
% x! ~2 K2 g3 v" F$ @. o4 w
, g# ?3 o7 x0 c( i7 y/ _- import org.l2jmobius.gameserver.model.actor.state.MonsterState;2 { q4 O# ]5 z. C
- import org.l2jmobius.gameserver.model.actor.state.InitialState;
# c9 h* H* j0 `+ `" Z6 j6 i
' p& w: e+ a; p4 l- public class Monster extends Creature {3 x' z2 f4 u% `3 Y8 B2 s4 v* ]8 i
- private String name;
5 x" x* ~. _9 E O! v - private double attackPower;
9 u& K* u3 u' g5 L - private MonsterState state; // Текущее состояние монстра( t1 P" c/ F& L( w& T! w
- 4 W0 T6 c" V! _' N" r
- // Конструктор монстра
0 C& j2 ]! I, P/ Z - public Monster(String name, double attackPower) {
1 Z! K% P, Z. ?$ X; ^% H - this.name = name;
) [9 o4 m' c! F+ G# a - this.attackPower = attackPower;
' ~4 q5 f& @3 \/ X# w, Z: C7 m9 ? - this.state = new InitialState(); // Устанавливаем начальное состояние+ [1 [) y: u* \# W# b
- }
! M: ?* a' ], s - ( h6 n t* ], m: l! I
- // Метод для смены состояния! u2 [$ f' s# U
- public void setState(MonsterState newState) {
( W( @6 l; t# _9 Z! L - this.state = newState;% W% I; B* f' q# E9 G. x. r
- }/ d' @7 _% e0 I5 P' {1 F
/ U* R2 u, E) j7 z/ R: T- // Выполнение действий на основе текущего состояния
# }. f6 T. ~* @ - public void executeState() {
) c% X j7 ?- h' h" I - state.handleState(this);+ v/ X; i }& e9 V
- }1 D6 `4 i$ _3 y/ v( B' x
- 2 o; E" z$ h6 C! H$ D
- // Геттеры и сеттеры2 F3 X7 K3 H$ f$ B
- public String getName() {
5 H1 W- t/ `* U7 e! ~1 Q - return name;
4 e# ` z" ]+ j - }9 Q; W/ w% ^- |7 N
& b0 Y+ H! e; M& z1 w- F/ k' W& U, {- public double getAttackPower() {
, ^7 O/ Y& |- N8 W) _. [ - return attackPower;
' s3 g: R! x! p# M- h o, ~, v - }/ S" l0 T" }" }+ U0 J" n
) X3 d; s- b8 y1 l- public void setAttackPower(double attackPower) {
" W' V1 H5 | C9 y" L5 M9 V - this.attackPower = attackPower;
, z2 h9 Q! i% I - }1 }+ g9 Y+ p5 \2 h2 g1 N/ p/ t
- }, r @7 j0 Y/ ?6 _# q
Скопировать код + P d& a" u) }$ K! n, p+ m I) D
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
1 n4 o1 y, ~# A; a( \5 \
2 E9 x4 p/ A1 S- // Пакет org.l2jmobius.gameserver.model.battle
, T( t2 z7 a6 T5 w4 ? - package org.l2jmobius.gameserver.model.battle;; a% y3 b3 S1 S; K# [
- ; z- k# }: I$ X6 P3 E: J' i( C
- import org.l2jmobius.gameserver.model.actor.Monster;
" X, L; V! {: `, s9 u5 ]. { - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;! s+ `' G+ h; r, [* ^4 ~+ d
- import org.l2jmobius.gameserver.model.actor.state.FinalState;
( T+ u; x% X8 e
4 u7 X5 N9 {. t* W. [- public class BattleSimulation {
# [+ m3 E% f0 L. G( @9 Q1 | - public static void main(String[] args) {
7 Q6 [; [& q" O9 B3 B2 e - // Создаем монстра с начальной атакой
0 g. x+ O8 u& B! a3 K l - Monster monster = new Monster("Дракон", 100);
+ K1 @ l& z2 D0 G3 W/ \6 U
) M+ X8 Q( q6 O! h- // Начальная фаза
2 y& x4 l K" }. d - monster.executeState();0 r# d7 Q& S& m% ^: ^* G
- 7 ~2 _1 G% N, `+ ]$ ]
- // Переход в агрессивную фазу
5 `$ S& G6 I' C7 S6 e8 q/ N - monster.setState(new AggressiveState());$ {* h/ n2 v1 ?2 Q r1 h9 i
- monster.executeState();
5 i' S }7 I: L3 m: p. z K; t T1 O
2 J' j" `0 D; _( s- // Финальная фаза
8 M6 N. n! ]+ k, R% V6 H - monster.setState(new FinalState());
! h s( L* f$ ~/ _ - monster.executeState();; n3 A" e. `. `) h
- }
/ m, M( f2 B+ @4 n, F - }
, G( }5 f: t+ T8 f
Скопировать код
1 ^" t5 @5 G+ y' G! |9 PКомментарии по структуре пакетов и классов:
* a6 ]" V- }4 r- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
9 J$ s# `) _/ r6 }# ~6 ^ ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.$ s# X, ~; J3 d5 x: Y7 A+ x# n; S
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!5 I: ]2 k- [! V) b) c! v3 J
0 j* N7 N8 y- k- }% O4 B: [) p& w- v9 Y! Q! g
/ E6 j9 U' N' O
& I1 C. q( X3 E s: J) y
2 O, o9 W8 W; Y9 `' d. \
* y; }+ _3 o( K; |9 m$ y% @* Y! a# M) j0 m0 c
, o7 `- L3 L. _$ G
( t3 S* u4 A2 h# x& D6 ?6 \; {' r# ~5 ]1 f r$ B- X% n
/ k+ n! c& y' M! J7 f+ ]7 h1 C( M( l3 H5 h
' C0 @. @8 z1 a- A# ]. e( ]1 K1 U8 l; y: {$ j
|