Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
* U9 t8 }* W- w9 k, V- F; W9 _, f4 b9 T, R' e: G8 c
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
y4 T" H4 w) V2 T! [* N, {
r* m$ S; P6 K$ xШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
. H( u/ u$ q( X! l, u8 y" O+ S& h! o1 c: d0 {7 a: d, H' j2 }8 x
- // Пакет для состояний монстра# P8 E# d6 k2 _7 U7 t2 j' D
- package org.l2jmobius.gameserver.model.actor.state;
4 {6 A% r1 e, \5 V: W$ k9 e) p - ! c# c" p, f3 `# M$ v* R7 T
- // Интерфейс, представляющий состояния монстра- h& a/ L( F; l
- public interface MonsterState {
5 b- y' n8 Q2 a - void handleState(Monster monster);6 } v( Z$ ?: e) m
- }
9 ?) `7 C4 d% m8 S- P, n( g
Скопировать код 7 A" g+ n4 `; }# ^2 \8 n
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 1 d J7 R7 _: h% J$ G: z( }( [
3 P+ t# e2 p2 q! r% e9 `0 j5 EЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
, p; c3 }9 j7 B4 v1 L2 ]6 E$ d% Z# {+ ~! f+ y, M: r; I& j
Класс для начального состояния монстра:
# X5 G( ]$ ^6 X; G0 D- // Пакет org.l2jmobius.gameserver.model.actor.state* i5 @% Z% D7 e% c4 \* b
- package org.l2jmobius.gameserver.model.actor.state;
% M: Z' s6 }/ O* r* X* e# E
( }! S" A1 d( o* C# t+ [, ?- import org.l2jmobius.gameserver.model.actor.Monster;
; j, |/ L$ d2 d& ~. ^ - s: {3 O' k! G
- public class InitialState implements MonsterState {
9 a6 Q2 u5 v, K# ?5 { - @Override
8 q" t z9 h& B - public void handleState(Monster monster) {" Z1 w8 r$ Q' ?$ [
- // Начальная фаза боя
1 b& W4 B5 j: A5 N" d - System.out.println(monster.getName() + " начинает бой с обычной атакой.");7 @3 ~0 u8 b/ W5 p
- }. d; I5 t; r$ d2 o1 P. u! y
- }; o o" a/ [. X% e
Скопировать код Класс для агрессивного состояния монстра:+ K6 \9 Q3 w! n2 g$ U! `1 r1 r
- // Пакет org.l2jmobius.gameserver.model.actor.state" x5 n$ z# R0 S; U+ p' ?7 a
- package org.l2jmobius.gameserver.model.actor.state;& c5 e. K: b* F: x# M* b
& ]& |5 I8 R( q( {3 U- import org.l2jmobius.gameserver.model.actor.Monster;
7 o j6 _1 Q1 e! ?3 W
1 a$ p( b* S# A8 O- public class AggressiveState implements MonsterState {
9 Z: a( }5 [ d) { - @Override3 f$ p( A. l( s/ b
- public void handleState(Monster monster) {$ M- l, ]) Y9 [0 G
- // Агрессивная фаза боя! p1 a2 C3 {$ q; c
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");) X1 a% N( M2 F2 N
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки$ Z3 C" V6 i( K2 J A0 v9 w+ c9 y
- }
& O; }7 o+ y7 P% d" g/ v* j" h# `% Y - }+ q7 a+ |6 ^6 @: a
Скопировать код Класс для финального состояния монстра:
# t0 ?- M6 D- U# Y* a6 b8 r- // Пакет org.l2jmobius.gameserver.model.actor.state
5 K k% E% G r b$ g - package org.l2jmobius.gameserver.model.actor.state;
, j3 T" Z: P) Q0 L+ }
$ R4 B$ @' z6 D4 F" M: e- import org.l2jmobius.gameserver.model.actor.Monster;
# w3 Z/ k" l8 ^% n5 z# y
6 A- s6 ^- [# R" L i% e- public class FinalState implements MonsterState {, D- w& |7 `( ]
- @Override4 `" m9 |( ?) ?$ O) y- w( U' _
- public void handleState(Monster monster) {$ G$ | S; D$ e) R
- // Финальная фаза боя
1 \* h0 ?6 A7 Q/ G; ` - System.out.println(monster.getName() + " готовится к финальной атаке!");
0 j$ n. h( @4 a7 s - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки+ K$ }3 ?. y0 O y- U
- }
n' m. n9 ^0 @2 W( y - }! v2 G/ u" N6 k/ g T L# G& f5 R2 G
Скопировать код ' F3 y5 r1 v) G3 j. m$ o8 ?1 b1 Z2 d
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
5 c8 a' k- F- `( J9 J- q2 p- // Пакет org.l2jmobius.gameserver.model.actor- P3 x, r% p" J7 m! A& [. c
- package org.l2jmobius.gameserver.model.actor;3 O' H% Q6 Z; f3 l
- . b6 D! h" }5 f/ n4 |' Q2 u* W# g
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;9 a+ C( J* d+ d! O
- import org.l2jmobius.gameserver.model.actor.state.InitialState;
; J9 _+ W* w: H, U) E/ s3 |: P
6 n: z7 _$ w2 O! l# V' L |4 T, z- public class Monster extends Creature {
9 m* X: v. A9 o$ `3 b6 m! c+ d' L- ? - private String name;8 A5 [: U5 w' f& D% x6 h
- private double attackPower;* x& y5 |* S4 H# {+ O. G
- private MonsterState state; // Текущее состояние монстра
, E* S" |4 v3 o! o5 Z; ?& ~- m
+ ~/ g% v: w) K' }- // Конструктор монстра
9 r8 r3 z9 [$ N+ ]/ R9 ~ - public Monster(String name, double attackPower) {1 c/ _/ U; W$ T5 N9 e
- this.name = name;
d B8 B( m# W" @' s - this.attackPower = attackPower;; p* C" _* X" l# p1 X) }2 m
- this.state = new InitialState(); // Устанавливаем начальное состояние
2 u1 k( f) q- F/ Q - }3 a- t1 j: j; Y. n! N
- ) f; l1 s% Z Z u
- // Метод для смены состояния4 m& s z- F% {2 ^. O. t. [
- public void setState(MonsterState newState) {
: m0 j. z2 U! K! L - this.state = newState;) T4 E4 Q0 D* i7 U4 ?' R( u
- }" O+ R0 N9 A \! @
- 4 |: \! @! p& I& e2 y& L' D5 ^
- // Выполнение действий на основе текущего состояния: e& u7 T1 p/ M
- public void executeState() {
- X ~/ y/ s& k, `) F4 h. q - state.handleState(this);
, F: S( o( F3 [1 L6 o% b" A1 Y - }
$ q" a3 p- C9 n3 p) ~* c! u2 m: ~+ H - $ ]6 n. m9 C9 G; {- H) |
- // Геттеры и сеттеры. [" O! ?1 | b' Z% l# d* ?" p
- public String getName() {
" ]1 t9 U* }+ p7 D+ u" X - return name;" z7 b% s; j% e* J' @" V- k
- }
- y8 K" w2 x5 i4 t( E4 \
7 m }1 X7 {; o; L- public double getAttackPower() {
% y% j$ V1 R5 C: `4 [4 s - return attackPower;; {+ x/ Q/ A8 a$ s2 A0 E) N
- }+ ^! T3 ~' q2 k2 H1 V1 t
- 1 {. I7 ?" G' Y6 S% _
- public void setAttackPower(double attackPower) {
+ o% [/ t- i, y+ Y) ~% F# e - this.attackPower = attackPower;/ U1 G" k' ~2 S! Q
- }* y, `/ J0 Q* M7 U2 z! w! c
- }
& `9 B% B% M3 J; `) i; x/ K: c9 k
Скопировать код 5 `) o w% @0 k8 o6 s# z/ l& T
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.' Y2 r: `+ m8 K1 ]! b* g
: S/ m8 Q/ Q0 h; m+ ~$ @
- // Пакет org.l2jmobius.gameserver.model.battle
; `3 s9 ?) P( M; A2 d - package org.l2jmobius.gameserver.model.battle;
0 [( B1 X% a/ k1 R
$ Q, T8 ]# x: w# P- import org.l2jmobius.gameserver.model.actor.Monster;
B0 Z+ m0 F7 K! e! l - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
) I6 ^% {# c$ M+ H. x1 { - import org.l2jmobius.gameserver.model.actor.state.FinalState;
0 G4 E3 G, p" l; D2 _2 R
9 z3 b$ `0 a8 x9 }& h; D/ p9 O* `- public class BattleSimulation {
: U# Y, k& ~; w N: F/ J" m - public static void main(String[] args) {2 p. M" \+ f+ Q1 v9 x' [
- // Создаем монстра с начальной атакой
7 k( }. m) d9 V% w - Monster monster = new Monster("Дракон", 100);
' i. I' {& X( z# U - " L4 `, x0 W: K* [4 \; [& D
- // Начальная фаза
$ E' } A/ \/ U( ^ - monster.executeState();
% Q8 Y2 E+ @& K1 w6 b3 b
l4 `* E ?9 }# t C- // Переход в агрессивную фазу0 Z- m( A- B/ s; M$ l" |2 p
- monster.setState(new AggressiveState());
! }8 X2 i" Z- W& z# c" F - monster.executeState();
7 ]- A: q. h. V7 E R3 c% R - 6 |) C V" `$ r" s# i R( w; s/ a
- // Финальная фаза
a( d9 |4 g) ^/ N) |& v2 q8 Y - monster.setState(new FinalState());( R$ L) ]/ C7 i7 o- Y
- monster.executeState();
8 z7 @, A2 m' s. z7 i - }9 R5 S2 f" `. |( m
- }$ w m M6 t/ a, q" v
Скопировать код
4 |# W0 S" v; g/ Y- ]8 cКомментарии по структуре пакетов и классов:! U" g4 u# O4 r# c' E# o
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.% ~& U# M! S8 t5 m% Q+ u8 U
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.# `4 F; O, W" ]7 J' \3 a
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!! P- d& ]: _: Z# w
5 o! g) g( P* p/ Q* S8 H0 k
/ T* X* I8 M' d* |0 ~ K
1 n# L3 S# E* O7 o
2 Q- b0 C3 z; R# S% s+ A, s
D$ s& z _. O* I ~- Q" ?! W; `* d& A- t" w! K% @
a1 ?7 i1 k; z4 ]
3 U; c: N( Y+ N6 C% r& `; K" M( Q" M
4 E" q, E& J v8 r: S$ h% g7 i$ Z+ z2 S* ~' [; o
: t' F/ }9 c9 u: b' y% N) i4 C
3 x$ K" p! S, H4 o3 W, F3 e7 g1 c" F8 @! E U1 s8 @; ]1 T
|