Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
& ]! f/ m) c$ G- c4 i6 I5 T: z
. S! u3 v) m/ ?* p1 b. PЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
2 r X) a; z. E# z% u" v
* ^/ O9 `; V% g0 ], o3 EШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.: N% Y4 t+ |3 K
q. C" U: d* M" \! y
- // Пакет для состояний монстра
) M% z. Q$ p5 h: T- {2 u - package org.l2jmobius.gameserver.model.actor.state;
; _ e- |( n8 _ x+ ~& B7 X* u5 ~
3 Q9 R" y8 B7 ?3 V2 ~; o8 O- // Интерфейс, представляющий состояния монстра
8 t2 T# Z! m7 T u; _0 C2 n* ^ - public interface MonsterState {1 ?% ] Y6 K" ~* b5 b: l0 i
- void handleState(Monster monster);7 k# z9 i: Z0 w
- }
+ u) e5 ?% @- W% {
Скопировать код * {. v s9 ~5 ~! }
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
6 l8 s( A5 A1 P* l; x
3 ]0 a' y1 U0 y1 V* r" nЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
" G, Z/ L/ D3 d n7 d0 E, I, f" T0 N4 S/ g( c( R. N/ T
Класс для начального состояния монстра:; ^$ u3 [% f9 w2 C
- // Пакет org.l2jmobius.gameserver.model.actor.state
9 `# b r# J1 r% u - package org.l2jmobius.gameserver.model.actor.state;0 G- b2 {0 a1 {8 ?) u
6 O% w# u |* @7 ]- import org.l2jmobius.gameserver.model.actor.Monster;
3 F# z9 a4 F* u7 m! A( c& U& J
' _+ R: Y0 d" V$ x' r, o8 V- public class InitialState implements MonsterState {1 n) P# P& f3 G3 Y. E1 X3 E
- @Override
0 _+ e! I! ?, O& F - public void handleState(Monster monster) {# I7 W: c0 X- J, C; X* e" n( L" n
- // Начальная фаза боя6 k4 V" e; R L1 _3 K1 {; D" o
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");7 E3 i# n5 T9 P) x2 T0 i( S6 h
- }4 X) `" A2 [& D4 P3 a: R
- }; s4 J/ d a( `3 V8 k6 _6 r7 C) x9 q
Скопировать код Класс для агрессивного состояния монстра:
0 N- Q$ X0 t, ^5 h* c- // Пакет org.l2jmobius.gameserver.model.actor.state. s+ v, g* U4 v
- package org.l2jmobius.gameserver.model.actor.state;
3 I! ` h& }# H0 t; k5 _* y - ( U) X0 g7 K. n a" e
- import org.l2jmobius.gameserver.model.actor.Monster;
) x- R8 t5 J- W2 F - / o; v: c1 ~ D& a6 g& `* c
- public class AggressiveState implements MonsterState {
7 W, J$ x4 P" _4 y6 J* _ - @Override+ z" z4 G2 @: g8 H, f
- public void handleState(Monster monster) {# }& O( ^" V3 Y' m# W2 G2 G/ O1 P' a
- // Агрессивная фаза боя
/ p' P& R# j- O- D; ^) s1 ^ - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
# S# g9 S! q0 K! d - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
9 q! I, g' j6 K0 z - }
& B0 g2 H5 {5 i! e& _ - }
4 f4 |, I) {3 e) Q9 e6 d
Скопировать код Класс для финального состояния монстра:1 L, d" k; S. A! S0 \# b( N
- // Пакет org.l2jmobius.gameserver.model.actor.state6 A9 O8 W. p9 O
- package org.l2jmobius.gameserver.model.actor.state;
! Z. O- `3 x l' Y% d1 J! y
9 c& q2 A7 X1 K6 T- import org.l2jmobius.gameserver.model.actor.Monster;5 B5 i, | e: q. B4 @5 h
- 3 t% W& X4 S9 L- n% b+ y' G3 D' C
- public class FinalState implements MonsterState {
: E& s' Q3 a# Q! U. t! F1 k - @Override
+ m( s( @8 }8 x1 D0 l, i( x" d - public void handleState(Monster monster) {
1 c* O& A) s3 @ - // Финальная фаза боя
6 O/ I9 t* e4 R - System.out.println(monster.getName() + " готовится к финальной атаке!");
1 k9 C+ U% M+ y/ [6 ]+ G [, L) k: _7 m - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки; Z8 `( Q% G! C1 w
- }: F6 `4 ^ G+ Y4 W% ]5 y" n
- }
! s! W9 X- A+ R$ j: `( |
Скопировать код , z6 _3 ]" F) f( x8 `+ @, D
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.( H8 x: ] V; ] M
- // Пакет org.l2jmobius.gameserver.model.actor
) o( D& i9 H+ M# |7 v& { - package org.l2jmobius.gameserver.model.actor;
4 Q0 V" a6 v/ Z+ Y7 I2 N - 0 X7 H" e4 a) [, z6 H
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
% d0 m1 s# Z- m2 _ - import org.l2jmobius.gameserver.model.actor.state.InitialState;$ G! P0 q! x) Z% X0 c
! D+ K, u5 r* {2 V& m$ z- public class Monster extends Creature { P# O# G/ F9 i( k2 c" c. n
- private String name;' o. }. C' [5 b
- private double attackPower;$ z$ g& q$ h- D0 K, E1 w3 n0 H, Y
- private MonsterState state; // Текущее состояние монстра }3 O+ v9 {8 v6 A0 U
5 r+ M9 A$ M9 U$ _2 b8 e3 ?3 R- // Конструктор монстра" x# G$ ~6 x$ `( Q
- public Monster(String name, double attackPower) {
/ W; C& r9 q# o! d; f& s0 p; t) O2 u - this.name = name;6 I5 j A% ^6 K8 }- H
- this.attackPower = attackPower;2 @% ^1 L6 D- L( ~
- this.state = new InitialState(); // Устанавливаем начальное состояние4 k4 z4 h; Q/ p# c2 _& ^6 \
- }
/ _: u f5 {# M m' D* A) ? - 2 h# l1 s% \5 a4 `0 e
- // Метод для смены состояния5 B9 G$ @/ d. Y$ R: }4 I) V9 v$ p
- public void setState(MonsterState newState) {
# Z: Q F1 a" |" c5 ~6 H - this.state = newState;4 b/ w1 Y0 C$ _, o9 d6 a+ `
- }
: D: s/ G! x: n0 R7 Q) m+ m3 V
: @ Q0 l7 b! [' z- // Выполнение действий на основе текущего состояния, {7 ^* V9 C* V" A6 p: o
- public void executeState() {
4 b8 g0 x4 S% K4 Y2 `# h" n - state.handleState(this);
& C9 A/ r) H+ l1 J8 c" u - }- h% B0 X6 O, P5 j+ e* P8 u
/ q+ I' K( s# N4 w- // Геттеры и сеттеры2 z" y7 k- a4 R" l
- public String getName() {
$ \4 T( B6 G. r - return name;
; X K8 `. N$ F* C - }
+ x! v# W7 C8 G6 J; c5 X
8 X4 d) @& ` i; ~2 t: d; U. a% D3 v- public double getAttackPower() {
9 \* {4 W8 G. M& n2 W e - return attackPower;# p7 i; p2 G- a
- }3 K5 v2 L ]9 |+ s
, f7 i- ? l' n5 w% ^- w- public void setAttackPower(double attackPower) {
& m6 S& k8 v; Q; d; x) X7 v - this.attackPower = attackPower;9 B& y0 o6 \ W+ g6 j
- }
$ o" z0 g' z9 V. f% {5 L, b - }
, j/ X" I: f. c# v- o1 w
Скопировать код
& A) l5 z9 Q! j. C9 lШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.7 A+ j1 i3 }( k0 G/ a! O7 g
! \* l! I$ c8 O( \0 ?- // Пакет org.l2jmobius.gameserver.model.battle
' c$ l9 P6 W! S. t" L: X! e - package org.l2jmobius.gameserver.model.battle;
% x, y# E @ i6 k1 }" \
/ J X" A4 D$ j" P3 b- v; G- import org.l2jmobius.gameserver.model.actor.Monster;
$ s8 o! d0 g( B, n. W, J: B1 J - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;+ P0 B o' X1 s+ b: c, D
- import org.l2jmobius.gameserver.model.actor.state.FinalState;
# a! Z g& }: k - " [3 J; y- G1 i& ~* B
- public class BattleSimulation {
% W6 {" H4 B6 O( U7 }; z$ h - public static void main(String[] args) {
6 \% r+ n, u3 N5 \ - // Создаем монстра с начальной атакой# v9 R. F3 E' x
- Monster monster = new Monster("Дракон", 100);
% e- d2 I7 I, `; n5 n9 ]# a4 \
' F% X3 F# ^4 L- // Начальная фаза0 s/ ^. _+ V7 z! g5 A
- monster.executeState();
) x; R" `1 D* e, d. X
. r- H; O) s% j* m% ~ Y- // Переход в агрессивную фазу
' a# w+ M5 b9 X! u# ~& o6 x - monster.setState(new AggressiveState());
+ ~. @, p5 m3 n; l. S - monster.executeState();9 X; r$ O# i/ p/ I1 w8 k* c
1 H! g7 W4 k" }- // Финальная фаза
( Z& v* p3 j2 T; f/ D8 ? - monster.setState(new FinalState());
; O# u' x, I5 B7 A - monster.executeState();
1 d, [. j6 K7 Q3 S - }# i7 E+ b1 C; |$ S+ R8 L
- }" C. v( [7 f# |( I
Скопировать код ) C. ?5 R$ D# n8 C0 e5 j9 H
Комментарии по структуре пакетов и классов:7 t$ D/ S* F0 _3 \" o
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.; y; E Y; H) v$ s9 o [ z8 s5 ^. A. ~
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
7 e8 W1 m' z- X0 DЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!5 y" A4 ~5 r5 J6 W+ K
% k! N o) a: U: Q
: c, e& ~9 y; ]: [; ^1 @- g5 S* B& n M) N6 B
- e: n( [# m+ ]8 f1 p/ {+ o; f- K n- A. n6 ~1 J3 C; h4 a1 Y
0 w2 i; Z2 d! K1 q0 r( _
7 S$ o7 z( n% y3 ]' k! f A
6 W* `$ v3 l/ b7 D' A
% N1 m. y$ r' Z" G5 ~
3 |4 l& x* r9 D4 m- K5 s% ?# x0 J8 Z6 h9 Z5 [+ \
5 z6 d' Q9 R0 U7 x
- M4 N4 C+ Q% @
; q: ?% B* L- B4 f* e
|