Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). ( m) Y. X3 L* L9 l7 ^3 T
1 R. ]2 p4 G# k1 U' ~Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
) ]& `1 l- L% z, P- O# o$ x7 h: M+ ~1 V
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
J3 m3 r, G" M/ P; m O5 g* }" J- @! I- Q W& B
- // Пакет для состояний монстра0 _: C+ g, ] {6 \& D$ P/ e
- package org.l2jmobius.gameserver.model.actor.state;
" ~+ I7 e0 Q( d b0 K, x
# U4 E' s4 R2 |+ F- // Интерфейс, представляющий состояния монстра# U$ J7 C% d! k2 O; k
- public interface MonsterState {
% |; A7 @$ f% J1 d8 l1 | - void handleState(Monster monster);% y' Q' u( o$ }# K! E
- }- d- _8 v9 \5 H7 w4 ~; z; }
Скопировать код 9 O5 l2 ?0 A( _' R: N
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 7 ]- e. y1 }2 e ~8 ^1 j
/ R$ a4 |' U9 ^8 Z* w$ j) @# iЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
- e2 F' b8 |4 j" `' L @% |$ _
) ^' X8 W# f& G! p0 ]; OКласс для начального состояния монстра:
# I' H) K/ v ?4 N8 c+ M$ c- // Пакет org.l2jmobius.gameserver.model.actor.state
, w7 \0 @( D( u. \7 `8 w* ?1 x0 J - package org.l2jmobius.gameserver.model.actor.state;
. f; A6 H+ a! E' s; C4 U
* X: N X: s5 [0 I- i+ U d) L- import org.l2jmobius.gameserver.model.actor.Monster;
, m4 ^& T$ e2 J/ n, R- Z! J ^
5 k% L C; g/ a x5 `! P, O1 _- public class InitialState implements MonsterState {4 L1 U3 _$ W, L; J
- @Override: j- [& `4 I. l. I
- public void handleState(Monster monster) {
: A# k: K1 e) P - // Начальная фаза боя
8 T" k0 y- a$ }) x9 i9 z2 t - System.out.println(monster.getName() + " начинает бой с обычной атакой.");# Z. `. Y& `( b/ Y
- }) ]4 g% d+ ]5 T& v/ m' n
- }
. r$ A, S+ C! l1 g; M: G" V+ n
Скопировать код Класс для агрессивного состояния монстра:
, a6 V3 |9 }: b8 Z$ o/ f- // Пакет org.l2jmobius.gameserver.model.actor.state, M: }1 t7 e* H# d2 L
- package org.l2jmobius.gameserver.model.actor.state;
) F0 H( F: }7 }+ u- D1 U6 K7 [ - 4 Z7 [: ]; i! J( v
- import org.l2jmobius.gameserver.model.actor.Monster;' o8 r s& P* u: j9 D
- ! `& e: R/ N2 g6 s
- public class AggressiveState implements MonsterState {
: ~8 a' l$ `: e - @Override
5 r6 Z( ?7 u2 D' ^4 F/ y" G - public void handleState(Monster monster) {% ^7 w! m/ o0 q2 Q N3 ^2 k0 G2 s
- // Агрессивная фаза боя
" A! K0 E s K/ q0 L% U - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");( Q5 x6 m6 l; n( s; x o$ o6 D
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
1 a) F: T! l" j, u( \, q - } b3 D+ R/ E! B j5 Q, G
- }/ ?) ^" G1 r$ Z
Скопировать код Класс для финального состояния монстра:
0 `, U% j& f) k4 X0 b" \" D- // Пакет org.l2jmobius.gameserver.model.actor.state
# h/ }6 F9 Q6 ~2 B - package org.l2jmobius.gameserver.model.actor.state;
o2 h# C" N% W. H. v3 D" p9 g
# K; ?6 V9 }1 c1 N( l- import org.l2jmobius.gameserver.model.actor.Monster;0 D0 z) B9 T% H3 F; @& a
O# Z' Q+ u% X- \- N* K( \- public class FinalState implements MonsterState {
8 A3 u: p2 m9 Z1 D - @Override: T, a4 c8 C$ {
- public void handleState(Monster monster) {' a1 { a. D& a/ e* y! T; F" U, F6 k
- // Финальная фаза боя+ m: J, m4 ?. ?) E( H& c
- System.out.println(monster.getName() + " готовится к финальной атаке!");) H E2 K0 j- F+ |9 m1 C6 F$ P
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки3 u% [: \+ A) t4 R2 i; `- `
- }. E: J2 ~) ?' U% W8 X
- }
+ C1 p; p, o8 Y; Z+ c
Скопировать код
' g, r6 k. `' \8 `9 mШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
! i6 n e; t( y1 e, k9 U. F- // Пакет org.l2jmobius.gameserver.model.actor$ J0 B$ X5 p: r9 U$ A
- package org.l2jmobius.gameserver.model.actor;
* w, T q0 k z4 S4 T - 9 `6 _! ~" m5 ?% X9 [& p
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;& s y4 P- }* D1 c( u
- import org.l2jmobius.gameserver.model.actor.state.InitialState;/ w! K! K/ J1 S9 N4 Y5 F: D; @
0 c J) B+ L4 x. f& g2 v- public class Monster extends Creature {& x9 p# T( C7 P3 N
- private String name;
/ i3 r$ `! u7 T3 `1 }' U - private double attackPower;& c+ m4 m, U. ~! W
- private MonsterState state; // Текущее состояние монстра
|6 r' Z: V6 t* ? - 0 }$ V& T3 b5 Q
- // Конструктор монстра
5 {2 Z- x P! }5 M4 k - public Monster(String name, double attackPower) {
! I t5 h2 i4 }2 t - this.name = name;
* [1 j7 ~: T. ]5 u - this.attackPower = attackPower;
/ k; ?, r! c1 o: G: ^" b - this.state = new InitialState(); // Устанавливаем начальное состояние2 K& h: T7 Y# Z1 U
- }
' O, ~" x' Q+ }* P( y
! u* e' m1 j$ f# e) E- // Метод для смены состояния* m) Y: f M. S$ |
- public void setState(MonsterState newState) {
5 M. l$ X1 e! f5 f) f$ r+ \ - this.state = newState;
, U% w1 P @% i - }; J% j. M# w# }# s& R o1 p
- 2 W' i8 P% y/ Q3 @! G. c# X! h9 G
- // Выполнение действий на основе текущего состояния9 m; m4 Y4 k7 G G% w
- public void executeState() {
7 A' e/ M; k( ^; e - state.handleState(this);
D" A6 c- s. N - }
% R5 |* {: l+ t( x+ ?9 ^
, f# ]; h q) C$ @: I! I- // Геттеры и сеттеры* b& x! e7 A4 I# _8 k$ Z
- public String getName() {/ s5 E6 E6 ]7 Q' `7 ^* k; u
- return name;
9 M1 r; s1 i% H. P - }' g/ X8 E6 Q* X. B
" }' h! u. [+ T1 M1 \% Q- public double getAttackPower() {8 K2 W$ T3 {$ a) r+ u% L
- return attackPower;% o+ w7 S: q" v; c3 j" L
- }& h& z. g0 ^7 H( N! m
- d" z) G% X) c7 X8 B! K
- public void setAttackPower(double attackPower) {" M" y( z3 D0 [. h5 H. p
- this.attackPower = attackPower;# s) W0 K7 t$ m. |1 K
- }
! W& ]1 R9 F$ \+ c# p P - }4 G+ z8 y" l, Z+ c: e
Скопировать код $ e/ i3 u& p! {# A# C
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра. f# X5 _2 Z8 z5 q# `) a8 f
. _1 d& {5 H! N. z- // Пакет org.l2jmobius.gameserver.model.battle
1 r# ]0 S1 A+ T5 i8 W. P" \9 k - package org.l2jmobius.gameserver.model.battle;8 ~% @7 [6 {, h
$ g- e4 j9 y4 ?5 |5 z- import org.l2jmobius.gameserver.model.actor.Monster;! d! d# g: m$ f% O( S
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
4 d7 I& r3 d6 n+ l4 q# m8 c - import org.l2jmobius.gameserver.model.actor.state.FinalState;
* x8 V( G G. n5 R) ` - 6 n2 i1 F- k( H! o- X7 \+ ^
- public class BattleSimulation {8 g( M1 }& S2 z& X) n' l9 |
- public static void main(String[] args) {1 [- y3 V6 u6 e6 |8 T1 l# E8 L3 u
- // Создаем монстра с начальной атакой
# l9 A' S; w. h& h" V( o, [4 C - Monster monster = new Monster("Дракон", 100);* g" N8 C q+ I3 m
0 m3 @3 n& D/ {& X- // Начальная фаза
& N# ]9 Q v4 V' w5 O0 l - monster.executeState();
6 h% Z9 Y7 N, o V# w8 y
8 z' `6 C1 x6 v) t- // Переход в агрессивную фазу
0 L* C5 ~% N9 y* a( h - monster.setState(new AggressiveState());6 Y3 G; g U+ O4 \9 v! r
- monster.executeState();. i3 y# d$ ^ e1 K; d" i
# ^2 P/ \ b# A0 ^ a8 v- // Финальная фаза
0 t) K2 \5 g' T+ b h - monster.setState(new FinalState());! c( v/ I/ A2 d
- monster.executeState();: v6 u& H1 |7 U5 k# e
- }
+ \0 g8 v6 H9 s8 Q( O' h - }
5 @" v- c7 Y- f4 w7 u, D6 [; O
Скопировать код
& X% p9 C( h# ]Комментарии по структуре пакетов и классов:" ~6 j ^* j& c% u$ T9 Y; e
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
' _( L) J) C7 E/ ~ ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
m5 a! F- _5 j. f+ iЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!! `! ^5 a& D, e" G' k5 \9 z
; j" c% a. i/ i# ^' {* E' D9 F2 A9 a) ~7 K, ?
* }& ]0 S7 d- f, d+ v
4 d0 W+ Z* k, m0 o5 k i) P6 }* x7 A
6 L/ ~; o* |! F; b
4 g1 _& i9 U7 O0 g' S6 M0 i9 e$ t9 J. }, }+ O& ~, T* h4 i
, P. ^! a7 A8 e c7 ], Z+ o5 S* E) y
4 p% g' x" \/ ]* \
' w! h( M) a3 f, O& B2 d- _ E5 c) L1 L: b$ T; w9 `) m' n
, M4 e* U5 [8 s4 S
4 V2 k# b; Z' {. X. m' a) L$ t" e |