Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
5 V/ m* w+ ?$ n0 Q; [5 {! i8 M6 M5 i1 n; S
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
* I9 A3 _- Z( \; C$ S& W' H
: }" J" P- ^6 j) ^- I8 [5 S. I3 pШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.3 _2 E% B3 e; B( {1 N3 u9 ^
1 _' s, C( x+ k* M
- // Пакет для состояний монстра
7 c8 g1 s4 f& N$ B _; B& j - package org.l2jmobius.gameserver.model.actor.state;& L I* Y2 k# g& n4 K
5 m: [# a( y4 A |# h' ]$ }- // Интерфейс, представляющий состояния монстра; s0 Z$ y+ W3 n. E5 w3 ]; H( r
- public interface MonsterState {
& O4 s! J0 g8 w$ ? Z8 P - void handleState(Monster monster);
; v) j! i' g7 w5 [4 J! W - }
8 L4 W/ p' e2 n/ y# d
Скопировать код
% r' q* s' v" p1 R- f5 O' l$ [Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
' G: A. a, j% i% T$ }' L
+ F- H; v8 J9 VЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
2 x& _* P7 b* `7 B9 V
9 N3 j+ E q# ~# ?" }; zКласс для начального состояния монстра:1 P9 M8 b% j% h$ g$ i# b: F
- // Пакет org.l2jmobius.gameserver.model.actor.state
& b. m/ }1 z5 R1 o. N2 o - package org.l2jmobius.gameserver.model.actor.state;2 T, A8 g+ C6 Q0 e2 G( }7 R- y8 R
9 l' m+ ~1 L' [7 p6 ^- import org.l2jmobius.gameserver.model.actor.Monster; w3 J$ m5 g' o
) G9 g6 j) p7 S1 p/ N+ }5 x- public class InitialState implements MonsterState {# j! R5 M5 [9 R
- @Override# F" B* ]7 r; @ F# r
- public void handleState(Monster monster) {- n; `/ {6 e! r( q* y" w4 q- g
- // Начальная фаза боя0 f. N0 ?$ K0 m
- System.out.println(monster.getName() + " начинает бой с обычной атакой."); q s; y+ f% g: c. p
- }4 V* W2 k& c: v; r. [; t, {
- }
+ B6 ~: P R3 M. {
Скопировать код Класс для агрессивного состояния монстра:
& H7 n1 d8 I6 C# L- // Пакет org.l2jmobius.gameserver.model.actor.state, R; x& E/ H& E) Z5 G
- package org.l2jmobius.gameserver.model.actor.state;
5 H& C& {" `% n6 | - * L! q$ K. c) m1 t* ^/ t
- import org.l2jmobius.gameserver.model.actor.Monster;3 F0 R) m( s5 s& _- z; T
- / O3 w* x7 V _2 B
- public class AggressiveState implements MonsterState {. T% u- U9 F F
- @Override
, a5 J; v, K" g - public void handleState(Monster monster) {
3 ]: Z; b7 r9 c% z - // Агрессивная фаза боя: i: e; c7 A, u2 Y# Q3 ?) d" f
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
6 c1 p' j- y' j5 Y - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
4 E1 |5 P9 D1 f, {# n# z4 u) j - }
$ l" ^3 a4 @7 n* e* g9 U' ^. _7 m - }; \& J4 Y1 `4 B8 Q6 d. c
Скопировать код Класс для финального состояния монстра:: }4 K( k e" @7 @1 \2 p. C
- // Пакет org.l2jmobius.gameserver.model.actor.state
: g6 g0 ^5 C8 V6 B( ~1 x - package org.l2jmobius.gameserver.model.actor.state;
* M" J5 b$ p: \ C - 0 L' A* T5 V* j4 r1 _: E
- import org.l2jmobius.gameserver.model.actor.Monster;7 A/ N2 w! g# y9 K
3 o" q7 w' n' m+ [- public class FinalState implements MonsterState {% q8 |; y" v6 i. v; _
- @Override: o ?" |/ D9 K) n5 |( l
- public void handleState(Monster monster) {
$ p0 t* n3 Q, A0 S3 v& |+ V! | - // Финальная фаза боя5 T+ |7 \0 Y- ~. R+ p5 e
- System.out.println(monster.getName() + " готовится к финальной атаке!");: D7 O1 ` l) E# o6 `* ]
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
# T/ Q2 L( m- v0 Q. ^. j m - }; g3 _+ N+ r7 |+ p& z4 D7 s
- }5 r3 F" A+ {7 T; W
Скопировать код " b! M8 t* i3 H$ ~
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.2 u* `0 T& j: X2 Q4 Z/ _: }
- // Пакет org.l2jmobius.gameserver.model.actor
$ B2 w+ L* G0 V6 i. K - package org.l2jmobius.gameserver.model.actor;' p) Q/ H# C0 a w3 a
, V+ f4 z- d4 N6 h3 P0 p- import org.l2jmobius.gameserver.model.actor.state.MonsterState;1 h$ A! Q: v6 E @: e7 e' @
- import org.l2jmobius.gameserver.model.actor.state.InitialState;
. p1 P( U1 f$ Z# j: _- { - . q3 G- B4 A) I* L' n% V
- public class Monster extends Creature {
3 x6 u/ L3 B6 e1 [ - private String name;- L: q: l9 x0 D% |+ I
- private double attackPower;1 F1 W( O `" F8 j" ~( [
- private MonsterState state; // Текущее состояние монстра2 J/ u( z9 b e+ b
- . Q) D# F8 p) g6 {
- // Конструктор монстра; C' a# b O0 h4 m" K, u [/ Z
- public Monster(String name, double attackPower) {
( k' ^ n) t- n1 K6 ?& Q - this.name = name; m3 |6 }; V( |7 c* t
- this.attackPower = attackPower;& e" a; Q& ^9 {) ?" I' y
- this.state = new InitialState(); // Устанавливаем начальное состояние
7 `' Z- x1 z/ M( I# X - }" Z/ E3 R) B0 {* C3 N$ _
- 9 S/ i6 K0 J3 z' `7 k" P f
- // Метод для смены состояния6 n/ [2 o7 s( W9 F; u$ {
- public void setState(MonsterState newState) {
q# x3 o6 y- U - this.state = newState;
- i7 D6 p7 R1 _ - }
& y F8 \9 ]* ]4 _
' O6 F! ^4 m e* p. l- // Выполнение действий на основе текущего состояния
. Q$ J7 v+ ]( W* m) w - public void executeState() {
8 U: j% p# q' Q' [ - state.handleState(this);1 r4 Y3 J e' U: Q" R
- }( O& O L6 b+ L" e: b
- & w# w! O) q/ {
- // Геттеры и сеттеры
7 z: i: h, `- k( y9 t - public String getName() {
" U3 ~, I! \' Q) {) M4 O - return name;
8 r1 i: O0 Y" O9 U - }7 C3 A @9 V0 t6 W* W
- " p+ D, G9 l$ T+ ^) t! h) ^* [& e) {
- public double getAttackPower() {
! \6 ^2 ~ g5 I% S - return attackPower;
6 o: r6 x. E0 \- J7 | - }5 V& t5 Q. U" O/ r( ^! o# x
% U: T* L8 L7 B/ H5 t4 o; o7 m- public void setAttackPower(double attackPower) {; ?6 O0 k" L* l; {
- this.attackPower = attackPower;
% T$ \( n4 u5 @) A, u- u - }
% `* A- n5 S9 F% j6 `8 I/ K4 Y% `# P - }; _1 u4 t$ o. x
Скопировать код
! m2 k! G4 I1 L# }0 ~* k( pШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
7 h) ?0 N0 T* t' v# s; \
( r5 k+ c; O5 b/ {- // Пакет org.l2jmobius.gameserver.model.battle
4 h) A- d* n1 x) W' y6 w$ ` - package org.l2jmobius.gameserver.model.battle;
( o8 u4 `8 }6 G0 t" b
" Q9 Y6 } D) Y3 q1 f- import org.l2jmobius.gameserver.model.actor.Monster;3 L, V- K5 ]* |1 d* e7 q. s
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;& L3 Z4 Z Z% {- r: [% Y- N% k' a
- import org.l2jmobius.gameserver.model.actor.state.FinalState;
' S8 @, U, J( A1 Z
# i7 J Z: l. L x- public class BattleSimulation {
; h* T: {+ g) U) ? - public static void main(String[] args) {
1 s# l3 ]# I9 B) j& i9 C, G$ I2 ?$ w - // Создаем монстра с начальной атакой
( r* ]! E* k& u/ w: w& B7 Y: @( Y - Monster monster = new Monster("Дракон", 100);
$ D2 c! C7 M& ]: T& D) d - * y; U3 y( T- _+ u q
- // Начальная фаза) l* c7 I# ?& ?$ d) D
- monster.executeState();' r% z p3 `( m- u( ~( H* o" l( w
: `, u: z" j r, L& A) I' {1 O- // Переход в агрессивную фазу
6 V: ^$ u: _9 m: A1 C - monster.setState(new AggressiveState());/ |4 P# n7 I: N* X
- monster.executeState();9 q, H6 I! f# w4 v( O
0 b8 u- o" K0 c+ r' @$ H- // Финальная фаза+ N# X) p0 B5 ]$ S* K
- monster.setState(new FinalState());" x v" S9 ?6 M2 u1 r
- monster.executeState();4 F* m+ I0 l- w% G: a
- }* N" B/ l4 ~" k! _3 {
- }
, K6 @6 Z& w2 c8 x
Скопировать код
9 C6 R1 m% G& ?/ w; pКомментарии по структуре пакетов и классов:8 [9 e' i; O' l- W7 V
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
# _& p2 W# C% a: a ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код. C- E# _% X o
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
- |+ x1 Z- w$ \0 \' M3 y4 i6 u; R. _1 n' [; }. }8 C
2 A# Y5 `. D' i3 g7 o7 R% y
: ~3 X6 J+ G# p) o7 k4 m2 m- d
4 w3 T+ H& M( w% s4 g; g. n) o" B
9 g C. F( z- M1 C( O/ b/ s5 e3 u- ?- h4 k$ x3 q
g5 E4 J, o! U+ A1 ]5 h) k' D5 W {+ o
1 @& W7 R! G& w# N# H; {) Q
% x/ m7 g) d% e1 J
( J u4 ~; t! ]; ?: J
. m4 k% s+ ]0 k4 n. Q
8 q! e Y+ \( {# Y
2 h" E L. B0 i |