Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
( ^1 \9 }5 B, q1 V6 J8 U! u4 {# J
" s2 o. b7 K! A7 X7 n0 NЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
9 i j7 n* y {" e3 t8 y
3 d- C9 P0 _- J9 D) lШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
7 _, \& J L% ]/ D9 T" ?3 H6 {" p$ D. o& J& y* A9 e
- // Пакет для состояний монстра0 [) z; q8 O w: r
- package org.l2jmobius.gameserver.model.actor.state;
: f! o; q+ l! `9 Z - & z# {' i) Z; L2 `( t( R% U
- // Интерфейс, представляющий состояния монстра t7 ^% Q3 M. ?6 x+ Z- a
- public interface MonsterState {) t2 S* p! i( B5 i
- void handleState(Monster monster);
2 z; q1 @5 l" w- o: M( _/ I- ]6 c3 ^$ ? - }
+ l3 }* [# Q* s8 N
Скопировать код / T$ r( k6 A) U5 D5 o U
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. . s& j5 x6 o% R# ]% l8 q0 H
0 o3 G( f' M( w
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.# D3 ]+ l j7 r
" a. Z- n ]) z+ P4 ?+ S2 {Класс для начального состояния монстра:
- N! j- ?3 n& i, [5 x1 p- // Пакет org.l2jmobius.gameserver.model.actor.state
" e" w0 Z3 }6 f3 Z7 n) D - package org.l2jmobius.gameserver.model.actor.state;: t# E+ M# y: ~6 A, m! P
4 Q' v( X4 ?& e! W3 ?4 g4 d! Y$ f- import org.l2jmobius.gameserver.model.actor.Monster;4 b4 ?5 i, m* r! U+ F
* w8 r7 W9 k! B. _" l- public class InitialState implements MonsterState {
0 X8 \, p& Y7 B1 }% T: W - @Override% ?8 ]' @) ?; ^8 _6 z( a& B2 X
- public void handleState(Monster monster) {5 `6 S, H6 l& U4 u/ O2 T. t7 y
- // Начальная фаза боя% _" D1 [# N( t
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");* N* `6 w5 U. |% X/ l$ S
- }
# R: X) `, E2 z) O( g: r - }+ x& @9 v: W# I" @
Скопировать код Класс для агрессивного состояния монстра:0 o4 W1 U D; Y _2 G2 L( D. A" \
- // Пакет org.l2jmobius.gameserver.model.actor.state
) C$ x S% e. S! B6 ?% f - package org.l2jmobius.gameserver.model.actor.state;, |; r7 w9 }0 X7 @
6 `% ^, G( n: x- import org.l2jmobius.gameserver.model.actor.Monster;
5 S9 V! J- T8 m( U0 _5 p
$ _3 S* R0 \! \" W3 R9 M$ P1 ]! l- public class AggressiveState implements MonsterState {& ~4 t* O* l( c3 W" l
- @Override2 s4 |. }; a! f9 R# [) a1 c6 C( u
- public void handleState(Monster monster) {; D8 I; Z% Q* H$ S0 ?5 l+ u. \
- // Агрессивная фаза боя- I8 r. g& P& v0 [1 e
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");9 }) N& ]( e" i% K P y& W
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
2 {7 C9 Y, L1 \ - }9 l2 B) e4 V8 s; k9 s/ e
- }
$ g8 i, a0 f+ X, ^1 j- t6 ]
Скопировать код Класс для финального состояния монстра:, Z) S- S! k) Z E' S: X1 P6 y
- // Пакет org.l2jmobius.gameserver.model.actor.state+ h% K& e! D5 C8 j
- package org.l2jmobius.gameserver.model.actor.state;$ u9 m: p2 v4 ~! m. Z r
- * j; U2 w' t" C' p' _5 i: X) x$ U0 H
- import org.l2jmobius.gameserver.model.actor.Monster;* ^2 u# {% v& y* v
2 j% {8 A( Y( y& ?- public class FinalState implements MonsterState {, ? L7 I# ]' y
- @Override. i+ E9 A( }% ^* n s" ^& z
- public void handleState(Monster monster) {1 m% ^2 D) E3 s
- // Финальная фаза боя
# P0 k3 }' ]. `, h - System.out.println(monster.getName() + " готовится к финальной атаке!");6 Y( C2 ~8 u3 ^$ @: H
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки( I' L! D8 G6 `, O* H
- }
. ?9 G9 J/ {. h; \ U/ ] - }
e3 U+ o0 k, J
Скопировать код 7 ~& D) I/ B0 d$ E& Q; {
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
& [& t2 `; V) P! d5 ?- // Пакет org.l2jmobius.gameserver.model.actor
+ Q& t0 Z# I4 O u/ U - package org.l2jmobius.gameserver.model.actor;
: j, y! K5 p6 @% P5 k; Y$ X - 8 W- |" S# N; _' X+ a0 D: t
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;& ]! x' U9 T; ?% _+ ~2 I
- import org.l2jmobius.gameserver.model.actor.state.InitialState;* d, \6 k" \6 f5 W* A6 _
- : g; {& |$ y1 H' P
- public class Monster extends Creature {
% F; B: m) W% o: K% E# h - private String name;+ D: m7 L: K1 c9 y
- private double attackPower; |( y/ Y) ]! N1 F9 a
- private MonsterState state; // Текущее состояние монстра3 } P4 Q: S9 l! S, R
6 U [0 j" O+ Y* O$ R8 R3 e1 D- // Конструктор монстра
& {+ n" y; u6 G+ h# w3 G( @ - public Monster(String name, double attackPower) {
% [* G0 c! t, }" ]: U - this.name = name;# O7 l# J. N! G
- this.attackPower = attackPower;: t8 L9 q: S& F% _& p7 Z
- this.state = new InitialState(); // Устанавливаем начальное состояние. ^4 l) ^1 E2 f H6 Y# p0 X
- }0 v/ }3 Y/ v5 X" k9 v( S
; }) d0 R% o% [- // Метод для смены состояния
% v+ p: } R* ]: d+ k - public void setState(MonsterState newState) {
% n& ^$ }% D# { l6 H - this.state = newState;
/ n5 p% ]9 N& c - }
* a7 u t H0 ] H4 V% i/ u' u6 [
- n* R" F- x8 C: E- // Выполнение действий на основе текущего состояния
$ B" z. A- P. N1 _% i/ u - public void executeState() {
# ~( {/ t) f! J: f - state.handleState(this);
" t: X0 B X" } - }
& X1 K) b0 s; [3 V
" v% t) O& C3 X) ^7 q9 J! p" P5 t8 v+ ]- // Геттеры и сеттеры+ Z1 a: P# |+ T- a& J$ t' W
- public String getName() { n) F* A# I) T6 E6 e. w
- return name;
0 q7 _% e1 g/ V0 H8 Q - }! y7 I7 E/ w8 f/ Q( [* O
& b0 g9 H" y% ~% E- public double getAttackPower() {
1 W( D$ i* ?* D/ H& {9 p - return attackPower;
O6 w# ?+ [+ y+ [7 \ s - }% a* \% x6 S; r' a8 a- B4 w; W; v& b
- ( c6 p3 _; C- L6 C, S$ P$ }
- public void setAttackPower(double attackPower) {; s9 u$ h$ u/ G* j4 \4 P
- this.attackPower = attackPower;, ^1 K. m2 b, a( Q# A, c
- }
, B, r/ u9 n) I1 l' t - }3 z1 a5 ]4 j2 b R" B8 B( \, h
Скопировать код
" A9 w: l* P$ I) e1 U" t, ZШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра./ G2 ?9 O6 s- F- x
6 ]' n: e$ ?1 w) i1 n8 ~- p+ z
- // Пакет org.l2jmobius.gameserver.model.battle$ z$ ~; w/ v" Q
- package org.l2jmobius.gameserver.model.battle;5 }5 C. D8 G/ z o$ K
- 8 j w: U7 p5 q3 ^' u5 N
- import org.l2jmobius.gameserver.model.actor.Monster;
8 _% p- ^( l3 H6 P: M( G - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;" i$ S n$ k5 i. f
- import org.l2jmobius.gameserver.model.actor.state.FinalState;# P, c ?! q2 x' D: i
- ! ~0 y( t" Z P* o H
- public class BattleSimulation {
4 F; q$ I& Z! b - public static void main(String[] args) {$ A, Z7 }. F/ H% m
- // Создаем монстра с начальной атакой0 Z, O7 W# n* E% Y: O2 b
- Monster monster = new Monster("Дракон", 100);5 p1 ~5 q. J% v- Z
0 V" f0 H: j8 x3 _4 y, r A R- // Начальная фаза- o. P4 F5 |& C/ l
- monster.executeState();
2 Y) d/ R. Q9 A* |( m$ M - 0 d- D! Z) }3 t3 P) B
- // Переход в агрессивную фазу7 C" R/ y8 ]) V) w6 h3 I
- monster.setState(new AggressiveState());
7 a$ M+ P' Y+ U5 A# L/ N. ` - monster.executeState();
* `, G; ~& |( l! d& g4 V' P: J. V - ) _7 a* O p. `
- // Финальная фаза/ D' W) Q8 s6 e8 Q
- monster.setState(new FinalState());
0 \( h/ I1 w/ b* z \6 W - monster.executeState();6 H2 }1 x6 i( O2 ]. W0 I
- }
5 P6 K& L+ K D; C% x2 { - }# S( |$ m/ N) s8 h7 O% F
Скопировать код
4 X; A. M# s5 u, i3 @Комментарии по структуре пакетов и классов:
2 z; t* f( u0 s( N- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.5 a/ Q! r: Z$ x9 M& G
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
Z& ^/ A6 J4 A3 n9 i6 sЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
* e$ t& g3 m) Y. b7 @2 r3 ]' \* q7 {
3 v% x! W; e. I3 B, s
9 w- B" Q# c2 W {
G( E/ G4 e, D5 m5 o1 _2 P) E( V
b; ~. _) m- r% S! w/ Y- e7 |+ J
4 G2 ^! x! d/ T8 h4 J
& L- p+ t3 _ C% y: ?; u! m5 W3 o# e( \: ^; {! M
+ E0 `, E7 T! E1 n; M. `0 d- U/ u2 X0 m% O- t% ?- J
. t3 c9 W7 D% ~ q2 m- ]" M
2 K+ A. |. ]1 N; o m y1 L% w
% O C: s7 B V, n: G |