Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 1 ?$ ^2 Z" l) O9 D- F
* L( h/ Y4 q; ^2 E: s IЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.6 b/ R# J ?: k# V# |( o& _/ d
$ I( J+ I0 ?: h3 M0 l
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
- s- \& n+ ]& V& f. E* N* G1 i) r( [( Z5 X& e! E" ~* d( X3 v6 Q
- // Пакет для состояний монстра6 O- L4 e7 ^7 c* K7 t; B
- package org.l2jmobius.gameserver.model.actor.state;/ d6 ]; q8 z u+ z$ I7 [
1 u, [, }& w" A, X6 w' d- // Интерфейс, представляющий состояния монстра
6 @5 s# o: s0 r$ O; B& T1 @ - public interface MonsterState {5 r s7 p! |' }
- void handleState(Monster monster);" F& _" B0 v. P; ^% Y) E& B3 g
- }, h# U; X L! `% _* h' F* q
Скопировать код
1 T0 c( u8 | z$ v) ?! ~! uШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
& B" u& [% j, B# E/ \9 n$ v9 T3 F2 D, ~) S7 e! J0 G
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
% r4 c( X, S3 t/ a9 v/ L4 z- z/ b) A+ Y7 S: m0 l9 J* l1 Z, P. |
Класс для начального состояния монстра:# i/ O# r/ J( q* Q
- // Пакет org.l2jmobius.gameserver.model.actor.state
* c) A* ^2 O, q5 L - package org.l2jmobius.gameserver.model.actor.state;
8 y, o E& e% q, i( C/ e8 J# ~
" C' g7 I. ^6 l4 A" G6 B- import org.l2jmobius.gameserver.model.actor.Monster;
# ^/ I/ N d4 p5 i9 P$ I5 ] - 8 Q" u, m/ R/ z8 [' O5 q: L& s" J! b
- public class InitialState implements MonsterState {& K" V6 W2 ]' U
- @Override0 ?8 e# H: G1 B. y3 C" S+ }
- public void handleState(Monster monster) {+ U* a' O8 B; e$ t
- // Начальная фаза боя
3 x2 q* x: W7 L, L, g& B R - System.out.println(monster.getName() + " начинает бой с обычной атакой.");6 W! [8 B7 O y" U
- }
) B) |5 a# ~2 { - }
( z! }- C3 B! G$ H1 U; [' [2 l
Скопировать код Класс для агрессивного состояния монстра:
/ i' j0 [ p t) A+ y! \, r3 H$ E- // Пакет org.l2jmobius.gameserver.model.actor.state
7 `8 A& Z- F* o - package org.l2jmobius.gameserver.model.actor.state;0 P* V$ n& a$ o& k6 U! H5 g4 W1 T
{: G( I* a8 ^0 |- import org.l2jmobius.gameserver.model.actor.Monster;
& O) P# B: K: e" B' M c" D
4 n& h9 E# _& G* j% ]/ d' m. M6 M- public class AggressiveState implements MonsterState {# W: P0 ~1 C8 \, ]& I" P% Z
- @Override
5 ?( e2 E" B( P' R) y! i0 p- M7 d- L) [ - public void handleState(Monster monster) {
* L$ X' L) u. t% v - // Агрессивная фаза боя
9 m9 ~. R+ G: C/ B - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
* i$ J8 k3 U% a0 p& E, Z - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
8 ^4 O" c s0 y6 U" G% Y$ p - }* y# x- s# M$ S/ z9 n
- }
0 g, [3 m1 \( u
Скопировать код Класс для финального состояния монстра:0 P+ e/ Q/ s6 s$ Y# H/ g% K
- // Пакет org.l2jmobius.gameserver.model.actor.state$ j( v: v3 | N6 q! `7 R& t
- package org.l2jmobius.gameserver.model.actor.state;
: \, w0 ` h$ h! h- t6 Q/ k - % {' E! ?1 }9 n3 N. S( ~
- import org.l2jmobius.gameserver.model.actor.Monster;0 W- ~! M3 S3 Y/ K* C2 q
- 0 b3 b' ]. y7 v
- public class FinalState implements MonsterState {
% J& u2 U8 z( s/ u! [ - @Override# s2 P @* R9 q9 L: ?1 D" [; |
- public void handleState(Monster monster) {
7 g5 t g2 R( F, O - // Финальная фаза боя
6 y4 D. s: U2 s* K - System.out.println(monster.getName() + " готовится к финальной атаке!");% ]6 ^! Y' I9 ]5 u! E5 Y! \3 b8 @4 D
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
- h' x8 {$ I" C b/ g/ N# ?: n* j - }) Q! A {& Q: C# W3 w
- }
v K2 m% S% t) D
Скопировать код " z0 M t, y% f5 | }# K+ j& ^
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.6 v$ B5 J" |4 Q! O* F# L7 U. n* x
- // Пакет org.l2jmobius.gameserver.model.actor
8 l) V; G+ Q& B% g - package org.l2jmobius.gameserver.model.actor;2 P' d- M3 S- {& U% k: F: j- V
3 z. k- W, U7 W7 s- import org.l2jmobius.gameserver.model.actor.state.MonsterState;8 Z8 M% \* D& U w
- import org.l2jmobius.gameserver.model.actor.state.InitialState;6 U$ Z; ^+ y6 e- x. G- F8 D" {6 \
6 |8 B9 B; X) s8 \- public class Monster extends Creature {5 W9 C3 c+ i5 m
- private String name;
5 g( s/ K: h* Y4 P' {% R) O - private double attackPower;
! N M9 A9 e2 q( u- A( j, Z - private MonsterState state; // Текущее состояние монстра6 a; D" R- K( _
8 C& z: d" \$ H- // Конструктор монстра& b% g* r/ }( ~9 p5 @* D" K; ~
- public Monster(String name, double attackPower) {* e) I5 h7 ^8 d: O+ L) C
- this.name = name;: z+ L' b( o! t+ T- n5 o
- this.attackPower = attackPower;
, o+ S$ K- l @$ v! }! Z - this.state = new InitialState(); // Устанавливаем начальное состояние
m) L% X: m, f( K8 \ S - }
/ t1 Y' d2 K/ ?8 M4 u* |
1 b5 L( J" f' M- // Метод для смены состояния
8 q8 S$ v' f) b+ V$ K2 Q& Y - public void setState(MonsterState newState) {& c' a' ~% V4 i1 X3 r
- this.state = newState;3 E5 Y* R( O; \' \8 }4 S
- }% Q% `8 e1 ]3 w, e9 ~
$ ]4 h% j6 l% P5 Y4 F( d- // Выполнение действий на основе текущего состояния- A0 Y7 H0 b1 X$ Y
- public void executeState() {
$ z) V. \4 c9 a2 g: t+ ?0 E5 i& ] - state.handleState(this);/ z9 g$ c3 U+ R
- }
. X" O' s) m& H" @8 p
% E( v, o, o- u- // Геттеры и сеттеры
" ^: C, e& A+ F& V- S- T5 U - public String getName() {3 W' \+ L, r. w2 i
- return name;
$ t1 i; M9 g7 Q, K4 J6 ~ - }4 `7 F' T8 \7 R
- 3 f( b) E' Q* x* J! v( h
- public double getAttackPower() {& ~* m Q! D1 V: u' }# e, Q
- return attackPower;. K8 P& l4 L) o' N3 D
- }
5 S8 l( Z \' a6 E" @9 I - + R$ B$ l- f' Y9 i
- public void setAttackPower(double attackPower) {
, {/ J2 y* R6 H8 t# N# g - this.attackPower = attackPower;
' t$ G0 c" O+ O$ v$ {9 d - }+ T, n$ w+ m* o1 E5 E
- }8 [8 ~2 Q( ?& [6 k: z& p4 c& h! ]4 k
Скопировать код ; k. m9 h( N+ K, G( W
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
& a9 U9 T; p9 g0 Y0 n4 X/ i+ J' W7 O: K. F+ C
- // Пакет org.l2jmobius.gameserver.model.battle
0 C' A- d0 n0 }' O2 p, f - package org.l2jmobius.gameserver.model.battle;
* f9 e# `0 p6 M Z% d( Y - . }$ \8 N/ A/ ?+ v2 O
- import org.l2jmobius.gameserver.model.actor.Monster;
" P0 C1 }. C" [1 E" v6 Q - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;7 _+ Z, [/ {# i" g! J. D2 U9 u3 v
- import org.l2jmobius.gameserver.model.actor.state.FinalState;
- W/ s- w- e6 y# q& @- ? F
9 w* }, e0 i+ d% c. }- public class BattleSimulation {
4 V- c: i* k! W/ z, w, t$ q9 D - public static void main(String[] args) {/ y$ E0 N: D. J) @) v
- // Создаем монстра с начальной атакой
) l( [. V0 e/ ^+ I - Monster monster = new Monster("Дракон", 100);, @3 x. p6 J6 F3 B5 C8 J
- & l1 t1 T! _* t2 O6 R, v
- // Начальная фаза
0 y/ d+ w- }2 k: j - monster.executeState();
9 _6 c2 i3 |0 Y+ v! L; ^/ M: h
1 y7 I7 n1 Y* l4 C5 ^- // Переход в агрессивную фазу# c- t" n. S. i) U
- monster.setState(new AggressiveState());* m+ y8 l9 L" P4 G2 Y* X" ~$ g$ ?
- monster.executeState();
4 c- u$ N( Z! e
& P5 Y) E- `* T/ x) |3 b4 |- // Финальная фаза. C" d# z5 C: ~6 [
- monster.setState(new FinalState());
4 N& Z4 g7 N0 T- o6 o& J, y - monster.executeState();
6 p; m4 W" a# b* o: W" h/ w - }" A# ~6 G( b6 b/ w& v
- }) }; i5 ~: u6 E! s8 A% B
Скопировать код 2 R7 E2 h7 w! N: I
Комментарии по структуре пакетов и классов:/ C$ v5 n$ |1 M& M
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
2 N, j9 ]* g; |' A/ B0 [ ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
/ ^( u) d& i' X+ N y: b) ]Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!4 _, ~; k6 G1 h- } L( o& u* e- X8 K& V
( e* g4 Q1 b3 { \; C0 x( Y) d
8 y1 L% [5 @, s% B3 }4 V3 q8 e; O, Z+ C( ]$ V
4 }+ a9 ~' c3 M% a* i5 V+ @5 w) L( R
; z& r' t' i- J2 a
8 ] O J* G) }
6 ] W2 J* r0 n; h# {
& x! A! |5 A k8 B9 n. B- {, I$ P5 ^+ z6 ~' r2 `' A+ O1 m" H2 c
& y, l7 |% s# y0 c/ ~- Z
* k7 Y# }: G! R4 b1 \: X& g% b9 d
` ]1 d7 j$ I* N: t5 n2 t( ]8 {* G8 W# A9 d" ?( ]# p
|