Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
0 j9 s6 |1 ^. V4 C5 L2 s) x
( _+ v U4 b) G0 ]. o& oЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
2 Y/ G4 `' c4 F$ x: K, ]/ Q) M0 a2 X, ?2 @& e3 e( p. a
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
& j) c! n, `' W$ `
K( |2 l( ^# y! F$ j- // Пакет для состояний монстра
8 o* L7 d/ r4 O5 ?- _( S* [ - package org.l2jmobius.gameserver.model.actor.state;
8 \# W* |" Y# n1 b! _- u. J* _8 @ - 9 d4 N( t& |/ ]; f8 p
- // Интерфейс, представляющий состояния монстра
' i, Z7 I3 k/ }$ o: ]& M j( P. Q' \ - public interface MonsterState {$ x6 A& G( F! T8 n( Z2 J& X
- void handleState(Monster monster);1 ^ m& }7 W# I+ W! `) M
- }
& \& F( S, j9 M9 _! i
Скопировать код 2 a' _3 j" S) A0 m% x- m) x4 c5 }
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. , u4 Y, {$ V/ K; d) l
$ g" e& h8 P7 f$ n! D
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
V! A7 D: i+ W! I
Y' r2 [6 e( P& H* u. A# VКласс для начального состояния монстра:0 K0 `, G9 N6 J" N* m# A
- // Пакет org.l2jmobius.gameserver.model.actor.state
W2 |) J: v* N9 S6 n- S! |! \ - package org.l2jmobius.gameserver.model.actor.state;
6 b( u- r2 l" J
3 T2 r5 U7 Y/ @+ c% g- import org.l2jmobius.gameserver.model.actor.Monster;" Z9 v! }; p/ W$ g% h) W
! r' d x6 p' `( G. o- public class InitialState implements MonsterState {
4 Y3 D3 n+ w0 V6 X# c3 w4 U$ l - @Override2 e# k# j, M; i
- public void handleState(Monster monster) {; a0 b' W# p3 K
- // Начальная фаза боя$ g0 |) K o. G9 G
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");
6 v& D5 `2 J$ T$ }8 |9 _ - }
: G M$ I1 j* M6 T - }% ]3 i) y" T4 c1 N9 G* m7 n
Скопировать код Класс для агрессивного состояния монстра:
- M+ q0 a6 o8 C* ?# ]4 x1 Z- // Пакет org.l2jmobius.gameserver.model.actor.state
9 A8 S2 t. p3 V8 @9 E7 m ?: K - package org.l2jmobius.gameserver.model.actor.state;
2 j* x- b$ c9 U I; f g
9 D& h$ f6 l* z- import org.l2jmobius.gameserver.model.actor.Monster;
* o" r; N" P o) ?" j. Q7 d
: w: x+ a2 N3 V2 F/ f0 P0 R. Z- public class AggressiveState implements MonsterState {/ Q- x' r8 Y2 R% W! I8 P9 [* k
- @Override$ E d4 D- f J7 L9 c
- public void handleState(Monster monster) {; v; `8 ? n( X1 n& j. b& `7 A
- // Агрессивная фаза боя- j3 i9 V. z4 T6 c. E9 F8 s6 w
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
; N6 {4 b" ~& o* _: z: y( f7 g Q - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки8 `" ], R* R" ~7 ]! H8 j% Y
- }) O" Z3 `# a1 F
- }8 X& X+ _' N$ M3 \" k
Скопировать код Класс для финального состояния монстра:: _- \% O8 N" b4 |' C
- // Пакет org.l2jmobius.gameserver.model.actor.state
5 p8 C: p7 y$ i2 ?* @2 r1 C - package org.l2jmobius.gameserver.model.actor.state;7 G' q* W* X, x2 O. T0 T
- 7 E, B% u6 Y9 S3 i
- import org.l2jmobius.gameserver.model.actor.Monster;0 K; A3 F% `' H( \
- , p/ y% ?, y7 v( k6 O5 S r2 \
- public class FinalState implements MonsterState {
- I0 b* z& O& F1 \% ] - @Override
8 Q* _9 t/ s. h$ Q9 z - public void handleState(Monster monster) {
$ e, u5 y" }3 h) u# B' J" k* N - // Финальная фаза боя x1 G8 j) M* q6 f) L
- System.out.println(monster.getName() + " готовится к финальной атаке!"); x! |4 P6 n+ u
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки+ e6 i n; T) I8 _% C7 a, ~# `
- }3 [0 y& ]' C- f
- }, H4 F" O9 C- {# ]
Скопировать код
. h. K' B7 T3 c; O) W$ sШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.2 n4 D) E$ h" ~* ]* P1 L! ^
- // Пакет org.l2jmobius.gameserver.model.actor: \* l9 m6 N* I
- package org.l2jmobius.gameserver.model.actor;5 ?5 q9 A2 @3 W2 P
- 5 z3 X1 g8 t8 m$ B B
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
6 d2 Z% m- h( @6 ?7 q0 ~- M8 W - import org.l2jmobius.gameserver.model.actor.state.InitialState;1 v! Y1 y" I! J/ C% O. i
- L- i) M4 }5 l7 D# l- public class Monster extends Creature {3 b8 T# n0 P5 K% p8 K
- private String name;
0 B8 h$ [' ~. c# x6 V - private double attackPower;
) ^1 i& M1 N1 l P - private MonsterState state; // Текущее состояние монстра, _8 Y9 a7 C4 @8 a! P! Y. Q
- . v6 r2 o. x$ E4 z
- // Конструктор монстра9 x& f$ N2 Y. o, ~$ o. o
- public Monster(String name, double attackPower) {
9 g+ S% H$ a+ D3 c' P3 l - this.name = name;: Y9 O$ s1 V1 E: ]( j
- this.attackPower = attackPower;& s7 W3 m: Z& }0 S; o
- this.state = new InitialState(); // Устанавливаем начальное состояние
5 r( J# S! @1 \! n! j5 M+ w - }
* u' x- g& s! x2 ], p' |0 p - . F L+ c7 l- p) H& D
- // Метод для смены состояния
: { e+ Z1 m4 |6 e - public void setState(MonsterState newState) {
5 b+ A' _! v. i/ U) E7 l - this.state = newState;
! U! {; U, @# e; G - }
+ C+ I% @4 s* `1 P0 {2 b/ `' I
! V/ L* V8 p9 w) G- // Выполнение действий на основе текущего состояния
2 `: g" r7 N5 q% Z# Y) ?2 x% q - public void executeState() {
$ M/ q- U/ ~# I: n - state.handleState(this);! ^( j/ p5 |0 K7 i" e
- } J+ B0 e! k$ t7 T. p- U( a' }
- . B+ w8 p J/ l+ g9 O( ^( b
- // Геттеры и сеттеры9 _0 `- ^5 {9 d
- public String getName() {0 A# x5 M- k" {+ M" n
- return name;
+ f7 N- ?0 U2 n9 \5 r |; T - }
5 {: B# k% }' j C+ c6 }: S - + E" @' q6 n3 ?* \8 D0 _
- public double getAttackPower() {
+ |' L$ b5 Q( K; ^8 M3 y5 X - return attackPower;
+ D& v, t4 t8 l$ y4 r* F - }
( E) [8 F, T: k* G/ l1 Q
$ x% T$ G& ^ s8 D7 E- public void setAttackPower(double attackPower) {
. j ^+ k9 U3 j& \- y - this.attackPower = attackPower;+ L5 R. [1 f7 Y. O2 `5 @
- }- T$ C' _* p! `6 M i7 u0 Z6 Z
- }
7 R0 C) j. J9 G8 r- g6 l
Скопировать код : c: t. U% }4 w) i t
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
2 b& `% [4 n4 i) B2 I# m; `0 n5 D) u
- // Пакет org.l2jmobius.gameserver.model.battle& o% g' K3 P4 Y2 v) J) x; w0 z; m" e5 E- d, x
- package org.l2jmobius.gameserver.model.battle;* ?6 p$ \( \, W* h
- : h9 I, J: r9 b
- import org.l2jmobius.gameserver.model.actor.Monster; \3 s) ~) `( |8 K& W
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
7 i1 l; k& X5 s, q - import org.l2jmobius.gameserver.model.actor.state.FinalState;
9 z/ y2 |4 I: m& L1 r - 2 \$ Z# E8 q' g: Z2 `2 X
- public class BattleSimulation {
8 Q. q' |* C# P$ Q - public static void main(String[] args) {/ U* a( F/ k- B$ u8 s8 q7 u9 N/ h
- // Создаем монстра с начальной атакой! a" G& D- @4 N9 K( E" j
- Monster monster = new Monster("Дракон", 100);
2 g8 A' r" O5 n+ }2 }0 E
# n0 k) z3 ]$ E. j/ H- // Начальная фаза
# g7 I2 v; H3 p5 t - monster.executeState();
; U0 p" `: {' }/ f' G7 t6 z - 4 v8 h6 P' A! i7 C! ]
- // Переход в агрессивную фазу+ H, [; e2 d. Y7 Z# w$ v. U2 a2 J# B
- monster.setState(new AggressiveState());
0 |: y+ _ Q% B2 Z. O6 K - monster.executeState();% g' F' a. N5 o3 q# e) o* H) @& S7 i
- ; ^; E- C z; q, H; H$ k
- // Финальная фаза
8 Y0 c( H& n) p# b& Y* N/ D( N - monster.setState(new FinalState());# E; ?9 s: }' T& h
- monster.executeState();* J$ E9 x' {$ ~; M1 A+ ~, b
- }
6 {- \2 P+ ^, j$ p0 d6 h - }$ P. }# g0 z% U# H9 B d
Скопировать код + u$ `: j8 t9 q
Комментарии по структуре пакетов и классов: `& I" z, ~' w! n+ I
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев./ H9 D0 Q+ M( c3 ]' N
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
# e6 `! {) R& \- `) qЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!. f4 x( K* l) S7 ?6 m
4 _: ^2 c9 Z, V8 Z7 L
0 C3 Z% s1 p# }+ g8 p5 C" k# X% M. J- A7 ~1 L1 T
" v1 f3 G' p l( ?7 d1 {7 m
: a6 P, N. R- A7 h% T
9 u" i$ U2 ^! x4 E# \( k: u' Q- A2 E: i) h E$ Z
2 F- [ l$ I! t& K+ ]3 |/ P8 a, c! m7 s
) L; w! Y9 [( }' f
+ O# @% p2 }# N" i/ k1 a% ]* D( k/ f7 j( B, ?0 v
4 |7 |/ B4 x: y: m1 E @
) T7 ^4 n" w v2 A% {( G |