Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 5 z7 R/ Z6 h0 Z( D& H
1 s+ S( a* M, z( X' |' p' \
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
( ?/ y9 S1 A4 T. y0 E f$ Q
% w' S0 \3 L2 `) u# K7 o( l! I+ @Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
2 `1 M: U5 b7 |8 C: Y- N- |. f+ O) q+ y& k- E' C h2 R
- // Пакет для состояний монстра9 Z( U! |" ]( I$ _ ~9 V
- package org.l2jmobius.gameserver.model.actor.state;
" X/ w! J! i, O - + \6 N! m, G. h! X( O
- // Интерфейс, представляющий состояния монстра
# T# a9 b" K% U( f; y - public interface MonsterState {) T* I/ V3 u8 V! v9 A( Y
- void handleState(Monster monster);
/ r" m5 ?' L$ E8 w e3 U/ j# o ~) q - }
- q. T; @- y% o7 B' [
Скопировать код & a5 e- D3 B+ u' C- ^
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 6 t5 u; ~4 C# M1 W& {% Y6 i8 w+ W
6 v& q/ q7 e& l) ~; M7 v1 `" RЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
" @1 q( z, r6 ~6 l m; l" R
0 O# N9 G+ u( U5 g# SКласс для начального состояния монстра: x- w* N6 K$ @5 G6 s
- // Пакет org.l2jmobius.gameserver.model.actor.state* p9 ~1 `% L* |: ~& [- {4 M) t
- package org.l2jmobius.gameserver.model.actor.state;% T' w. i0 ]( A5 w
- # {8 z' m$ J3 s( _& e
- import org.l2jmobius.gameserver.model.actor.Monster;' }7 a2 I1 i6 }' U9 a( l. x. Y7 Z
, o& j9 A# A+ t% `+ P! y- public class InitialState implements MonsterState {) a6 H7 T7 r8 l2 @
- @Override) T! e8 C2 P& a, _; f
- public void handleState(Monster monster) {
( A; V% [8 V$ w+ `2 y - // Начальная фаза боя) W/ X5 L4 x% N! E1 y! ]9 O
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");3 U/ Z7 Y2 f @# l7 t/ O/ D
- }
* ^% Y* d3 {) |1 ?2 e - }8 W0 x$ r0 X8 c6 J; m; h; w
Скопировать код Класс для агрессивного состояния монстра:( t/ j$ i( E) {! @
- // Пакет org.l2jmobius.gameserver.model.actor.state* b1 e. @# a: W9 I& A
- package org.l2jmobius.gameserver.model.actor.state;
/ U% u+ C5 v, Y9 K. O, d/ l - 1 u: ^, o/ L+ D' c1 p: Z9 R
- import org.l2jmobius.gameserver.model.actor.Monster;9 S- w& j' Z* G* c. c# e* i
- 4 L$ P' o1 w- k7 e. s/ Z
- public class AggressiveState implements MonsterState {
3 G* l! H3 W% k! m) l - @Override6 `8 v G3 Z$ \& K+ I, v9 X
- public void handleState(Monster monster) {* o* v0 V' v/ X, F
- // Агрессивная фаза боя
1 X: w( U2 d' d; ] i - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
" M+ j9 O; O1 w& A' h' ?. f# a - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
7 E; x# Y+ Q% c8 o5 L' q* a$ X% F* v - }# {! \) m% I+ q2 D, J
- }
! e9 N$ X1 [, L
Скопировать код Класс для финального состояния монстра:& q7 z3 d) L7 J1 X6 k
- // Пакет org.l2jmobius.gameserver.model.actor.state
4 P/ [. o% H& V - package org.l2jmobius.gameserver.model.actor.state;1 ?% J& `% }9 U E
; O$ }: e8 V% Y; T% v5 k9 s6 s/ i- import org.l2jmobius.gameserver.model.actor.Monster; j; E0 L- u3 l! M3 `2 K. G# @
- 8 X: d7 z* c$ k6 b
- public class FinalState implements MonsterState {
" ^: R4 D8 y: O2 {: z- k - @Override1 f1 P7 Y2 i, k) Y+ U D; D# S
- public void handleState(Monster monster) {5 C+ K: U; g- R: ?
- // Финальная фаза боя
) o. f/ N% {5 c4 B - System.out.println(monster.getName() + " готовится к финальной атаке!");/ @- V9 m: l* X# K) J
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
8 F- B! o! J( e) D+ j, L - }
1 ~* H, t/ m5 G6 z1 K - }
1 ? S s6 o. T( Z$ e! |! Z5 \
Скопировать код
" u; a$ E" ^: ^- z/ x, lШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
* o" T6 L3 G; y g3 K% ~/ y$ y- // Пакет org.l2jmobius.gameserver.model.actor; {# J% H, H Z) h2 y% b' w8 T* x
- package org.l2jmobius.gameserver.model.actor;) v1 ]2 @& U$ J4 X% F1 ]# d
7 F# q" j9 E; h% [& `" ~9 q6 `- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
9 y$ ?9 ^% P* G$ \9 L, E' e. b - import org.l2jmobius.gameserver.model.actor.state.InitialState;
8 O+ m1 r% ~& L) V! w
4 x! }' B" i0 c* V- public class Monster extends Creature {, H$ r) |$ l8 Z6 P
- private String name;
5 j( M6 m! F$ m& ^ - private double attackPower;1 r, @. ^7 c& n/ z4 M0 A. X( m
- private MonsterState state; // Текущее состояние монстра- X5 Y" K z& ]' j( P: A
, Q6 z; h4 E4 t/ {4 y9 d) T- // Конструктор монстра
& N& F5 \- I% ~+ I2 o; ^! A - public Monster(String name, double attackPower) {
$ F$ N# j- F0 `: F - this.name = name;2 _/ M; }9 J0 E g1 j6 s
- this.attackPower = attackPower;3 Z& R$ g7 z$ K$ L/ Z- B
- this.state = new InitialState(); // Устанавливаем начальное состояние
8 w" S) ~3 @9 T. D3 z7 z - }* u" ~" t5 W2 `& G' j$ n O
- ' E6 K0 I: z( N( H" w
- // Метод для смены состояния
) H4 M) l2 k$ S1 ~; d - public void setState(MonsterState newState) {
8 k! d9 d6 V% ^* k3 o0 v5 _ - this.state = newState;
% _6 k; ]/ {" I/ c0 w9 r$ d% s - }5 p f G' x+ Y: |( A
1 c& L8 w7 O( W- // Выполнение действий на основе текущего состояния0 H: P) H, d, _8 E1 e
- public void executeState() {8 T- U5 `0 {0 U$ ?: b( E8 E% h
- state.handleState(this);
' c7 R2 d: ~4 w! d - }$ N+ O% F# L+ q% r2 W+ k
- 0 c$ {. k) e) F/ x3 ?) m
- // Геттеры и сеттеры
8 R, W& t% F S/ ?' p3 ?4 L - public String getName() {2 s' \3 G1 G8 q# E. X+ t/ A
- return name;
" d! K L4 Q0 l0 ~" u) t - }) n$ O% ^1 t! E \9 m6 Q
- 0 }: \: H" U3 U& o8 `, z% M! j1 T
- public double getAttackPower() {
+ F, q: b! L2 g - return attackPower;/ O, B9 t8 w, Q" w! |! y5 D7 ?8 n
- }: s0 T/ B' R4 ~$ B
- ' C! v ^% e2 T- A5 r# p
- public void setAttackPower(double attackPower) {
& ^0 w* q) ]/ j, T$ ^ - this.attackPower = attackPower;
2 W) B g4 ~+ ` S# v3 [ - }
' x$ J0 G; p, s, A8 @! F - }/ E; E* {& K% _# z4 L
Скопировать код
A& u, ~% |" BШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.1 W# ^6 O& G" x, |+ W/ t7 S
' C, C$ Y" H2 V) M1 V) I% ]- // Пакет org.l2jmobius.gameserver.model.battle" \- f9 B, r; X2 a- v
- package org.l2jmobius.gameserver.model.battle;
. M% E) u. v9 |2 ?
Y# Z% L n z- import org.l2jmobius.gameserver.model.actor.Monster;
' |8 v0 n7 }4 r3 Z* W - import org.l2jmobius.gameserver.model.actor.state.AggressiveState; t4 W6 Q4 h" w& G
- import org.l2jmobius.gameserver.model.actor.state.FinalState;7 H& |, r- q$ [0 o1 ?- ^/ J- [
- / Z. M6 P! I+ l- i7 _) x4 O
- public class BattleSimulation {
) C) V" ?1 T) a5 I - public static void main(String[] args) {# W7 H! k# Q' H+ H
- // Создаем монстра с начальной атакой9 G7 A/ N" D' [: {
- Monster monster = new Monster("Дракон", 100);1 t& G" ^9 D: S& q6 U2 Y4 [* E
9 y3 W, a1 e% t: m3 a6 y5 x- // Начальная фаза
# R8 f; U8 }- ^5 E1 y- R; n - monster.executeState();
6 ?, S7 @" E% e' W4 A
; A. n. A: c. _/ v9 D& Z- // Переход в агрессивную фазу6 {! N5 K& f6 H9 X# D- J0 L
- monster.setState(new AggressiveState());
4 h6 ]9 P$ E/ M& h - monster.executeState();
0 e4 h2 W* W' _: @& B/ d5 Z4 l
/ i& j+ Q" c7 g! Y' g5 h- // Финальная фаза
' I7 V M' @' ]+ m) I - monster.setState(new FinalState());$ n% ]8 t: V5 i
- monster.executeState();
7 _- i0 U4 t# ]) s+ k/ A4 ^ - }2 u/ v) |3 v. y! P5 B
- }
* \, G6 m5 y% _& A
Скопировать код . k, r9 M/ ]" z* t z; y
Комментарии по структуре пакетов и классов:
; k' K4 l7 P$ y5 [- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
6 K# ?( `1 C. G! D! p' \, P ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
2 `1 Z: W! W5 a! \1 z6 X* @2 oЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!) w9 T& z4 m0 e3 e& W# p3 L k; `
. V# L$ V+ W1 t$ Z; B/ o6 P
$ e( I, S; x( o7 w5 J# P6 n: y' k+ n/ ?' z# z0 U0 b% V6 }' }! N
6 K9 }+ \# q) K( z* S# y+ k
" k8 ~# k r5 G5 o1 F& q# y
$ Q0 p8 @6 Y! M) Q
3 _7 _+ w r1 _ _9 U# z! y) E2 X+ J" `& E5 n1 B
# v; g2 q8 N8 ]$ G$ t
& i% v# |4 ]& l+ H. l- ~0 X4 X; @. w. X j8 C
' W( V5 z7 O4 @
+ R& ~" c9 d7 [% m$ d; n
( z4 O8 I1 T8 m* |1 {" ?, B: ~4 N
|