Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). g) B& x0 R; z& ^' j
# s H h9 o9 c! Y3 U$ p5 O
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.. C9 Q/ n. i5 |* Q
6 d5 a `- e9 Z. `. H
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
7 e+ A1 k5 O& s; m A) {0 u$ ]
4 q& [: j* K& I# L; ], u! x- // Пакет для состояний монстра8 C: V/ U- A4 I. j
- package org.l2jmobius.gameserver.model.actor.state;
\9 y1 q4 g# {) W e6 Y
) j: | w- P6 Z Q" H1 R- // Интерфейс, представляющий состояния монстра& }4 s" f# T) W* o$ ^0 }2 ^- l
- public interface MonsterState {! G; d5 d' \& H2 ?7 F. F2 {9 @
- void handleState(Monster monster);
7 b! }# x3 [9 c - }! w c- N: e% X$ N) z% k
Скопировать код
' Q; E2 K# C4 w6 L5 h( \Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
- \# [3 n: Z. h5 p& b* r( j& F% k/ c+ k( ~3 X
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
- U. N* g1 X1 u9 L' N7 b( ^" l
Класс для начального состояния монстра:7 ~* {1 c. @3 |5 b8 U
- // Пакет org.l2jmobius.gameserver.model.actor.state
/ J0 D0 e8 q1 j - package org.l2jmobius.gameserver.model.actor.state;
X9 ^/ @; F. Z* |) z
3 r4 E( ?) @4 h/ ^! Z2 k# ^$ q( C( y- import org.l2jmobius.gameserver.model.actor.Monster;1 O: D0 }! t& ?
* b6 k5 k6 }0 M$ ^- public class InitialState implements MonsterState {
, e5 ?4 B& c9 J3 [ u1 f( `3 ^: F" C! i8 k - @Override" i" y+ h& S* M3 ~5 I1 r- k! J! S
- public void handleState(Monster monster) {# ^( h8 I- ^% h' H
- // Начальная фаза боя- Z) j4 e; r! x$ e
- System.out.println(monster.getName() + " начинает бой с обычной атакой."); e% R$ {% h) x# h8 j6 B: S
- }" s) q+ @* H4 { S5 \# Q0 Q
- }
" o4 ~3 |0 U9 M V
Скопировать код Класс для агрессивного состояния монстра:
, @! L2 f/ s4 O7 d0 h& A- // Пакет org.l2jmobius.gameserver.model.actor.state
4 T+ u- O6 ]" w" [9 d" P" a - package org.l2jmobius.gameserver.model.actor.state;
& h! F" o. m. d - 3 k8 s' I) z+ n# ^
- import org.l2jmobius.gameserver.model.actor.Monster;7 W9 Y% `: q2 Y% l9 z, M# G1 e2 |
( K9 r' l# y! I# f- public class AggressiveState implements MonsterState {
; C$ b' S7 W1 h1 l - @Override
9 p m2 ^" W3 H2 q - public void handleState(Monster monster) {
7 M4 s$ z2 t( x6 `5 i - // Агрессивная фаза боя
% ?# C0 c2 Q+ \( n, b/ N: z7 l+ b - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
+ b# m* q! `' {2 {: w4 ^' N' G1 a - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
8 {, K5 \7 y) J2 R - }& @9 m' h3 m- f; y* _
- }0 X R) y2 j& \3 L, m% _, p( I
Скопировать код Класс для финального состояния монстра:# C) @# P |5 U: o
- // Пакет org.l2jmobius.gameserver.model.actor.state
, v5 Z$ F$ J" v# ]! O, P( |7 y/ O - package org.l2jmobius.gameserver.model.actor.state;
]" H/ ^: v, W# r1 V
# r# y) c. o5 n2 U& z) Y- import org.l2jmobius.gameserver.model.actor.Monster;* ~2 G: `: p) S; e o
- ! d9 [1 @) T5 R; Z* Y* z; L5 w
- public class FinalState implements MonsterState {
. P: K5 [3 @* W. ~! N2 t! I% o - @Override
& v. h2 L" W& `+ [ - public void handleState(Monster monster) {
, _: F1 D& E8 c! ? - // Финальная фаза боя
. P+ V. v2 c: W1 ^3 W6 {6 O8 B - System.out.println(monster.getName() + " готовится к финальной атаке!");
$ v i- O2 h, {) o: x - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки3 Z6 t Y; f f7 b" A( b! {
- }
. d9 X+ E; Z% J4 B/ v3 }. t2 N& L& o - } F' F$ {5 D: e0 C1 r6 P
Скопировать код
9 N# C0 V" L6 mШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.5 u4 i- M" X8 h; j( U& M
- // Пакет org.l2jmobius.gameserver.model.actor- `8 ?# m3 z$ m6 a+ `2 ?( L
- package org.l2jmobius.gameserver.model.actor;
w3 j! t1 x; P9 Z9 {7 A - 7 G+ q' B4 R' x5 H; g' F1 n
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;: v! _. I* W, g- o) G% U
- import org.l2jmobius.gameserver.model.actor.state.InitialState;" W) t% L; b: t- W: U* J, K5 l
- % }& V+ k- S8 v% P% J
- public class Monster extends Creature {- a4 [9 Z I$ P$ `5 I" e# s' {
- private String name;5 r6 U8 E: ]0 n; T
- private double attackPower;
$ Q" k. d$ B' m l - private MonsterState state; // Текущее состояние монстра( K! m, U/ o' j! z8 ~, N9 k, _2 d
- $ m/ }, o% I/ C6 T- j' ?/ P
- // Конструктор монстра
6 I3 w/ k+ L: r! E7 O+ T - public Monster(String name, double attackPower) {' y) j/ g- L2 `. e
- this.name = name;8 z1 v' V$ B( m; D% u; f- J
- this.attackPower = attackPower;
' K& H/ |" d/ k) J - this.state = new InitialState(); // Устанавливаем начальное состояние2 w. k; A7 F: k9 v& R
- }
9 O& ?; u) q! [ - 7 S4 C; v' B9 ~' h. M+ Q
- // Метод для смены состояния% s& X* U8 d7 r" p. S; u5 S9 c% B
- public void setState(MonsterState newState) {
& P0 ~+ O0 F9 C/ Q% B - this.state = newState;9 J$ Z+ D- w1 |+ f
- }
3 A7 q6 ?+ x0 x' w1 l
2 F; @' H: x8 T+ ~- x8 o4 U& S1 f- // Выполнение действий на основе текущего состояния
- |( \$ ?; C/ f4 O# l - public void executeState() {
! M" ]+ Q# q7 k/ Q* q j7 D0 t - state.handleState(this);) g, k D3 O$ v8 K0 ]1 ?- C
- }+ C8 f* x o+ Z$ z) M# s/ T9 x
3 \& ]8 m" T: K/ R- // Геттеры и сеттеры& H8 M' g" ?* E7 K5 X- ?8 o( B
- public String getName() {7 c' K& @4 i- Z* x3 `7 A+ g: B& M9 e
- return name;
8 V+ w, g0 E. M; Z6 Y* I3 r - }
, E1 X7 I6 }6 F - % h; E2 |3 ]! E" x* u
- public double getAttackPower() {
3 `' [% U6 o l0 K I+ J! { - return attackPower;' F: g E5 w, p0 z
- }0 F, m+ t+ m' i/ }5 \6 w/ B
- . e6 V2 E3 y* ]6 {5 W+ U: h
- public void setAttackPower(double attackPower) {7 r4 V# U* Z! s+ C5 i
- this.attackPower = attackPower;
# h! s2 G4 {9 S9 |( N - }
: v, K W+ v+ d- D! B* [# @ - } p; d# ~* _/ S. O, w) \& r4 T
Скопировать код 1 M1 P2 a& F% P; @* w+ X- U1 }) T2 Y3 Q
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра., h+ u/ \8 l6 }. K- |0 B
9 A: B m# P2 s& P- // Пакет org.l2jmobius.gameserver.model.battle( H, j' q6 b' ?" g9 b; g
- package org.l2jmobius.gameserver.model.battle;6 ?: H: ^3 m9 Q, I! Q. U3 f
5 { d3 b! G( u7 ^& C$ N" R1 {; d- import org.l2jmobius.gameserver.model.actor.Monster;
, Y( D/ @! e6 u k! T2 o3 S Z - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;, G( y3 @/ _ ?
- import org.l2jmobius.gameserver.model.actor.state.FinalState;
, g; G2 s( K" ^# [" ?6 t - 5 b- ~' h7 \: O+ Z1 v
- public class BattleSimulation {: ]7 n0 `2 Y4 i* s
- public static void main(String[] args) {. }: B; |6 Z* X) Z: F5 p
- // Создаем монстра с начальной атакой2 J* ?) |* @+ k. t
- Monster monster = new Monster("Дракон", 100);4 c' P- `' X$ L" d1 w
( G. E. r* Q8 }% o- // Начальная фаза, [( |/ Y/ d+ Q0 F' V/ S
- monster.executeState();
1 r8 I x$ Q& J' j: D2 [" t
* z+ G! U- m0 L1 W% X" v/ U4 _/ g# e- // Переход в агрессивную фазу$ i+ s. a' Z; V) w# `' d0 B" t) L- ~
- monster.setState(new AggressiveState());4 q2 X+ c# C F ^
- monster.executeState();
: I' S9 |- x* h
E7 Y: b' C, i+ D% u1 a5 t' D- // Финальная фаза
# i: ~5 K- f$ c. q" N - monster.setState(new FinalState()); H5 H3 m8 y+ L0 K6 Q* g9 W
- monster.executeState();+ u' g0 A" @8 f. u8 F
- }6 y" w& |7 z) h6 E
- }% m0 Q' j# J6 p/ t3 _* I
Скопировать код
' a7 P. t) l" Q+ ~" a, DКомментарии по структуре пакетов и классов:
" W5 V2 k8 `2 d9 `: ~ S7 W- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
1 Y! ?' [+ u& {+ ` ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
& F1 G' m3 S0 u0 v/ E) S! zЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
7 u h/ G1 {/ C9 p6 }* @
0 ?" D0 ]( I5 @8 R- r- r \4 H0 B# D8 a* H/ N
7 L8 Z. b; V2 f: Y$ E' ]9 ^
6 k- V: `8 N9 W7 r( {
6 `$ z% C% s' w/ |% g' U7 m- Q3 _, F6 o' c
5 g) a) m# [4 Q: t% |! K
: g6 \ m( C6 Q$ Q$ u
; ?* W( a$ G: i0 b+ y- M/ ?
1 f4 {; _' f" S1 `2 {7 Q' g" d- ^+ C' o% u7 h" l) E
# g" _* c4 S3 v7 x( O6 N( L N+ y' k
# N- ]( f$ E4 B. |. A. f
/ h2 a" K( c G' t/ U1 M [8 j
|