Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). : \; A" ?0 Q' H; P+ L
: z. X) y$ F8 C- ^Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
* Y# J9 x9 T# ? |" F v* x5 `* O4 V" G; N1 i8 l
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.2 p3 s( W; i" Y8 G( Q( O: f
/ \" {* W$ e. L! E1 R) ]3 K7 B
- // Пакет для состояний монстра* C0 V3 R6 L x. J( O9 c
- package org.l2jmobius.gameserver.model.actor.state;
# {& `8 y ?, d N/ L$ { W* v
7 I, E4 ]; U3 ?8 D0 c: h- // Интерфейс, представляющий состояния монстра
$ o& `/ R) |/ O+ j+ z3 x$ I5 ^1 v) G1 |9 A - public interface MonsterState {
4 F8 o& I. G2 t# E6 g' r - void handleState(Monster monster);
8 ^* t: D9 a+ a8 w( P8 q - }2 ^- m! V* @4 |5 {
Скопировать код
: W& a# d/ l* l. X6 k6 i+ }Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. # n. `' p! s O) n
( }# w# N" q. r' |/ ~2 U3 e
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
" R K: [4 W7 e( ~( @
: N* `7 q6 c- v2 o& R2 AКласс для начального состояния монстра:0 T* [! w5 w* v7 N8 v% o4 w( E; |
- // Пакет org.l2jmobius.gameserver.model.actor.state7 i. s' C7 I/ Z( u9 G/ C* u9 |6 z
- package org.l2jmobius.gameserver.model.actor.state;( L% o% N* q/ n: a' d! I
- 0 \ I' `$ j7 L6 M! K/ U
- import org.l2jmobius.gameserver.model.actor.Monster;
; b# @/ V2 j: H; r1 n. a) Y _6 } - . R( C. I9 X9 x7 C2 ~6 A
- public class InitialState implements MonsterState {
1 I B, V! ^8 p7 P6 j5 H - @Override
6 ^) W- v) d9 m# _6 v - public void handleState(Monster monster) {
) F# O4 H4 f& |3 ~9 n - // Начальная фаза боя
& v7 m! z$ C0 ?) I& E6 d! }5 | - System.out.println(monster.getName() + " начинает бой с обычной атакой.");
5 {' S/ s( @ B$ R5 N - }
1 s" [8 {! h$ _7 ~, j' r - }
* _2 n7 Y, s5 _/ u# c1 u9 J' E& A- s
Скопировать код Класс для агрессивного состояния монстра:
, i+ y$ ]# u n3 \2 V# c% G- // Пакет org.l2jmobius.gameserver.model.actor.state7 L8 m+ M) w7 `
- package org.l2jmobius.gameserver.model.actor.state;
3 R8 U* g* D, ^: G1 ^* p! U) } - / K+ Y& c8 J4 w7 i& a( ?) i
- import org.l2jmobius.gameserver.model.actor.Monster;. C6 P0 V8 R4 R
- - A) ~0 J" _+ P6 g& A8 ^$ `
- public class AggressiveState implements MonsterState {
2 I# `+ ^- N8 l0 q - @Override7 }$ r) N5 b( O6 d* f/ Y. Z
- public void handleState(Monster monster) {
6 r6 N& P, z4 t: f. |7 T, C - // Агрессивная фаза боя, o9 D6 }1 o5 Q
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");+ x6 m# d# u+ d0 I
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
0 W7 A: Z# P7 p: V P# r - }& K$ }, i Y* L; G5 ^
- }
. E8 y( U: A1 r* ?8 u4 \
Скопировать код Класс для финального состояния монстра:
" J1 ^: y2 \3 y/ z" d- // Пакет org.l2jmobius.gameserver.model.actor.state
" h* J5 }4 O$ x8 }3 V$ m4 [ - package org.l2jmobius.gameserver.model.actor.state;0 E) [; `$ U- o
1 u: C/ u( b6 U: B( A" a( }- import org.l2jmobius.gameserver.model.actor.Monster;
) I3 R0 a/ J- H6 c. R/ v - ' Y4 y* H% f9 p
- public class FinalState implements MonsterState {
7 ~6 j2 \: b4 e, C - @Override) g) Z6 M0 ^7 {* O/ g
- public void handleState(Monster monster) {' Z0 O% E: \0 |; |3 W
- // Финальная фаза боя$ i0 g1 V1 \+ m6 Z3 C/ p* X
- System.out.println(monster.getName() + " готовится к финальной атаке!");
2 K+ t5 C' L* e( h% H - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки6 p1 A% |# Y3 p1 t d( ]
- }# Y. b" }0 m; K0 R3 ?; d
- }* N; _6 v( B; t2 R3 q
Скопировать код
. r5 w' a* k/ G1 V Y, oШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
' N: w1 ~+ _; d8 Y# r- // Пакет org.l2jmobius.gameserver.model.actor' e8 c6 Z( Q1 N' l
- package org.l2jmobius.gameserver.model.actor;& e: A& A( s$ i, U
1 j2 P9 O3 u. H# v$ }- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
$ t% C: D9 T1 H! h4 f3 e2 i - import org.l2jmobius.gameserver.model.actor.state.InitialState;0 N% Z+ _- ^; G4 J( ]! ~4 h
: L' z5 _. y; D# u; s8 s! O- public class Monster extends Creature {
! H1 m; k A! O3 F7 z) J- i3 C - private String name;
( C2 w- g" t& a+ R2 k$ e) T' u - private double attackPower;+ Y7 x+ l* S: e& c
- private MonsterState state; // Текущее состояние монстра
I- i# C( V+ e, }
9 x3 D% ^" v3 R3 W. [- // Конструктор монстра3 `7 c, Y, L1 b. z. Y$ X
- public Monster(String name, double attackPower) {* `! E, S2 e. x4 k
- this.name = name;. q- W3 u# J& A
- this.attackPower = attackPower;2 k& o1 L+ O6 i" Z8 y' t0 M. _
- this.state = new InitialState(); // Устанавливаем начальное состояние+ D/ Q6 o* q3 o+ J+ a) P
- }
; f S3 ?1 a9 B# X - ; w; }# a* g! i9 C
- // Метод для смены состояния
0 `) v5 \* @5 D9 q- d3 `0 U: e - public void setState(MonsterState newState) {
2 k+ f5 j+ M) N _3 Y - this.state = newState;4 L8 Q- W! @. t6 q2 e
- }, k% G8 X5 h- p. D# p
( U! \6 T7 }$ C3 |, N3 X) Y5 r- // Выполнение действий на основе текущего состояния
: ^* N e- r- `# k" ~ - public void executeState() {
. W0 t( D' h5 a5 U* i: r - state.handleState(this);
1 b, R1 X* t2 u& d) d - }
6 b8 h) W! n1 P# e - ( |' R; f+ y2 i1 F
- // Геттеры и сеттеры; l5 Z+ k3 M. B3 n8 ~5 X
- public String getName() {4 V) B: B( p, z* `" p1 o1 d/ D
- return name;
, s) J* [: S R" Z1 d+ P1 a% R$ [ - }
* b, Q( [8 U- S% {% ~1 z t - . O) y% M1 B- z6 R2 [" z# {
- public double getAttackPower() {
: |8 |3 Q0 G4 E$ u - return attackPower;8 v& ^" t) \0 W# h" B9 L( i
- }( j+ k6 \# X. e! J8 w
7 W' O l) ]' b! S8 |- public void setAttackPower(double attackPower) {8 z9 K9 y5 V! s, k3 E
- this.attackPower = attackPower;
# g( }# T8 u9 K# j - }
1 W- S( e) [0 r$ P& T: d- g - }
% W( l" U9 P0 M0 G, q) J
Скопировать код
' ~, V y) t+ \" w. d4 X3 PШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.8 G# e4 Z: ^" B9 i3 y
/ n. l" }4 `- ]- // Пакет org.l2jmobius.gameserver.model.battle% n# |3 X+ ]: _5 i- D
- package org.l2jmobius.gameserver.model.battle;
; Q; t6 G8 [- K/ R3 h8 [
. A4 @2 F. |3 r) J4 C& a& J- import org.l2jmobius.gameserver.model.actor.Monster;
+ M% S+ y6 B6 @8 ~5 H - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;0 B5 j: K" U9 v2 A
- import org.l2jmobius.gameserver.model.actor.state.FinalState;( o Y8 A& T5 Y! A- A1 E. b. i" p
0 ^8 s1 g* k& p+ U: F% O0 L$ n- public class BattleSimulation {4 v! \# h) J0 l) C
- public static void main(String[] args) {
& B+ ~4 u' K" t$ P7 @4 C5 k - // Создаем монстра с начальной атакой
' @) Y- J' c9 C5 |+ m/ ]9 S# A - Monster monster = new Monster("Дракон", 100);: @( n G3 o- y. u6 B* {4 Q, H
- / k% V, {# ]% Z' m
- // Начальная фаза# K: @! X4 ^- p
- monster.executeState();
$ _3 n0 k! ]6 n - ( |# t( u+ z+ u
- // Переход в агрессивную фазу
$ w- I. G2 O+ ^3 ~ - monster.setState(new AggressiveState());
) y3 Y. O: `4 q$ S, y) U- H# X - monster.executeState();- z. B" V' s4 U7 Q; r6 q% h' Y
- 1 Z: q6 n( v D$ Q, ~8 L
- // Финальная фаза
& @. M& R6 @8 D' z/ i - monster.setState(new FinalState());
. ]; F3 E0 W# o S9 [6 g - monster.executeState();; P* _' P$ w, ~5 ^- s) B9 O
- }3 w0 ^( i, F4 q8 ~( D
- }8 u4 W) G7 v% d% q
Скопировать код & r( T$ ~% V4 |% V* j' c
Комментарии по структуре пакетов и классов:
- Z6 B" G3 I, S1 t( i: R- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.* s V: f' r2 ^2 v
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
1 O( X: A% t8 [1 G- p3 o$ IЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
' l, D( Q1 B- G- D
; T, y8 u& ]/ t8 _/ Q) q
* ~ T! Y- s' Y2 k* u0 \, K4 L8 a' u
6 M/ ?1 v9 m& c8 r
0 ?$ A8 N/ }* _, w6 {" n5 `0 _# `# `3 U% |% V% ?3 L
4 `4 p& j: ^! V- u* H5 k
9 x, D. Q8 q; ^1 k9 ~( K' F0 M# a1 f- u( A2 e9 h' O1 R6 w9 l( ]
0 ~7 F1 D7 K$ @! p: a/ }+ g
$ g- ?' f8 f( J; ^: `7 `# w2 C4 Q- ^- x6 t- F2 ^
) g7 `! `; C: g3 b5 i8 d
4 G' c+ r, r: R, z* k
|