Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). - K, k: ^ u$ r# T
( Q# |) Q" V0 t d3 A) O6 v
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
z7 c1 G& H" m z- \( o p3 [9 G7 @. Y2 j2 B
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.$ a( V. _& q X' s/ L. V
# [; D w3 M+ U7 m4 d
- // Пакет для состояний монстра
8 i/ Z3 U3 R4 @0 J- r2 n/ g# ^ - package org.l2jmobius.gameserver.model.actor.state;3 o& e9 |& V9 f0 J5 n# \- A1 c
$ s' j" w7 q) ^+ w7 E$ H) a d6 x- // Интерфейс, представляющий состояния монстра
% u3 |) ]$ ?( d - public interface MonsterState {
$ r- {2 M w8 u# G( S& j - void handleState(Monster monster);! Y- V! [/ Q. e/ O% D: G
- }
; J/ ]7 [" U7 T& B) M
Скопировать код
; n; ?4 Z/ G$ t( y% [% e/ BШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
" N1 I2 | w) y- O$ ]' X( T% u/ n, j& b$ S$ P6 n, z
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
, x: w1 E: [/ V7 h, [3 p0 s+ P' c7 Z! P: z- h% g% }5 m& J) R
Класс для начального состояния монстра:
9 A# m% c# G) J1 A R- // Пакет org.l2jmobius.gameserver.model.actor.state
4 B9 S2 G; A' ]% P% X6 @6 E - package org.l2jmobius.gameserver.model.actor.state;
~6 p: h/ [! _3 v, v4 l - 7 Q6 G4 a) F" u2 l2 _
- import org.l2jmobius.gameserver.model.actor.Monster;0 j' n! P5 ^! `- n9 K: j( d
8 a8 b$ f8 f' G! ?; P- public class InitialState implements MonsterState {' O5 c9 R3 a5 p/ q' m$ N8 {
- @Override! u3 E' I* J* N }" b f
- public void handleState(Monster monster) {' B; y D5 m% f# M" O* H
- // Начальная фаза боя
. j1 R6 ]* t: ?/ q) z% f5 U - System.out.println(monster.getName() + " начинает бой с обычной атакой.");
" B0 l2 F1 T' K$ ]9 _; U - }
4 o d; q W* n; ~ - }
. J9 h3 d# W3 Q( \$ q
Скопировать код Класс для агрессивного состояния монстра:
& `5 N. M2 A" `. o( _ f& W- // Пакет org.l2jmobius.gameserver.model.actor.state1 x8 d+ [& g: d9 `7 o: k. ?1 B7 K
- package org.l2jmobius.gameserver.model.actor.state;$ Z6 X8 n+ I# J
* R K# r" T0 g' T$ i# I6 k D- import org.l2jmobius.gameserver.model.actor.Monster;) D. C) \$ \# y" U
, ?8 C1 u6 f( ^1 p! x/ d- public class AggressiveState implements MonsterState {, ~ x+ j/ ^$ ? I" ]
- @Override* z+ ~" Z ]8 K5 M! `# {5 e
- public void handleState(Monster monster) {
7 i5 |; J' T( i$ M* L. \ - // Агрессивная фаза боя$ v5 l( B7 E) B
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");' w5 o; X5 ^2 D. J0 t
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
1 h! A% l. |6 S$ P - }/ o9 |/ i1 }' x0 H
- }
' H9 A i* A, n
Скопировать код Класс для финального состояния монстра:* t& V% j' \9 W" L* w+ m/ m
- // Пакет org.l2jmobius.gameserver.model.actor.state; j* E& {- s) P, x- w( w3 Q
- package org.l2jmobius.gameserver.model.actor.state;3 T) H0 F8 I) Y+ r' B3 g5 q' y
- 8 |0 D2 ]! K: v/ f
- import org.l2jmobius.gameserver.model.actor.Monster;
1 C6 o0 t5 o# {8 G5 @1 f - - P" L4 u( n' Y! x5 w
- public class FinalState implements MonsterState {
2 Q3 E* m' U5 D2 j0 R. J - @Override
+ |8 I. h# A. o7 s0 i" y - public void handleState(Monster monster) {
, f" ^9 D0 @% V: ^! ]# b2 _ - // Финальная фаза боя9 m1 \9 w- p/ a1 O" D# q) v
- System.out.println(monster.getName() + " готовится к финальной атаке!");
7 r* f1 j8 u$ N+ U - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
. M8 k( ]3 H+ j$ c - }( N8 b. a# P3 H; O4 T
- }4 \1 a9 t9 f1 k. X: i3 F
Скопировать код , w3 M7 B, o$ C7 d3 }- w
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
% Z& k, q1 w7 V2 {- // Пакет org.l2jmobius.gameserver.model.actor
1 F) H' s8 b" @: ~ k - package org.l2jmobius.gameserver.model.actor;; |7 R: V o+ i. Z
- 7 x! S( o! C8 P; Q: A: m& ]
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;1 n; W$ |$ d D9 v) S4 t( T
- import org.l2jmobius.gameserver.model.actor.state.InitialState;
8 C( d# h% |! u- `& Z) G
n8 [& p. t/ Q! y" o$ o- R- public class Monster extends Creature {- \# g( S1 U8 R( z' y
- private String name;
! c( Z0 o: x/ r0 v - private double attackPower;4 I( J# @$ l* N% ? | S5 |% i+ d
- private MonsterState state; // Текущее состояние монстра2 _5 {. h& N- P- k
- 4 o( e# G: r" k. ~0 l0 o* x+ Q* a' E
- // Конструктор монстра
* R9 @8 K& e/ ` - public Monster(String name, double attackPower) {
. u# L$ g1 t; Z - this.name = name;
2 \4 @ o. W! g% e; g4 `% { - this.attackPower = attackPower;* v- y% c* T; T- M" B1 B
- this.state = new InitialState(); // Устанавливаем начальное состояние
3 ^5 T1 j) W4 V& L - }) T l; p$ L1 e* `
- $ Y* n. w0 l2 ^* Q
- // Метод для смены состояния
% T/ I' H+ E R" y - public void setState(MonsterState newState) {
e; Y' K! i& Z% g7 ~1 p - this.state = newState;$ Q, {7 h( i5 O6 }/ [- K
- }! \5 y$ Y1 ]) Z" Y- v8 h
- 7 ~) |2 O k7 n* d' O$ }7 I
- // Выполнение действий на основе текущего состояния( n. @; e( A, v4 D z
- public void executeState() {
/ r6 q9 t8 S+ w" w: F% H - state.handleState(this);
2 j$ M3 n& r: d7 O. u* p - }. a! T' f4 W0 S5 n( h) w/ D
- 5 A5 l4 \* q8 m X
- // Геттеры и сеттеры; I5 x4 @2 G+ a) {3 {, Z" q
- public String getName() {
/ J. a2 @2 J& |6 ?1 \ - return name;5 s& E _- g8 i' X. m p
- }
2 y1 c2 _/ E; }2 k - " e4 R5 C6 C- V% g3 }
- public double getAttackPower() {
) y! Q) z; H. L+ b7 a7 r' H - return attackPower;
. x' g/ N& b/ [" ~8 a+ o. l - }
+ q# \* @9 m5 r! W2 ~1 a! X3 X9 R - 8 ]4 C: e* C* }
- public void setAttackPower(double attackPower) {
9 h2 e: `6 B2 |3 ^! \ - this.attackPower = attackPower;
9 E) N; M. I" \ T& Q - }7 y6 [; C( I/ J! U' I
- }, A& n# m7 X1 `
Скопировать код 7 h9 z/ Y) `- u
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
) e! O; ?+ w4 d7 a8 v) j- p( ?! W* q, B/ O% F) S5 Q5 k
- // Пакет org.l2jmobius.gameserver.model.battle6 i" q" m: s3 `% o
- package org.l2jmobius.gameserver.model.battle;( L1 g7 Z/ ?- F6 W7 {& Z
% Q. k! K0 A# J) u B- import org.l2jmobius.gameserver.model.actor.Monster;/ C& n E X! F0 \9 D* Y- N
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
) g: f- H& l, u. ^/ t1 P# l4 L - import org.l2jmobius.gameserver.model.actor.state.FinalState;7 B& g E% a+ r+ Q
- . h! T* h( e1 v. O9 z
- public class BattleSimulation {
/ ]& W, c. I. m* b0 @5 R+ j0 L - public static void main(String[] args) {: r- C4 n+ q$ ^; B" Y1 a
- // Создаем монстра с начальной атакой2 \; T+ u: S& C& ]6 w
- Monster monster = new Monster("Дракон", 100);
7 a& S: K% |$ k. l
t. Q1 y# C: D2 o- // Начальная фаза
5 N, M: P4 L P" v* v. e' P2 x - monster.executeState();( g' g" i5 d$ e
- ( g5 O/ l' s% K2 c- F
- // Переход в агрессивную фазу- S7 I& H, E3 }) M/ l3 @
- monster.setState(new AggressiveState());( C& w* p$ c! K; t& w/ S9 d
- monster.executeState();
% ^ t; V/ `" y+ n3 Z5 J4 V% Z3 L( r - 1 L& E5 w y+ _' z/ Y# O
- // Финальная фаза
# a$ w9 {, I/ o/ q. ~- Z V! Y - monster.setState(new FinalState());
5 M2 a, W5 U6 l" P# ] ]1 S0 ~ - monster.executeState();
+ F- ~/ }8 W; k( R3 H: d# H$ q - }/ Q" f& @9 X3 g O( v+ j' ^
- }
" f4 O" j8 w+ s3 U5 c5 a a! `- Y
Скопировать код + k7 g0 L* N" U2 y, ]6 c. V% l
Комментарии по структуре пакетов и классов:: W" ~/ k0 ]; F6 P, G' u4 i9 T
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.% B8 @; e1 b3 J6 R) h, h+ V2 F
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
3 \) b5 r' q9 F/ \2 bЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
5 G, X) f% y+ e; h6 R0 y: Z3 F, d$ t) `% A: t( C# m
, U# _$ W: S% H1 m; M, A% |; u& I' A2 ?
& o# {! H L+ r& m; U! ]
: G9 R) o7 f7 b+ N6 j" |3 n& j# B ]4 f. b$ F. G
0 G" K; W) r/ k
) }/ T# S c" G8 G6 V4 {4 s- T6 o
/ v/ \) M- W% \5 U8 p9 v1 Z: u: ?- l
7 I5 A1 t$ \( ]: P9 R1 I Y& C1 C* V' J1 b. A
6 A! z% l0 G- e5 ~, J
( T, f: p; ?0 i! X0 }9 T% W
: M- e) F1 U6 x) ]: n0 C |