Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
2 a# v- i* P" i7 i2 i9 K8 a) X- s. E
" B- g* y; W* ^Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
: n$ P: h0 i. O8 ~
2 s0 ]% R9 s- A9 D" v3 e, JШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
% T) ?9 Q1 X, s3 X
+ Y" }# V/ H- w: I- // Пакет для состояний монстра8 V @/ e! `& \2 V6 o9 E
- package org.l2jmobius.gameserver.model.actor.state;' @, A3 T+ E# P' M0 h+ O! S' g9 L
- + H: T; C. N3 n# p5 ?
- // Интерфейс, представляющий состояния монстра
3 z; l; T6 \2 o, d2 r - public interface MonsterState {' F% J/ K# p; q# a2 j1 z- I
- void handleState(Monster monster);
5 f+ T9 ]2 _3 Y - }* K; ~9 r0 J+ I
Скопировать код 0 V, C$ q3 R: J, ]% Y7 R/ c5 U
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. ' d4 B- L* O. @0 E
; w0 V% T% x0 a+ y; D" J/ M7 e& cЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.! m1 F/ K/ q; e% q2 \- @& L
. h. G+ ^; c$ Z x' V) S
Класс для начального состояния монстра:
/ d+ |- P6 v' R& X% l- // Пакет org.l2jmobius.gameserver.model.actor.state
4 D2 N; y$ X* c - package org.l2jmobius.gameserver.model.actor.state;
4 I% r9 N& u6 t5 Z5 p
$ e+ U% O% I- L$ o3 R2 r5 ~; E- import org.l2jmobius.gameserver.model.actor.Monster;
6 G' _& p7 m9 r0 o8 N' j; y
8 @3 A+ U3 B5 _! c, z. |- public class InitialState implements MonsterState {
2 J+ f, L6 @6 }' ~ - @Override
: m# ^ J6 A' c/ W ^" _+ Z- D9 o - public void handleState(Monster monster) {: m4 a* T! Z: Q
- // Начальная фаза боя
7 Q! I7 D5 L7 x) ~) {+ v - System.out.println(monster.getName() + " начинает бой с обычной атакой.");
0 e" Y$ N( l( z% v - }- t# W7 {" R9 j+ `+ B! x
- }
! p9 H! D; u! ?) [( F) f
Скопировать код Класс для агрессивного состояния монстра:
! ~# C/ V+ B1 V) e2 V, Z- // Пакет org.l2jmobius.gameserver.model.actor.state
% |* f. w* l& q5 W& \# a4 t) e& } - package org.l2jmobius.gameserver.model.actor.state;! E3 _$ ?) W" J7 W8 r
% w+ x% j% y M. A4 d0 {- import org.l2jmobius.gameserver.model.actor.Monster;
2 @ L2 C- C5 \& B; {; O( z - ! W. u& ?* X& v6 X% K \# M
- public class AggressiveState implements MonsterState {: p7 D/ a& j D" g3 } w
- @Override
( o3 u! h: q4 H) q - public void handleState(Monster monster) {* _: P U7 q; O! l
- // Агрессивная фаза боя
$ A- P: u `' Q1 ^ - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");, j& A2 P, q! I: x; y& I
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки* I6 N% y# K& g
- }: g( A9 Q: G- c$ ], O
- }
2 a' R9 E' u5 t( X- j& ]! x
Скопировать код Класс для финального состояния монстра:
- K' W) |6 a$ {+ B# a- // Пакет org.l2jmobius.gameserver.model.actor.state
$ N% t, [7 P- o6 E* Y3 P - package org.l2jmobius.gameserver.model.actor.state;5 c" Z+ U$ W/ D% |
( J J! G3 @" @) J6 d- ], H I- import org.l2jmobius.gameserver.model.actor.Monster;
3 M1 r8 \, _1 `7 k* _ - , E" _1 e9 e7 o" q" m J% X9 }
- public class FinalState implements MonsterState {
8 R1 C9 B5 D) U* D( r" _$ G' ? - @Override
" D- k }8 `" L* t, g3 w$ { - public void handleState(Monster monster) {+ d# O. {3 T( Y2 Y, C! V5 x
- // Финальная фаза боя& Q. z4 R& a' a6 S# M$ S
- System.out.println(monster.getName() + " готовится к финальной атаке!");" F8 o! D1 h0 Y# z2 D9 L# {
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
, d" Q1 f: a6 c" x- \ e6 H2 O - }
; A6 }( W8 A% D6 g - }
; ] u7 L z/ O, n
Скопировать код $ C; a ~9 s$ ^4 t0 g3 r3 u
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.' q. K, e {# l: a- t
- // Пакет org.l2jmobius.gameserver.model.actor) A5 F6 K6 o% m* H1 N2 D6 ^: U
- package org.l2jmobius.gameserver.model.actor;
" k$ p; x, n/ W - 3 D2 P" w: P' t& y
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;% T( X; q1 x" {( L$ L, Z4 U0 |
- import org.l2jmobius.gameserver.model.actor.state.InitialState;
( y H% }7 b- Q# r
3 r) K- ]( s/ }2 B* u# p, `0 n- public class Monster extends Creature {* ~9 |5 A7 ` V: S* S
- private String name;' U1 L* J% ]: T8 Y$ t
- private double attackPower;
5 a1 _7 d+ W7 A7 a: N9 i - private MonsterState state; // Текущее состояние монстра c; D5 c+ m% m" o) i( ]
6 ?0 \3 D! S7 Q# @1 q6 ^' |% Y- // Конструктор монстра: K: a; Y/ j/ B. y& G' C
- public Monster(String name, double attackPower) {
' K( W8 D+ b8 m" _ - this.name = name;
: f7 c& U4 H# U; l8 P - this.attackPower = attackPower;
8 W& Y* U, P2 v4 o" Q0 c1 I - this.state = new InitialState(); // Устанавливаем начальное состояние
+ z/ |* N" U, d* ]! A- i - }
; B1 z7 m0 z2 B5 p6 e, q6 |! @ - . c4 J; ]) ^1 E- ~- F: _4 p& l
- // Метод для смены состояния' R. `5 }" x2 Z
- public void setState(MonsterState newState) {
0 G! p: f0 S5 `# _0 L. v5 Y - this.state = newState;: K: t9 l" H u; B: O+ k
- }
$ k) f7 u" Y. H. w, R" T7 O& c& H - 7 {1 c6 A# ^2 m
- // Выполнение действий на основе текущего состояния# O, H* s3 F) v. r4 R( H; [; {! Y( @2 g
- public void executeState() {
4 a; {! ?. a6 s' C& Q - state.handleState(this);9 g( @8 @ C7 b5 D2 g8 I
- }- \& S: Y9 Z" `* u( O- B8 O
- ! Q% E" \; m& H% N/ `( B
- // Геттеры и сеттеры+ C3 T7 p7 H+ _$ \: C" z! \% S0 r% Z
- public String getName() {: V5 Z, C# ~$ X" \
- return name;2 c3 o: a9 y9 G& Z
- }
) W% y3 V$ u0 c9 M$ N4 f! [; R
2 v- e5 T2 j; n( g l1 c- public double getAttackPower() {7 Q5 T& i7 @5 {. j2 f6 O$ C7 h
- return attackPower;
, [( l9 f( d+ A0 ~ - }( E. E( M7 x- a. }
- 4 d' W( @- w' n" i
- public void setAttackPower(double attackPower) {9 v$ u4 S" G) y
- this.attackPower = attackPower;* ~4 d0 D9 i4 R2 C
- }
6 C: o. t! Z7 M% f u# s, G1 t - }
( b+ ^( l# T6 E( P+ {
Скопировать код
; x( m6 Q9 x2 W; W PШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
" X% x4 S% r. \: I) `: F/ g* I- ~) d" ^6 i
- // Пакет org.l2jmobius.gameserver.model.battle5 {7 t) K$ l l5 g- I0 Y, B
- package org.l2jmobius.gameserver.model.battle;9 I1 v' |1 ~+ c: x2 V8 A( P
! ^/ V1 l' k6 p6 H- import org.l2jmobius.gameserver.model.actor.Monster;
& g; i8 V4 {: U) B - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;! Z2 g; H2 I. t Y5 O. h; H
- import org.l2jmobius.gameserver.model.actor.state.FinalState;3 S z$ s# {2 j! o+ {3 |- n2 { s
3 ?+ P9 D' C! P+ M, N4 P- public class BattleSimulation {
; z7 h! {$ W' R: B - public static void main(String[] args) {
/ Z7 i; V5 ~! M7 H( [" F - // Создаем монстра с начальной атакой
3 v" r$ s* J7 g3 y2 T9 y6 V - Monster monster = new Monster("Дракон", 100);
: s' u: u( o. ]' r
2 S' B+ p- W; Z) ~. {8 x8 Y- // Начальная фаза
4 M+ X0 l, Q" _3 V - monster.executeState();/ [* t/ ]- S" y: X) e7 v
# d3 v; g# \- `% m) _; \6 o6 U- // Переход в агрессивную фазу0 n( g% Z$ y8 b; ?- U7 q7 |- P6 A
- monster.setState(new AggressiveState()); S" G& b( @8 [- R" o* x0 f9 q8 ^8 P
- monster.executeState();
) B7 f1 j; ~+ A3 e4 B( N
/ R0 k1 ]% N9 S- // Финальная фаза( Z0 i9 y' h5 X6 s f
- monster.setState(new FinalState());2 X, v2 n" t( M# ? j1 E+ x
- monster.executeState();. p$ g0 {. u2 u9 _. g$ F+ q& g
- }. O9 G5 U: p4 g- W
- }( H, M% s3 Y0 u
Скопировать код ( j6 {+ h* T( G
Комментарии по структуре пакетов и классов:
, g8 f* I# {+ D6 d6 Q4 v- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
0 S; |+ u) |$ \% k0 |0 v ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.) p: C2 Z& L& @
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!7 P- I8 _: w+ x$ ^% [9 n
% H7 S" }9 m' S# A, X
5 g9 ]1 X2 o" p# I
3 R* `+ K6 x- x7 o1 p' _& V, [) G6 f, x2 Q
1 a! {/ g2 O) F, L) g
6 T' k, H y6 A7 s( A
3 d" Y4 z$ s/ \- m/ z8 I2 W! i/ a* C, _1 j$ ~
/ g% o& F6 _1 v2 g
?9 |5 _6 y+ E2 N9 |
9 F5 @! t/ O/ j! I$ M+ B( T4 _) |7 V5 V) Q& l5 }4 r( ]
/ V3 l7 q6 C/ v m
: {4 H0 W, x6 J' |1 T |