Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
6 }2 [: O4 r) \, Y9 {/ W6 N! @! F4 p6 V
" M* O5 n6 f7 P% a3 Z0 \Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.8 S6 ?/ }7 p ?
2 X/ s4 ~( m3 V
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
; w' Z) [$ O2 ?* O; Q3 |
& n3 b5 F# L" Y; K3 a- // Пакет для состояний монстра
) L8 r* U6 \3 S0 b$ q - package org.l2jmobius.gameserver.model.actor.state;& ~' y; S$ M" ]6 G+ \) _
# e$ J. l+ ~4 f: n. `- ]- // Интерфейс, представляющий состояния монстра$ k/ F+ m+ X, {
- public interface MonsterState {% |, z- X/ a- L7 c0 p0 A2 z* w
- void handleState(Monster monster);
! F3 z) @3 b4 M. ^0 k% S6 c - }$ [- {+ Z7 W1 S$ D$ w* q( f/ U
Скопировать код 3 s4 e3 @2 j0 N2 W( B6 ~& x0 t
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. # f& r1 V& k9 F+ M
; E3 Y3 c9 E! V! \7 Q% F; z
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя., [' T B$ { j. R1 [' b8 L
3 q m$ T- ~9 p* `' Y% _$ l3 n0 d- kКласс для начального состояния монстра:4 k! v. G M$ y% o: `. l
- // Пакет org.l2jmobius.gameserver.model.actor.state! v* T! {" u1 C
- package org.l2jmobius.gameserver.model.actor.state;
0 q1 a P2 R' c/ z; M% r3 _: \5 Y
( `" j7 T8 N$ {1 a5 L* e- import org.l2jmobius.gameserver.model.actor.Monster;
1 C4 S- q! l5 A# ] - ( K* h$ r% s* H4 }+ r0 G& R
- public class InitialState implements MonsterState {, p- ]2 m# R1 `" ]0 m
- @Override
$ l5 ]4 b9 C( | - public void handleState(Monster monster) {+ d* ?/ u) D) k$ g( D
- // Начальная фаза боя
( T7 K& I8 [( W3 V* U7 J - System.out.println(monster.getName() + " начинает бой с обычной атакой.");
/ J- S0 [! P$ p3 Y( y - }" K9 W. a0 T2 u1 D7 W2 A4 I" X4 z
- }3 _4 z% |/ h3 O
Скопировать код Класс для агрессивного состояния монстра:
- Y2 K3 \* ` h( V% w- // Пакет org.l2jmobius.gameserver.model.actor.state
1 N+ w$ x q) A - package org.l2jmobius.gameserver.model.actor.state;+ S) z, U1 D( {4 H+ a: ]+ e) a& H
, w) ^, ]5 H" F6 |; R1 G- import org.l2jmobius.gameserver.model.actor.Monster;
5 |) Y) L* C* ^" y0 q( A! U/ ]5 I
: S6 f9 {! V* p- g) b9 g* h- public class AggressiveState implements MonsterState {
. }* J7 M" ^: D6 c - @Override
& T/ V$ x# }9 o/ I2 |- B% f( ^ - public void handleState(Monster monster) {7 Q) z% S5 K; P; ]* C0 B5 d9 a+ I" C) x
- // Агрессивная фаза боя
" E. B' A) h4 l - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");( V" C) z- w) X" A7 K
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки" m/ Y/ U6 z2 q h
- }
2 ]: T5 j# L5 D0 q# i2 a - }( g, m* m' m7 a5 y+ U0 s) w3 T
Скопировать код Класс для финального состояния монстра:
* I ]) x! {6 j" b, H1 T/ |: `: C0 X- // Пакет org.l2jmobius.gameserver.model.actor.state
n$ t0 _1 q; K9 h+ r - package org.l2jmobius.gameserver.model.actor.state;- ^# @( m2 M' f5 q9 M
- 5 A' T, c4 h. D$ B3 i' S
- import org.l2jmobius.gameserver.model.actor.Monster;
' L5 b; z0 z/ _8 C0 m - 5 ]8 J" Z9 a; ~) z) C& V
- public class FinalState implements MonsterState {
$ ?6 ` f- O( F, M - @Override
9 K1 @, ~/ Q s9 v% p, t - public void handleState(Monster monster) {2 S; A S1 u$ j6 \% P6 j9 I1 z
- // Финальная фаза боя
% f+ B& ?/ \, ~! R7 `! j' w/ l - System.out.println(monster.getName() + " готовится к финальной атаке!");7 \, U! f$ |+ X( u6 f
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
/ H* y- d+ L r+ a1 j+ ] - }5 E2 o; `4 {1 g& S" }& [: d! [
- }5 n" P7 Z/ S1 L2 Q! Z2 A$ o3 t
Скопировать код
* P0 l1 Q) P$ F! t7 m7 y8 n8 [Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor./ a' x/ _# y4 J K3 x( j
- // Пакет org.l2jmobius.gameserver.model.actor7 W0 q9 b3 b) z8 ^
- package org.l2jmobius.gameserver.model.actor;/ w+ _. u, K$ X, ?6 n2 @; J
- 2 S) z! e, t9 t$ Q. z6 j
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;( s, S2 z: j9 Q. o# i1 ~1 n' b
- import org.l2jmobius.gameserver.model.actor.state.InitialState;
5 x. F# a0 ^1 L
1 T2 | M' E' V- public class Monster extends Creature {9 i+ e l8 x, v/ i
- private String name;# a4 `+ S" h. S/ W6 U
- private double attackPower;( [1 N" c. ~3 `/ ?/ T3 s4 o
- private MonsterState state; // Текущее состояние монстра
1 W1 y+ O) R2 P. W4 d1 Q, w - + @, ?% c9 k% D3 F/ x
- // Конструктор монстра
; U' Z& o( e; w' Y* @; L# l - public Monster(String name, double attackPower) {0 ]4 F9 Z' }: u0 ]
- this.name = name;, ~! U$ K5 @4 [. @$ }) x! O1 u5 S" T
- this.attackPower = attackPower;+ q7 x+ T$ n# c: N2 K
- this.state = new InitialState(); // Устанавливаем начальное состояние- U- F7 H- f' v3 _
- }
+ W, W& J8 ^6 k4 C9 d; r' L2 l# G
3 I) r/ J' F+ z T- // Метод для смены состояния" E1 Q2 l2 x( G& T/ H5 p
- public void setState(MonsterState newState) {0 K4 X V2 n7 G( c& @ w. I6 n; P
- this.state = newState;! ^0 |2 k& q3 i7 W$ J
- }& t- q9 g8 s# H8 D0 m% t
- / k q I# b; C# F! ?, K
- // Выполнение действий на основе текущего состояния* B; _1 p. \3 \1 T
- public void executeState() {
7 n/ B' w, O8 I' V8 V8 N2 c5 J! s - state.handleState(this);! L7 X3 ~. e) g* f2 {0 z+ r0 f) c
- }9 h* L+ S! o6 _% z
- 0 H1 [% h+ m- z0 p, n6 X& O8 F
- // Геттеры и сеттеры6 k1 a' d7 q7 L/ Q7 D
- public String getName() {/ a* s* N5 a& _* M& S8 g$ E
- return name;
, {: {6 V! X6 n& S4 B V" ~4 a - }
3 _( K4 C4 T6 C, H
( H3 w8 C1 l# }' o4 {+ y% y- public double getAttackPower() {
0 j& q! Q! d7 M8 H+ f# n5 v- s - return attackPower;
/ U5 [: {. R; @' [ - }
; @4 O/ C: n& {9 I
' _" X7 J$ A* v7 C& N! ?# U- public void setAttackPower(double attackPower) {
7 F# s; m+ C' g# { N - this.attackPower = attackPower;
! w4 j \+ d% T+ ?6 [0 [: h - }! O7 h' y# P7 u9 D+ }4 p
- }
* v, ~/ w9 P; u
Скопировать код
w6 j. j8 ^8 Y7 LШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.! C. v5 |/ u1 o
+ z( L" t2 H7 x4 C0 [& Z- // Пакет org.l2jmobius.gameserver.model.battle2 g. B: ~! O4 @; Q7 M/ F
- package org.l2jmobius.gameserver.model.battle;$ m! q* m4 N/ m
4 q+ f, l6 M2 x% J6 P. ?3 v$ i- import org.l2jmobius.gameserver.model.actor.Monster;4 I' N1 s5 o. }! o
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
) M0 k- h5 B+ @" Z. y, P/ L8 @ - import org.l2jmobius.gameserver.model.actor.state.FinalState;
" v: V, `3 \9 j+ | - , g4 K* A" Y# b
- public class BattleSimulation {
$ \" w9 H& O' z) W6 y( |4 R - public static void main(String[] args) {4 |- F* N$ c6 C4 o# u
- // Создаем монстра с начальной атакой
& }- q( k2 O: R h6 G; t% k+ G - Monster monster = new Monster("Дракон", 100);
4 q: H+ R+ m. c( Z. J - ; H5 Y5 h; q# K- R# i* C
- // Начальная фаза
# O2 f9 B7 t5 L6 ^: n) g. Y$ W - monster.executeState();
) D/ d# i2 S+ ?8 \, x% v( C8 | - 2 E1 A8 y: ^; S+ z5 f; Z7 \
- // Переход в агрессивную фазу
, ?1 Z) `, C" f- h6 P( Z - monster.setState(new AggressiveState());% u: S B" g# i! l- W
- monster.executeState();2 u% o2 T7 W. S) U. J! L2 _2 k
. e! {/ U+ p% b) J- // Финальная фаза, e, f* o) }. i* D. B+ n
- monster.setState(new FinalState());, N# G1 B3 {& l2 B& D& ?
- monster.executeState();; a6 y' Y- y0 }+ D3 J
- }! ~8 _. Z- v) s
- }
. w0 K* ]8 B' e2 a3 y! n: e8 U
Скопировать код
% O- C4 [" k8 T' ~& [/ U6 bКомментарии по структуре пакетов и классов:7 u. {! R* \: S1 q
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.+ [* u9 I; @4 m/ H
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.; D" ~8 a" u0 ?5 f# P: D! f' j
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
# m" D P3 `2 H3 Y) _4 f5 v' o
7 P# P, R; s$ ^, K' d% n
R. V: X# E3 N. N
" e& l2 R& m- f$ h( [. j& s4 E% l) ?5 l4 w, Z
, N; t9 o# i, J
Z/ P% U! x( p" s/ f
' K9 }, n) t4 N) M, Z7 q; h; I$ g1 v- Q
7 n, x; [5 G* h( _+ |6 B
$ z! g5 ^, C, C& k
, M: ?- n5 h" W3 {! p% V/ A8 J/ h
. h% M0 D/ a M7 \# O# n
1 W% F0 k0 a9 @& `% e9 c
|