Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). . B8 G/ W6 R( {' B3 `" `- |# h
7 y/ [- l4 \0 W N. G8 E) WЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
- N2 m9 f) ~' ] }1 s' p- d
: ^1 k" n6 `6 Y. C, sШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
7 @8 y) o+ p% Z, ~# y K' K2 m$ A# u8 P- R r4 g4 O
- // Пакет для состояний монстра9 j; t) [+ x! }% {. |1 T& X5 w
- package org.l2jmobius.gameserver.model.actor.state;: V+ \/ {1 x3 |2 `: E
- 1 N2 H1 }7 B5 s, S. b7 v3 d
- // Интерфейс, представляющий состояния монстра& j1 t, ?; O1 t" R/ o4 \
- public interface MonsterState {$ U ?" J( ~1 l
- void handleState(Monster monster);+ g4 u' s# J4 L1 e) p. M. [
- }
, f! ^% I$ D) J! n$ T) G
Скопировать код
' I4 T* J( `2 DШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 2 V0 a- I7 M+ J0 q
$ b5 w5 o7 w( S: s2 z+ E# rЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
6 H; S/ }; z: r2 X) ? i1 j' o# M
Класс для начального состояния монстра:
& q. z1 ]+ O4 `; U3 f0 l- // Пакет org.l2jmobius.gameserver.model.actor.state. f8 \( g4 X5 n* f
- package org.l2jmobius.gameserver.model.actor.state;
: C4 l: V+ G/ q- z+ j4 J2 ^, b - , x2 @+ L V/ p5 v
- import org.l2jmobius.gameserver.model.actor.Monster;
* P m* B+ ^, K+ ?6 h# t; [# }, | - ( w& t* I' F5 i9 k5 \5 l
- public class InitialState implements MonsterState {
9 V( g/ G, g" Y' R d" `- n* t - @Override3 y8 J+ L7 N% o' F9 `1 l# y5 `* k
- public void handleState(Monster monster) {/ ]5 I; J- c: v* [6 E' h
- // Начальная фаза боя5 I) K' n* u5 _- z
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");
: I( j/ H9 f9 \7 L% c8 T - }$ T& n$ g4 z+ k9 T4 C
- }9 F1 q' K1 I( ?% C& v' r
Скопировать код Класс для агрессивного состояния монстра:% G5 q# X4 ^" k# O2 f4 x
- // Пакет org.l2jmobius.gameserver.model.actor.state
- g) k! g) s2 z5 Q/ b% q5 u, z - package org.l2jmobius.gameserver.model.actor.state;; P5 m0 E9 z; o: _; P, J) G3 s8 z
. v* z3 H; j1 P% j, j, J* m9 {- import org.l2jmobius.gameserver.model.actor.Monster;7 W1 b$ {& h M" A0 j
% l, J$ ~2 |. l+ a+ f- `0 V- public class AggressiveState implements MonsterState {
! m; m4 [4 l! l7 p- `8 m" x# y - @Override; s/ o2 i: z1 f/ q; y' x
- public void handleState(Monster monster) {; s" u% m6 a/ b8 p9 A) |$ K- N i
- // Агрессивная фаза боя
1 }/ n. i1 R, W; g& \: l" `: ~ - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");9 s7 x5 u/ u( [0 P% g
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
* o6 P) o5 t+ T8 M3 ?' x - }
+ l) x+ l8 `' l1 N8 g8 w - }3 S4 u/ h1 [* X4 t$ a- `
Скопировать код Класс для финального состояния монстра:
9 t9 y/ z0 `% o% |& R- // Пакет org.l2jmobius.gameserver.model.actor.state5 V* h0 |, e, ~6 \
- package org.l2jmobius.gameserver.model.actor.state;
2 @0 `! X3 J$ L( v2 [ - + V v* d4 X# D2 R) A& M
- import org.l2jmobius.gameserver.model.actor.Monster;
# g, G" L, f9 i$ r. r' G B2 ~7 P
) C% u, k" k5 o) f! W0 k) q- public class FinalState implements MonsterState {
' ?3 a/ Z) r7 `* I) x - @Override' x8 M7 m8 N. L- V+ }" v" e
- public void handleState(Monster monster) {( J! ^" N4 a2 Y* j2 w3 p, K! c
- // Финальная фаза боя
. O$ T# G- _) b3 \ - System.out.println(monster.getName() + " готовится к финальной атаке!");& h) S3 q' X3 r' z9 c( M
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки9 D7 I4 r1 w- K& A% z. Q/ O8 U
- }1 X2 T% G6 p6 z0 D( o
- }
" c4 `; T% r+ n& U
Скопировать код ( b: ~ i% y* f% N% a6 R, Z8 E
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
# l' S( |; l3 o+ a5 E$ e1 B, H" s- // Пакет org.l2jmobius.gameserver.model.actor% W, g, ~7 S0 } `* Z9 l
- package org.l2jmobius.gameserver.model.actor;
4 @ `) H2 [9 p - # y% w% K( E9 v S4 y5 N0 x; L
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;0 p: {( p. J8 A; d/ o- z
- import org.l2jmobius.gameserver.model.actor.state.InitialState;
7 k) D& s4 D' @% p' K - 0 c2 y5 ?+ i) s0 R# a. j
- public class Monster extends Creature {/ w8 Y$ M. x; q& q4 n3 j
- private String name;
& @8 t2 g% Q$ z3 ]8 v - private double attackPower;. v! O9 r, r* L2 X1 d1 ]
- private MonsterState state; // Текущее состояние монстра. N% s; `& v }% T* j+ I# G+ ]5 K
6 b3 f0 T* W% Z. m; o- // Конструктор монстра
% j) s; B4 ^! i6 N - public Monster(String name, double attackPower) {4 x5 V" [8 ?) M8 r4 p. e+ R. [
- this.name = name;
; I; ~0 @% s3 z/ l$ s$ _, ^ - this.attackPower = attackPower;
' g6 b. J9 f7 ?6 Q - this.state = new InitialState(); // Устанавливаем начальное состояние
0 S& i2 a) D s8 }: j' b - }# r; h' [( \/ L7 R- @( _5 r* d2 G8 a
+ e, f* X) d5 U- // Метод для смены состояния; D& F/ N" q: J$ [, k" {9 f
- public void setState(MonsterState newState) {3 K( m6 w+ }/ w& u/ [6 E
- this.state = newState;0 Z) ]/ y! f% \' l' g7 N' [7 s
- }
3 v( w! c& R& t9 } - % \; y* \5 L% w: n J- u
- // Выполнение действий на основе текущего состояния$ H+ e3 l0 r) q
- public void executeState() {
3 b7 e* j% [0 O - state.handleState(this);$ r* m5 H( p& ]7 |
- }$ \ {" C9 o3 w1 L; t3 H: P; Z
' _4 ?; s, I, f$ s- // Геттеры и сеттеры
$ u/ o9 @$ y" K& r7 _0 K$ | - public String getName() {: N4 o$ }9 w" n8 n# w: u) O# E
- return name;
9 b& }% B3 ~; Q0 g' j - }
3 K; d2 J1 ]8 e4 L4 r, S
; e9 g5 \1 Q5 h/ l/ G2 T/ E- public double getAttackPower() {9 V: b& G+ @6 k0 G# @
- return attackPower;
: p( c; t8 F9 R# J- o3 P' H W - }! R9 ~9 C+ h; R8 _
- " ? x4 W) p5 }
- public void setAttackPower(double attackPower) {
$ L4 Q4 |% @+ t1 [ D( q, A - this.attackPower = attackPower;% Y9 a7 K9 }- e
- }$ C. N" r4 ^8 j* T! f
- }
% s0 }4 u, e1 m* |7 W f9 X k+ y
Скопировать код + j9 ^7 H# q& t% M3 I& u
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.6 i" I7 e1 R; m& L, B
3 N2 t# C# M, N) u7 x+ j9 J5 y
- // Пакет org.l2jmobius.gameserver.model.battle5 E9 }3 v# `: M& q' F
- package org.l2jmobius.gameserver.model.battle;$ W; ]* m0 |& ? U
- , Y5 ?% b! W& u) @5 i
- import org.l2jmobius.gameserver.model.actor.Monster;
6 S* I/ [- g% Q* e/ n( f; i- F! r+ I - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
7 D: t# h- g# H5 n7 K6 R k - import org.l2jmobius.gameserver.model.actor.state.FinalState;: R. M7 \, H) z% t+ K# M% p: S
: L( V% m9 b( z' {; a( Z- public class BattleSimulation {
- @, s4 R4 a' L8 v+ t+ N1 A/ v' }$ t - public static void main(String[] args) {& g$ x+ N- W# x& e0 \
- // Создаем монстра с начальной атакой
, }8 b. Q( H9 H% a - Monster monster = new Monster("Дракон", 100);8 g. m# w5 D, P5 g6 q3 ^* Y
, H8 P) t/ I5 e9 p, A, e# A- // Начальная фаза
}4 m: h- r" ^8 ` - monster.executeState();, s- q# O3 _" V+ f! \
# ?" W! [# T: P! A' }$ ~- // Переход в агрессивную фазу
) ]; j" Y( m- o% U7 s6 ` - monster.setState(new AggressiveState());
$ H4 k* e+ h j9 ?% f* t - monster.executeState();
9 M g8 d) L6 Q4 n+ \: ] - - m' F2 I& T) V2 y
- // Финальная фаза
& K/ z0 f7 c; G. g* C/ z - monster.setState(new FinalState());
- q+ _4 e+ k5 S' p+ k9 i - monster.executeState();4 b4 i! u/ N% S* q; n& R6 p5 S9 E
- }0 O! f: s- k2 G. I& y
- } m9 s; Q: f! G
Скопировать код
& l" X. n$ y: V3 M$ fКомментарии по структуре пакетов и классов:
; z% o/ @ q+ M9 p- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
' o/ I" K* _& i ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
r: Y; U E# \, Y0 @/ i! Q2 T/ YЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
% A: }1 {3 i! Z0 T, x6 G n2 K* s- f; D: v+ \1 z+ O
8 ~3 m2 X4 C+ c' H1 c) Q9 F. Q
; ^" o9 t5 `( O; i1 R, f; F, |
# a& F' J" T3 F/ j2 H
3 w' J% X- j6 n& i7 o% B5 ~, `. ?) r
% O; o* I% z, s
3 }1 J d4 m9 p2 K2 W4 D* R7 l/ Z) @4 u/ I2 Q h
5 ^! [* u0 ^" L) }
" P1 N3 r: { u& J* b+ d
3 \9 H) m' ~5 h- y+ w6 f
. Z% R6 ]9 k2 v5 \+ C3 M" |1 Q g2 A+ a
|