Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
& r u1 K \: V! F7 ^; w k- b5 r5 l
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра. u5 A$ f9 H. {9 @# N
# m; z$ p& Y4 M+ |9 s4 N, I% [3 @Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
& }9 h3 U6 V7 ]5 q
3 _0 B( J' m4 m- // Пакет для состояний монстра/ n6 Q1 P4 W- e' x, u" U
- package org.l2jmobius.gameserver.model.actor.state;% ?% A- K1 z$ [& _5 I0 B
- * L: L; j/ y. x7 A4 M
- // Интерфейс, представляющий состояния монстра& s- L9 S f9 G0 r3 a1 P* `
- public interface MonsterState {
; q! \, @6 \" F T5 y - void handleState(Monster monster);, e, d8 w- o" n9 W- U) T/ r
- }
, K6 p+ `: s$ J' q
Скопировать код
' k R5 ?% Z0 m0 S8 aШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. * _0 Z+ _. V( x9 F c
5 k% J$ e1 x4 |$ X7 J9 k+ R
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.- p4 P+ X5 Z. @! O8 J, k0 @" J+ P
* f! a8 q; J+ K7 z" |Класс для начального состояния монстра:
1 U* g! ]. k: L% b- // Пакет org.l2jmobius.gameserver.model.actor.state
; L1 ]! Q" H3 ~/ u - package org.l2jmobius.gameserver.model.actor.state;3 x8 o; E8 c4 K# a4 c
- ; ~$ ]! S& f: n3 f
- import org.l2jmobius.gameserver.model.actor.Monster;4 h; F% k4 U9 P/ B
0 i$ D8 H! {' ]) C2 p1 d" X+ g ]- public class InitialState implements MonsterState {
2 |, H8 L& C$ m& P - @Override3 Z/ c1 W8 n0 W' |
- public void handleState(Monster monster) {/ y* x: |1 H. |' a! p* ~ E
- // Начальная фаза боя6 t/ o9 _3 D9 \: |8 {3 P+ X
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");" Q0 P, d4 g5 Z7 S9 w; [
- }
& N! \4 j! }0 u& P% \6 b - }
3 ?9 S e6 _3 `3 G" L5 v
Скопировать код Класс для агрессивного состояния монстра:
! o, {6 ^- U$ E W: L- R9 U- // Пакет org.l2jmobius.gameserver.model.actor.state
9 j. C+ C4 @: {% J) I - package org.l2jmobius.gameserver.model.actor.state;
5 g- A2 X; B1 f
* a5 O( j) J* w* g' `( U5 E1 A v/ M- import org.l2jmobius.gameserver.model.actor.Monster; ]2 ]' R; T2 H0 L
* `0 s: q$ f4 M6 q n- public class AggressiveState implements MonsterState {3 C: K! C* h5 c7 m& M( j! C; T
- @Override% v0 f$ Q- T; g/ Q, {; B5 q
- public void handleState(Monster monster) {) ] p7 o: P$ ]. @0 a
- // Агрессивная фаза боя$ h( M( _* }) d [! I
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
& x7 ^) P1 S" b" S+ z - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки- K* U) C9 F- H+ v4 ^
- }% I/ t& I1 t. f4 D; H8 b
- }
* \& ]* p3 F {! ~) w8 z
Скопировать код Класс для финального состояния монстра:
7 b r d9 Q6 `( I5 U8 ?7 H3 f- // Пакет org.l2jmobius.gameserver.model.actor.state% d( }0 y# e/ n, Y, V. X. d6 o
- package org.l2jmobius.gameserver.model.actor.state;+ I3 f t8 ^6 `4 h, ?& H
; x2 H% a7 E3 M) l. Y5 l- import org.l2jmobius.gameserver.model.actor.Monster;
# P0 |! D/ |7 [' T
2 l- d4 ~4 x6 u) }; [9 y- public class FinalState implements MonsterState {
9 U8 Z* B/ c& L2 \0 D% [- Z - @Override. A. D4 `; F: q; F
- public void handleState(Monster monster) {) f8 z. D; H7 D
- // Финальная фаза боя
: @# Q% n) }1 K. ?- {7 y - System.out.println(monster.getName() + " готовится к финальной атаке!");
X0 @5 y1 z9 n0 B8 O9 V - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
- |* {. }" V8 i' w - }, q/ b* B N+ c+ C- l1 E
- }
Z: B7 O3 E, h- L
Скопировать код & g& D& y) p& C5 m- b; Q8 D
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
; E4 q+ r: B2 x- b _- // Пакет org.l2jmobius.gameserver.model.actor
2 f6 ]) z4 {' p2 y$ C% m1 T - package org.l2jmobius.gameserver.model.actor;; F) X6 ?8 t3 G& q+ c: k! c
7 s+ ]- O+ h5 p6 Y' D9 l! V- import org.l2jmobius.gameserver.model.actor.state.MonsterState;* G5 V; d) w& c
- import org.l2jmobius.gameserver.model.actor.state.InitialState;/ l9 A9 a2 z8 D6 R: v3 s4 U) j: O
" Z6 y- R1 ?6 v6 r- public class Monster extends Creature {3 {) j* @. D. j2 F* ~
- private String name;; {7 @9 j0 s4 d
- private double attackPower;' u! O/ j, O; C! i/ m. G9 J; A
- private MonsterState state; // Текущее состояние монстра6 Z* G! S- `9 e. r
. K9 H" E, @3 g- // Конструктор монстра
4 `$ x- k/ t2 I/ w; K, n; B3 E - public Monster(String name, double attackPower) {# S% g3 d8 K- {& h' y1 M
- this.name = name;/ h6 C* r" D9 i- z. e" y; D
- this.attackPower = attackPower;
3 x _5 n4 j7 g: K$ M - this.state = new InitialState(); // Устанавливаем начальное состояние
( {, Z' W; C% [6 O- v7 w3 L1 s - }
q, Q9 h& Z! X - # O- h/ N: C# t2 ]
- // Метод для смены состояния
7 r% p( V, E" c: x! Y9 g- e - public void setState(MonsterState newState) {
. n6 g6 @9 Q& q2 z - this.state = newState;% T4 }0 K' c( z0 U; I( ]
- }
3 P9 u8 j, F: l: s+ r
2 d% L! V9 U( A' _+ d8 X4 ]- // Выполнение действий на основе текущего состояния
5 b% ^! Z: s. i - public void executeState() {+ n- N! R) s% h: O1 N
- state.handleState(this);9 a( {. Z1 j8 r! c( i
- }7 ?$ g3 R& {9 u$ O0 ` {! k
( T1 x7 {6 |- R( y2 s- // Геттеры и сеттеры
" f5 k; J( T5 z0 G. [- q) K0 p - public String getName() {
/ i, f4 E3 V* t, } - return name;
- N7 P+ G9 y$ \6 K# S - }
' _3 z% K9 s+ w - : p" L* z: ^6 Q- h
- public double getAttackPower() {# X+ S$ S! f- r; `0 m7 v
- return attackPower;5 @$ H8 ?- a8 y$ X
- }. V4 R* q. n, f% G$ `
/ k/ ^# \- K+ k& |7 t% s- public void setAttackPower(double attackPower) {
" G: x7 s8 m" C - this.attackPower = attackPower;$ @2 W3 {: v- N/ w& D8 |# _& N8 J
- }
/ \7 ]; S: D" V7 p$ C - }0 k4 K U! U7 s1 B" `
Скопировать код 1 Y9 k9 Y1 d$ Y6 O
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
& f8 }- m: A% ^( ]9 R
: P. l: H9 n. z- // Пакет org.l2jmobius.gameserver.model.battle" O" ~* v6 |' o5 C" B* t5 Q! c" ?
- package org.l2jmobius.gameserver.model.battle;
: R: U: }# i H% k - ( v) S* \: m: A4 H: r
- import org.l2jmobius.gameserver.model.actor.Monster;
) U) S4 m4 \0 j. g - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;# C Y) [7 n) I
- import org.l2jmobius.gameserver.model.actor.state.FinalState;
4 q3 G" f" a+ \2 f k" a' y
" K, m& s! j$ p! g. U* d/ w- public class BattleSimulation {3 e0 P+ @- p, [( H
- public static void main(String[] args) {
5 d# P0 T8 l. W( U - // Создаем монстра с начальной атакой( i6 N$ h) F3 |: x. E
- Monster monster = new Monster("Дракон", 100);
: f* |5 i+ _: f4 x+ Z4 { - $ m9 o% C7 G; g
- // Начальная фаза, s- w8 I1 o# d+ F( K. c
- monster.executeState();+ e3 N8 s$ n; ~; P
- $ i- x, z5 }) i9 v! F2 d
- // Переход в агрессивную фазу
, N* d2 G1 F3 `& t3 N6 C5 | - monster.setState(new AggressiveState());- F: O) J) _' j1 y& d: U y0 g: m Y
- monster.executeState();* {4 J3 E' |2 a$ A. P* C
- + l# ]0 w9 I9 T# t2 S# i5 ~
- // Финальная фаза
- P; X/ t; b; Z" I - monster.setState(new FinalState());
: ~" @# m% E* l - monster.executeState();: Z3 {; h" H- p: V a9 Z
- }
1 q- R' v8 t) x - }* t# |9 H- ]# |
Скопировать код N0 o$ F. k* V' R; t5 }+ ~: |1 }# f
Комментарии по структуре пакетов и классов:
( a6 e% _ c) ^! D( P. q- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.- X( S! y! g! \0 ] `
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
" C1 N2 G4 W# N9 Q2 gЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
2 j! Q8 v g8 _' f$ s# I+ y4 q
7 X8 @: ]$ v, j, Q9 E. B7 c4 ~" a' w! B; d0 I& p9 i% g
2 h$ T# V# P/ V8 I* Z
# o7 V8 m3 |7 X2 z$ V3 T2 u% W) d8 R* p+ s$ y/ l
% T5 L( k ?8 X5 d p
* P% }! r3 W. H- L1 `2 U i* G( @4 M0 K3 e4 X* N5 F* J
6 G+ h" E4 t% L" _% i' P& Q( C& q0 Z7 T1 U; K+ ~
: Q0 E1 J3 r; B' H! z- u, N& H/ K+ q* v" t
7 N/ [. n; L8 `: B5 `7 y. v0 l
M+ N8 d: x/ ^8 Z+ W |