Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 3 H7 ]% S0 i( Y$ X) U1 S) f1 R
3 M4 A2 l" j( X$ ^2 CЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
' \$ N3 A. L2 F8 f. I# d0 K+ T
! V0 q" y4 S$ ^ k6 H/ [Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
9 k/ z0 R% f5 H2 u! O; l
C" N, Q3 D, `0 m( U- // Пакет для состояний монстра; P* l; }- m3 X) D( g) C. o
- package org.l2jmobius.gameserver.model.actor.state;% A# D; m" N) @- d. o0 |
! X3 `+ x" w/ g$ o- // Интерфейс, представляющий состояния монстра
6 z6 X" P5 n" |% n& A, Q. ` - public interface MonsterState {
; N+ \1 p" U) n+ O) ~ - void handleState(Monster monster);
8 h" u; w4 A) r - }2 b7 ~$ H# C2 e5 r1 A% o$ W- _
Скопировать код
$ ^, h4 m- b/ b9 Z% x1 EШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 5 L" w; d- i; Z( ^. k: O
5 D. L3 B9 m, m$ a- dЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
% h; |' Z/ \; k% b1 `6 u& s* p; p; E! P' R
Класс для начального состояния монстра:
Y& i7 d, t: R1 v$ `( ?' R$ n- // Пакет org.l2jmobius.gameserver.model.actor.state
" ?& f0 y0 Q2 x! O - package org.l2jmobius.gameserver.model.actor.state;
/ r+ ~5 f2 m7 ]
, |8 J% i/ Q7 |6 z+ h9 ~- import org.l2jmobius.gameserver.model.actor.Monster;
3 {& [$ E9 N- F" A ~% N4 i; z' t - G1 ?/ @) x f% Q# ~
- public class InitialState implements MonsterState {
# U/ M; G, F4 S0 R7 u- R" J+ ^ - @Override5 d& u& f) b5 j- M! Z0 O- {5 h. y
- public void handleState(Monster monster) {
: H2 v) ]$ `! y4 T+ k2 t - // Начальная фаза боя
/ k7 G& b9 b* D0 m# ? o- @ - System.out.println(monster.getName() + " начинает бой с обычной атакой.");
" m" N; K) g" y; g0 _ - }
5 {0 I- L& l( D$ u# D - }) ~' z) T& e! E7 b2 T8 z) W* x. ]) J
Скопировать код Класс для агрессивного состояния монстра:' N" o" [1 A5 S" I1 s3 }
- // Пакет org.l2jmobius.gameserver.model.actor.state
9 `- G3 v; N& i! B - package org.l2jmobius.gameserver.model.actor.state;
$ K3 v% ^2 c1 e, q; h7 j - ( Z/ z/ R8 C: F
- import org.l2jmobius.gameserver.model.actor.Monster;# G8 H2 { C: s
- + T, @; A1 F0 a9 o, L4 X8 ^8 g
- public class AggressiveState implements MonsterState {4 C- f& K- o( b5 M( e! t
- @Override8 e: _# f; e' s/ Q
- public void handleState(Monster monster) {- O5 `8 Y) @5 ?8 z
- // Агрессивная фаза боя" R5 \) E d9 p8 c \5 F
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");* B( l+ O4 B, M2 J, @
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
( D. g0 c3 L' d. s3 [& S0 [ - }) I9 l/ I" t8 ^- l/ u
- }" L2 O3 G3 h3 @0 f% o5 X; L
Скопировать код Класс для финального состояния монстра:
+ \ A5 o* _, r/ A- // Пакет org.l2jmobius.gameserver.model.actor.state; O4 T+ X; I: y8 t
- package org.l2jmobius.gameserver.model.actor.state;" ^$ b: ~5 a7 v0 ^- H0 C
- 7 \2 c O" @3 u z
- import org.l2jmobius.gameserver.model.actor.Monster;
" g8 b9 j o8 p; {" s
) u8 d6 |1 ~* l5 g- B/ `/ a- public class FinalState implements MonsterState {0 g4 |% N1 G$ i3 G9 c
- @Override
+ j2 o2 @5 O" b8 A: z# |% H; f - public void handleState(Monster monster) {: q9 Y3 E. D+ s
- // Финальная фаза боя$ Y* n) \6 j5 K
- System.out.println(monster.getName() + " готовится к финальной атаке!");
% E, Z) q* b0 D( e6 v - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки/ Q' ?3 r+ k; V# t9 H8 ^( E0 _
- }3 N/ L" V& O8 b* k
- }
3 t6 n7 P! E. l: m2 N
Скопировать код $ g! G; u0 R3 ?: M9 ^) J
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
4 x- k7 ^" O7 t9 \5 C- // Пакет org.l2jmobius.gameserver.model.actor b/ g* j4 A- u( k' c- F- L
- package org.l2jmobius.gameserver.model.actor;9 G8 ?$ V% l2 G+ N# J( L$ u
- S! C) g, j) G: C- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
) B; v" C4 S8 v9 N& \2 N/ A) O - import org.l2jmobius.gameserver.model.actor.state.InitialState;
0 g1 G- v7 @: D1 |# W; s) n
, P0 u8 p; r1 k: K6 J- public class Monster extends Creature {4 v% A4 N! z7 X" K* w% x. ~
- private String name;
, P [' k+ S) o - private double attackPower;
6 x' |$ }( I {4 y" Y9 ~3 T+ p - private MonsterState state; // Текущее состояние монстра4 [$ }0 ]" @# z1 U* v
4 b' e4 W3 A5 i, X! Z$ m% V; K" h- // Конструктор монстра
% d6 C# n1 q: Z8 j6 D - public Monster(String name, double attackPower) {
" J; M. }4 j" o( v) z0 b - this.name = name;
: @ s8 t) H& E1 B6 s$ l# m K - this.attackPower = attackPower;
8 z/ g: [# @4 b - this.state = new InitialState(); // Устанавливаем начальное состояние
4 _5 ? m9 i1 d9 k) c! N: H+ L& P - }
2 N" Z4 s3 y- r6 M - 1 W3 o4 |/ V/ a, t d* `
- // Метод для смены состояния$ b; W E: S s1 g+ C
- public void setState(MonsterState newState) {
" A* l1 _6 J* a+ e - this.state = newState;
; D+ \8 t3 {: r) P8 P( _4 X" N - }2 h6 h5 g# `6 y w! z' Q. }
- ' f8 x7 E/ o* `7 h1 q
- // Выполнение действий на основе текущего состояния. e+ ]! V3 Q7 P7 N
- public void executeState() {
) ^. I% `& `# G1 F - state.handleState(this);1 c/ B+ X6 x+ _1 f; P: `8 x [
- }
& K& w0 T5 d7 d
5 Z4 v/ u' k. }- i3 K9 I- // Геттеры и сеттеры$ ~4 b4 w$ _' L# d! x$ o) g
- public String getName() {
( x, O2 R- B" ?: S! o - return name;
! F4 l1 c/ Q1 m3 |8 _ - }) Y/ W% {- d+ _; n/ L( w
- . P/ x8 S) d! v1 I" Y g) R
- public double getAttackPower() {
8 u% d/ [1 R" \3 k1 M+ u$ a; w' x - return attackPower;
0 ]$ O& q( P& `+ R: L* v - }& z, i+ r6 J+ r% i* f
- 0 R% |5 T% L* w6 s
- public void setAttackPower(double attackPower) {
! d4 b) P6 i- G- L3 J# m, V( n5 D - this.attackPower = attackPower;# n4 A$ Q) L1 v; `/ `& O
- }
; _! V( H; C6 Q _8 Y* ~$ o - }
9 d/ \0 [: K- `5 R: h
Скопировать код
; B8 O' Z9 i3 h! h% ~Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.: s0 \! T+ d- _% X; P3 m
, j# n! J9 `/ q- // Пакет org.l2jmobius.gameserver.model.battle. ~9 d" @1 H& ~- J2 j: D: B7 Q
- package org.l2jmobius.gameserver.model.battle;
3 l5 N% i5 _. M5 s* Y% ?% E5 G
4 `4 W) H: i8 h- q) @- import org.l2jmobius.gameserver.model.actor.Monster;
+ J/ j! _* Y# y- ?0 D( G w8 [ - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
7 [6 r6 _7 P* m6 @) _1 ?) B) e - import org.l2jmobius.gameserver.model.actor.state.FinalState;
. I0 {5 i: E9 O# r
4 g6 [& [" D4 M" [' i, ~- public class BattleSimulation {% Q6 {( p) {6 Q
- public static void main(String[] args) {. h' o% ?2 t, M2 j
- // Создаем монстра с начальной атакой @% V8 A+ P$ {7 S, n
- Monster monster = new Monster("Дракон", 100);
8 h4 V, h7 Q$ }5 _1 F
' L" d K3 U' p$ C- // Начальная фаза
7 Q1 X# d0 D9 B* E9 r- Y - monster.executeState();" \% @0 m2 r, `6 K+ W- ?
- & j& m2 H* N4 F$ U" k- d& I$ ?
- // Переход в агрессивную фазу c" F8 R% d; f5 C# I
- monster.setState(new AggressiveState());# s* Y% v# @6 h' x
- monster.executeState();' P, z; B0 z: \. ~' ~+ x# v
b/ A3 {, @$ ?9 L V- // Финальная фаза
- u# j3 Y: _; | - monster.setState(new FinalState());
7 ?7 B0 e, A% |0 J) q - monster.executeState();0 e' c2 w2 [# c5 u
- }
: D& B; A1 E' Q# K( k5 J* j/ q - }
9 O) j; t% M8 q2 U& X# z
Скопировать код 2 P' Z; L9 Z7 t
Комментарии по структуре пакетов и классов:
; M% B. o- t ^8 e1 o: F: x- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.$ D: d5 c1 t8 ^' q" k& N* k
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.6 b2 ?0 _, O& X& f* W
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!$ s, d* `. n- m+ h% K' l" @
7 ~: f. n9 V5 k/ n% Y% N t8 J5 _6 r, ?$ P1 `) D
; m3 P" |3 m1 y$ Q4 h
+ Y. a; q( d. n" B8 O7 l* H' h5 r% \2 K A" A& \: K7 f6 x
6 D% ?! s% }, u+ D/ a
, ^% Q2 D' Y# ]- {, {! E$ R# Z( a/ c) Y
, I6 {5 ~3 I; H( F
8 w) M. m. H) ~4 w" y. F4 L
5 R3 c( _+ x# U3 i4 b
# \4 v7 n$ n3 K: i+ O3 R/ L
& S# W/ T$ K- U8 _6 r- \: V3 N% {8 T/ b- y9 D8 q( z. h
6 N- N! G4 V- C) j' C. I E
|