Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). " {+ i; Q# x! l: O1 e1 A) a+ o7 |
# I- p+ c7 A$ B/ V4 E7 R' i: r
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
5 \( T0 t) G% [0 B- K7 I
& ?/ L! ]3 F! H0 p9 {Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.6 z! [. X4 {# A3 s- `* m/ a+ p
. g5 A8 z% |: c/ k* D- // Пакет для состояний монстра
7 w5 s- t. N, t( k2 ^7 _ - package org.l2jmobius.gameserver.model.actor.state;: ?0 T. H( I/ B# F
* Z; l) R/ y0 u0 g1 K7 a5 e- // Интерфейс, представляющий состояния монстра
9 e( _) f, F$ E* X+ E4 W - public interface MonsterState {
Z2 A# _/ ^; w% i- I - void handleState(Monster monster);
7 l) D, x/ G* l4 N - }
" K1 C& N5 D* E1 {# b: p* ]
Скопировать код
4 K0 b* Y* U* [4 Q& }. uШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
" E; D# C; u# P$ Q Q7 s7 n8 N7 I1 O* x( E$ i
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.: ^2 u b& E! @
, `+ o! r/ U s3 a) g: P/ v% F2 y
Класс для начального состояния монстра:5 w; N7 r- S) l2 j, {) B7 k
- // Пакет org.l2jmobius.gameserver.model.actor.state
1 D- |; _ T* t: j: S - package org.l2jmobius.gameserver.model.actor.state;) |2 I4 S% `0 D: j: k
" e# I' s3 d" d3 T0 v- import org.l2jmobius.gameserver.model.actor.Monster;
9 P" a& s/ w+ i$ D! k. U
: o- K% b4 ^ H, S- public class InitialState implements MonsterState {% t. x+ J: ^ G7 ^
- @Override4 ~* F. F+ c, i0 s( n
- public void handleState(Monster monster) {
4 d5 \& k; ~+ { - // Начальная фаза боя4 ^8 w2 w3 J$ V% L" M6 p
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");
0 U/ h9 R- H. |; n - }$ `9 O# h5 y% }0 X7 A! i
- }
1 F3 j9 y# e5 g: A
Скопировать код Класс для агрессивного состояния монстра:
" W( j1 |: t9 d v) _! d- // Пакет org.l2jmobius.gameserver.model.actor.state
5 @% k: V+ z" l5 T* l+ \ - package org.l2jmobius.gameserver.model.actor.state;* _0 J7 Y# [4 e: s( z4 x
3 H5 }. Y* ]- H+ J- import org.l2jmobius.gameserver.model.actor.Monster;
0 n4 L: g7 Y0 Y8 X: O/ S' v - 0 I# d# s z1 X& A% q" k4 K. Y! x
- public class AggressiveState implements MonsterState {
" k2 M+ h' A& O- `- H - @Override
2 O& J5 u$ O. G7 t& e* e1 V - public void handleState(Monster monster) {* U; l. r2 [+ t2 c
- // Агрессивная фаза боя+ k( `0 `- p: F
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");' O! O6 J* p; Q. x2 m6 p h5 Q8 G8 v
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
6 r0 v+ U# h2 r7 q/ s - }
, E" q; R# {$ E4 e- P9 s$ Z f2 H m - }% o3 E* E3 o) ]
Скопировать код Класс для финального состояния монстра:
! }% W: O0 N; k q" p- // Пакет org.l2jmobius.gameserver.model.actor.state' C6 S- ^8 D; I8 r
- package org.l2jmobius.gameserver.model.actor.state;3 O2 [# ~+ C; D6 G& _3 w l
) R: L6 r# g' N- import org.l2jmobius.gameserver.model.actor.Monster;
c* _; f% Z* ~$ l+ d
& e- H5 Q* V$ S; ?3 h* s% ?. d- public class FinalState implements MonsterState { @3 q0 p1 ^: r* Z3 q6 ?
- @Override
j% ~0 \# {7 X: ^, a+ ^, U - public void handleState(Monster monster) {
( p/ [5 Z, F7 J) D - // Финальная фаза боя2 X3 [9 A3 V# B" i) }
- System.out.println(monster.getName() + " готовится к финальной атаке!");+ h$ f6 \7 i( |* _- |, H
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
% h' Y9 H7 _, \2 B - }
% G" K* P( S7 e# d/ j: u - }; }& t# _' f4 e# |6 I
Скопировать код # `& I, M* o: Y A& `0 b S. h5 Q
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
2 m! o2 X4 Y: |) L2 O' _$ D ?- ~$ o- // Пакет org.l2jmobius.gameserver.model.actor
' M4 R' ?0 n/ i! B0 m, H# \3 n; t. _ - package org.l2jmobius.gameserver.model.actor;
0 c) e8 n, G" K/ z7 H
. ]/ }! @0 E! ?. B% J. o+ F+ N( K- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
. f8 l3 ]' h/ Y7 M' V1 }) K - import org.l2jmobius.gameserver.model.actor.state.InitialState;
5 p0 \. n2 B9 @
5 }* y4 Z( r+ W- public class Monster extends Creature {) E+ ?7 |8 E5 C
- private String name;
1 f! o7 |6 Z: ~) V; y! G - private double attackPower;/ v# r* O, r8 m0 f _9 Q
- private MonsterState state; // Текущее состояние монстра. b% ]- u1 D) [4 U1 m2 f
- ' W+ x) x/ j7 @* g
- // Конструктор монстра
, d3 z# O& c* [8 r1 M# h- y - public Monster(String name, double attackPower) {
4 ^5 r$ R+ ?" M, s - this.name = name;" W) Z9 i8 s# x5 F9 N- A4 n
- this.attackPower = attackPower;
8 Y, m ]. S8 \, {" Y - this.state = new InitialState(); // Устанавливаем начальное состояние. q6 u6 N# ]1 W# @5 a1 C& l
- }
% D, |5 q: i, H5 c9 O: K. `/ C - $ s% b& }4 B4 Y# _1 O" N: G& P
- // Метод для смены состояния6 K$ P# B. A5 f% j5 P# U
- public void setState(MonsterState newState) {9 j: F) X. Y! w' ^2 q8 d2 ?' J" z
- this.state = newState;3 l0 t, N* ^, ^2 Z9 x1 |# u6 |
- } {* q. H- ^( p1 _3 m5 V
- 0 r+ y$ o7 a( d: }1 Y1 k
- // Выполнение действий на основе текущего состояния
* A- H+ \' z, T' V( e( i7 q - public void executeState() {. Y' o0 k0 a, @7 x. l
- state.handleState(this);
7 i3 v; f2 x9 W8 v( V! w; C# S' Q - }
) I; ]& P+ B+ p7 a1 S - 2 K8 x' r; Y8 L# M: C3 [& g1 z
- // Геттеры и сеттеры: ]1 Z$ P; a) I3 \( B
- public String getName() {
_" u) ?1 a- d: _/ W3 M: x - return name;
: H/ ?! P! B9 n0 l G" K6 d. b - }
' g# K5 B# A8 n E, V7 r; ~ - 7 f3 b" p. [+ M2 d7 P
- public double getAttackPower() {; ] M' N2 R* p
- return attackPower;! ]* j! Z) @ ]8 D4 L/ e0 E) h
- }
, }! u' \6 {) A+ x1 ~
+ `, y. i# L% y; U+ R0 f+ g" }9 e0 K- public void setAttackPower(double attackPower) {
4 { r1 K% S# w# z6 u0 z - this.attackPower = attackPower;- u: Q) f1 {9 W1 q
- }1 k" o0 }6 [) W0 u
- }) z! U4 L0 G: h$ a
Скопировать код
% @4 a0 p0 f! N, V' NШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.( J( t( r7 X1 Q( v, |8 }
2 a7 p3 d/ e9 H* o9 G- U9 s4 `
- // Пакет org.l2jmobius.gameserver.model.battle' ?8 s+ }! T; t* M, c
- package org.l2jmobius.gameserver.model.battle;% Z7 K* `% L9 | r7 u& k
% R+ u( `- v" L. i- import org.l2jmobius.gameserver.model.actor.Monster;( [0 m- E' z* r- [, e
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
$ {) {0 K* @" w0 s - import org.l2jmobius.gameserver.model.actor.state.FinalState;
4 w- y2 x9 i3 [4 _, q2 D. w: e - i g5 p9 t9 Y; @7 E
- public class BattleSimulation {# y6 H; N1 \. z3 @. O* ~
- public static void main(String[] args) {5 K" M9 a* f# Y0 H
- // Создаем монстра с начальной атакой# e/ j7 o9 f" r" v1 R% t
- Monster monster = new Monster("Дракон", 100);& F: a$ y7 l" `3 M# Y3 `8 x2 y# ~ M
- ; W+ v: [6 d$ ~
- // Начальная фаза
6 \; J/ {- c6 J- M - monster.executeState();- ]; l# M- V3 h( V
- 0 F) y- d2 K4 `. e
- // Переход в агрессивную фазу/ k& B; O% f0 h! u) Q* Q5 c9 v
- monster.setState(new AggressiveState());6 X' z. i9 B0 Q( z7 t3 O
- monster.executeState();
, C" @3 S5 N: [- G
; c6 | I) ~$ t# ] J5 D- Q- j- // Финальная фаза' ^) ^' C8 m+ W0 J) |5 M
- monster.setState(new FinalState());$ Y9 {% F2 c& i# j# a) @# f
- monster.executeState();5 _2 B1 z- `0 O
- }; O: g) i! b0 c7 v: B: B
- }
# [/ l; l% H$ j, ]/ I3 b
Скопировать код # L9 @1 Z |$ Q" \0 F
Комментарии по структуре пакетов и классов:$ t/ B# C4 o; H* G9 m |' h- ^
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
1 U& K' T& T& E% V1 h) R" p ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
' B6 ~# ^8 U8 oЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
& r+ ~" S. B) o; h- g' ]( a3 y5 u/ `
: y3 [9 Z& d j3 ]4 B0 L' Y: _$ o) ~( ]
" ^! z: u6 @2 L2 z# Q X5 M4 `6 K. D% q
- w7 z% s# W2 M/ d
/ [3 r) _+ x8 F+ \/ E2 S- u, H- o6 \) x
$ O3 \. h5 s% w }# h/ n' ^, `7 T
3 `- i- V2 B# [7 T# A4 E/ y3 {- o2 D h; a7 H
2 `/ S0 V) ^: B R- w9 p6 G
8 L q2 a4 f) D7 f- @, e, G3 R7 D) l8 q4 k$ d! x
; s3 }8 i, b0 j |