Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). ( a1 K& R# G! _) r- M
& M( E: V' z2 ?0 cЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
/ ?! Z# h( U1 L1 e% A, Y _! L) z5 a) J) Q
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.; R1 w- `) X7 [8 m0 S, }- g# b
: w; [& ?; u* d0 w- // Пакет для состояний монстра
# a1 p# p9 q: j9 m; ^6 W8 P - package org.l2jmobius.gameserver.model.actor.state;
! I. l& q6 ]! { - 3 Z# M6 c! \! E. ?1 S9 J4 f3 d
- // Интерфейс, представляющий состояния монстра
6 a: l$ f1 C- t( X9 K - public interface MonsterState {, _9 v! d2 Z: |% c. m* k
- void handleState(Monster monster);
( P7 d2 V3 U' I* ^) k7 L - }0 v% |* r5 j3 J' W1 x" p* r$ N# i
Скопировать код ( |* r# O7 t/ `; j8 @( C
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
2 E2 d4 e& Y; ~2 Q! s5 i- q0 y9 F# a R+ l( [( E
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.7 x4 G! X n- _9 G' \
' `3 A# k5 d, ^# {0 J) { F! @- IКласс для начального состояния монстра:
( B% Z- \! o K8 \4 o. G) Z- // Пакет org.l2jmobius.gameserver.model.actor.state9 I. o# Z( B1 X% C$ E1 s
- package org.l2jmobius.gameserver.model.actor.state;* a' W: s- p+ [) X9 ^- W
1 d! _% k6 q8 e5 J/ N4 B- import org.l2jmobius.gameserver.model.actor.Monster;
; S# O3 M$ n/ O - # q& m% X" B, s4 `$ |
- public class InitialState implements MonsterState {
0 X% j9 Q0 `( @1 ^ - @Override
; ^6 j( F7 p0 J1 j! C- n, k - public void handleState(Monster monster) { S" h W' d! c
- // Начальная фаза боя. v' h# y' ^3 ]3 [) s" R
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");
% t0 S9 k! O* t2 H0 `( C( I - }* J, y& I0 m3 L
- }8 h, ]1 ~6 U4 J% P
Скопировать код Класс для агрессивного состояния монстра:4 ^' U) C& \7 N
- // Пакет org.l2jmobius.gameserver.model.actor.state* |) J$ g% a8 T( J! L* T
- package org.l2jmobius.gameserver.model.actor.state;3 G& i9 _0 k$ x% n* X; f8 \
$ }' ~4 H; M! n, a: j- import org.l2jmobius.gameserver.model.actor.Monster;
5 j. l1 G+ Y3 j p
, Q( m! Y* f& v9 u' B- public class AggressiveState implements MonsterState {
# P3 H5 @2 C& n) r, e - @Override
8 }" T9 I2 C, Y8 T3 Z5 T) r! i* N - public void handleState(Monster monster) {
% Q' O3 M: Y( H# |- q6 x' S - // Агрессивная фаза боя( P/ Y, m) }! N! S( V
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");- z% h% P5 a a# C8 R0 m* R
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
/ l6 B" j$ R: z( L3 s9 Y+ b - }7 t3 x9 J) `5 o2 m' t8 D
- }
" Q# Y. J% g0 a- L- `
Скопировать код Класс для финального состояния монстра:
3 ?$ P# J$ L$ f+ K- r. c- // Пакет org.l2jmobius.gameserver.model.actor.state
3 ]2 X# ]6 M" D; O) Z) {( ] - package org.l2jmobius.gameserver.model.actor.state;$ `$ `7 F9 ~" ?& S( F9 M
3 Z5 H$ i/ y5 ]* @) `( n' E: K* N9 F' p4 l- import org.l2jmobius.gameserver.model.actor.Monster;" ?5 S2 ?: e2 c+ v0 i" y; d
3 E2 [2 h2 P# K/ G% N+ Y% S, w5 u- public class FinalState implements MonsterState {
; z. D8 u- M* g1 C6 j$ } P - @Override
9 C* N6 m) U1 W% |+ Z/ `, o) e j( L - public void handleState(Monster monster) {
1 ~5 ]; K5 j. p - // Финальная фаза боя9 {6 N# q9 s. }7 e
- System.out.println(monster.getName() + " готовится к финальной атаке!");; O; U6 n2 k6 s2 P+ V6 c
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
! `8 x3 q9 X" l( w7 e& ] - }6 O. a: s$ ?! @( u( E
- }
% ^1 _0 F% B% b h4 u8 R% m& w
Скопировать код
7 I( w7 x3 Z; C% \3 FШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
9 F6 {1 h8 z: u( T2 H E5 w- // Пакет org.l2jmobius.gameserver.model.actor
) O. p4 Q7 E" ~7 l! j! \ - package org.l2jmobius.gameserver.model.actor;! Z. `4 M4 y F3 w& p5 p6 _
' ?1 \8 O% h9 I' h! \" _. E) O- import org.l2jmobius.gameserver.model.actor.state.MonsterState;+ g9 C4 H, _7 Y! F6 |
- import org.l2jmobius.gameserver.model.actor.state.InitialState;( V+ W" k* V0 l8 l
- * c% L! ?3 i! \ B$ d+ M Y' B- g+ {" B
- public class Monster extends Creature {
' h& G0 u- w) s/ l4 {- [. F' ] - private String name;/ D& R! X# i" s% n1 @3 g3 F
- private double attackPower;
5 [( x/ A; M( h5 _2 |. U - private MonsterState state; // Текущее состояние монстра; u, B! a* V$ R; g
$ q* `3 G' B2 l5 Y1 E- // Конструктор монстра$ Z+ }4 p. c6 ^( j3 G
- public Monster(String name, double attackPower) {# w) x- Q Q1 P y8 D. B% p
- this.name = name;
. ^! F* A4 v8 I* l4 D - this.attackPower = attackPower;
" R+ T: c& K9 _6 C1 t - this.state = new InitialState(); // Устанавливаем начальное состояние( l1 @! \ i, t' ~8 x( c
- }
4 P* y# \/ Z! U
# d, |: a1 |# L$ M" k+ @- // Метод для смены состояния
) f5 N8 Q9 r% f4 S - public void setState(MonsterState newState) {
# R1 z$ p5 g3 ^5 z4 Y2 J% ` - this.state = newState;
* M7 o. B, W! ^/ B0 M8 k, f2 u) T - }
) A$ A4 J4 K, \; G/ _
" B* O/ Q% N2 }- // Выполнение действий на основе текущего состояния3 x6 u6 O4 f6 y3 e- Z' _& x
- public void executeState() {
0 H ~4 u) ~! @ - state.handleState(this);
. ~" l# z$ j: P; W( v - }
* E: q7 M# \6 g0 _
: ~( E1 A* y; n7 q, B. v- // Геттеры и сеттеры0 J0 Z8 W+ i+ {- h; @
- public String getName() {
% U% P" @8 h5 j0 G* p - return name;
4 O0 ^: f- m* Q- C3 T2 e! R - }
/ d9 G' v v1 `7 e" A3 A, e
) \# e+ ?( G4 Q8 K" Q4 T2 T. ?0 ]- public double getAttackPower() {
" j) Y$ E% n& c7 A+ f, E9 R8 d - return attackPower;
% r( X2 k+ B+ g- T' s - }
5 X: h: Q4 h9 \. O/ W, D( ]1 i
1 @& t; j' U! ^- public void setAttackPower(double attackPower) {6 |2 R1 C7 y4 ?* N+ Q: ~
- this.attackPower = attackPower;
* F7 a( K0 K n0 w - }
# P8 q! ]9 Q- B5 [1 K - }2 a4 `. f/ k E9 V1 O6 c
Скопировать код
. l' K- H6 F/ O6 RШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
) X2 L, s# U4 Z7 c1 B$ A/ G9 k; p. t1 E9 ?& U, H" W* p: A/ h
- // Пакет org.l2jmobius.gameserver.model.battle
0 g+ C, `4 r }, w - package org.l2jmobius.gameserver.model.battle;
' t6 W5 h1 U G, t% \! { - : [2 w) E) f, } X4 V+ S$ @) l" U6 P
- import org.l2jmobius.gameserver.model.actor.Monster;
7 h7 ]& a) r6 }" W$ s8 L- Q - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
, a& u, @+ n8 {5 _ - import org.l2jmobius.gameserver.model.actor.state.FinalState;
" B1 w2 F2 a `0 l& b) T
, R: [4 g8 M2 W0 l0 m- public class BattleSimulation {: {* z/ }) R% u
- public static void main(String[] args) {
( L, U6 @+ G) e5 z* e) a5 E - // Создаем монстра с начальной атакой9 G" Q+ @9 O5 a n f
- Monster monster = new Monster("Дракон", 100);; k# b6 m: `: A/ _4 A# o/ P
9 ^' J# Z* e `- // Начальная фаза
% Z. ]" Z: M7 H* N& U - monster.executeState();
( |8 p; W/ `7 X6 J
1 N8 [: s+ Z" ~+ t- // Переход в агрессивную фазу
, a. v. j5 {! M8 v - monster.setState(new AggressiveState());
+ z3 ?5 f! {# y( P5 n* I% M - monster.executeState();" f, S) n. P0 P" J0 U6 k
# `, f; H( p f& E: K" y8 d- // Финальная фаза
1 ]7 M- D% N# R! z) q' [ - monster.setState(new FinalState());
; I+ k* a, n; O) l$ m- \ - monster.executeState();
* ~6 p& n' t4 q- W - }
5 H, H5 |% h; [* e - }/ x" u! R$ Q8 T: e8 j
Скопировать код ! u% ~$ m1 q. f! {- _ N' A
Комментарии по структуре пакетов и классов:
8 s5 D, {5 h1 B8 @* c P! }' J- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
8 Q |- F! s: A ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
; ] [( V6 [& m$ T% Y% mЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
+ H M! A4 w5 d4 Z5 i- r j; C6 q) x
F* @+ s9 |9 e$ t" u" a5 t+ A7 S* G4 O0 y/ O; i6 O" v
! n- |0 x5 _% _3 H# o3 h0 g3 O: _
9 q7 x7 u# A3 S. g
4 K- a' \; J; d' L" ` @' u# y0 J0 t& ?5 h6 a) ?1 s
' V; Q7 L$ A! T) \: ^6 k9 Z# m0 `8 k' _
' w, ?1 g& H5 i# F6 i$ ^, W
5 |0 ?; ^$ e# ^% o$ k3 c
5 H! ^& J9 J( ?, l9 s k# Y" c' g4 c& _
5 J( a4 P5 @4 U
6 N, v) a+ T0 z |