Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 3 }2 {. ]! [ L5 t- |) M
% o3 z3 x" \. K3 L( \
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.: Q' a; P! z/ H% u5 T, R. x* }
5 _- }1 v" i: \, m) c5 |
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
" w2 T d9 }7 X9 N0 {$ U8 `. V7 E! P, d6 Q
- // Пакет для состояний монстра
! _5 U7 R% t- o4 U/ p+ A - package org.l2jmobius.gameserver.model.actor.state;! u" B. G c# L- z0 V
- / @9 n2 q S9 |& \ n$ m; ~
- // Интерфейс, представляющий состояния монстра
# {( c# Z' z$ z3 c9 |7 o - public interface MonsterState {
9 Z' L7 c5 v0 Y, n% @% }2 u: L - void handleState(Monster monster);& @9 ~8 N, X3 M/ k
- }+ |& S0 L4 ] l& K: Y1 _
Скопировать код
, `+ h4 d9 W m6 WШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
2 W/ _0 c6 W' l) N1 S2 H" D$ f$ r+ w& O1 A% w$ P9 C, P9 _, c. Z
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя./ t" V* @4 F" P! y0 ^
8 c( u/ }( h5 h; P$ BКласс для начального состояния монстра:: D2 M3 }, W7 A9 `6 P1 \' N0 E
- // Пакет org.l2jmobius.gameserver.model.actor.state9 X( F9 @0 c) u5 P. A& x# b0 y
- package org.l2jmobius.gameserver.model.actor.state;( ?' V' H# A7 D6 h J* x$ k
- 4 P( a* `: g) _- h1 s
- import org.l2jmobius.gameserver.model.actor.Monster;0 q( f& p) h6 o% w% c8 ~
- ) v- ^, y6 y$ f3 O; m# o9 ?$ h0 }
- public class InitialState implements MonsterState {
+ |; _6 T5 f2 t/ h8 _/ T. y: J - @Override
6 B: C, ?4 d5 F$ Z/ D; n) z$ ]2 A - public void handleState(Monster monster) {3 @7 X& s0 n6 U. D
- // Начальная фаза боя
1 K: n ?$ L% W1 b& ]6 k - System.out.println(monster.getName() + " начинает бой с обычной атакой.");, W3 e- r9 b4 Z
- }
+ N, x; b/ e3 [0 l. a) o - }
4 ?) E+ f: f: j) X
Скопировать код Класс для агрессивного состояния монстра:
% D6 K; u0 J" a- H& V, ^2 H9 Y6 Q5 F- // Пакет org.l2jmobius.gameserver.model.actor.state2 O5 d. n8 @, q( ?8 ~# Z
- package org.l2jmobius.gameserver.model.actor.state;% k5 {3 B' z U' p
- 8 {" Y* w5 X8 a; L( f
- import org.l2jmobius.gameserver.model.actor.Monster;" _6 z: n4 [0 _: { p' H7 F
- : E9 L# f: ]' H* n* G
- public class AggressiveState implements MonsterState {9 r; b( z6 A8 F) K& @
- @Override
7 g. n6 ^. i* K1 A - public void handleState(Monster monster) {# ^1 q" b0 }: j4 j
- // Агрессивная фаза боя
; U& A V7 R6 _, u1 Q - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");4 _& w: ?0 @" q
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки/ J: R9 B7 s% ?7 N
- }
2 @( o8 Q) [6 J - }
# ~: A% F: u6 s" M8 ~, _( W
Скопировать код Класс для финального состояния монстра:
" z; J( W5 u G3 E- // Пакет org.l2jmobius.gameserver.model.actor.state
$ G' p* G; \% V( D! V- U - package org.l2jmobius.gameserver.model.actor.state;
8 h5 u$ M0 @9 Y4 ^ - ' D2 t' ~1 I+ f2 i$ D! d w6 ^4 e" o
- import org.l2jmobius.gameserver.model.actor.Monster;; m7 h+ d3 w/ ~& ?1 P
- ' f* W# c! H5 w1 L
- public class FinalState implements MonsterState {
! c5 |, ?1 S( {) J5 `4 e - @Override% \ I9 Z8 J0 D; O4 [
- public void handleState(Monster monster) {+ r: C( E' R' Z0 e3 L* `7 n
- // Финальная фаза боя8 J( ?4 D! D6 y3 v" H
- System.out.println(monster.getName() + " готовится к финальной атаке!");
( g! ]. k& x4 s C - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки% `/ |! E5 P$ s& P3 c& w: i7 t
- }
& @, a3 [! c- x% A# m! g+ f5 x* w4 c& r - }$ O0 L5 M* Y. w& ?
Скопировать код
" s8 C0 d( h4 v" U! mШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
, K; [; ?" g4 K d. B& T- // Пакет org.l2jmobius.gameserver.model.actor
+ z0 E$ [" X7 t9 ]6 J5 t - package org.l2jmobius.gameserver.model.actor;
% C! ]: L- v" w# `* q
, L* w" f! o4 |3 I% O- import org.l2jmobius.gameserver.model.actor.state.MonsterState;4 @, I, ]6 E2 U+ G; E, m9 e
- import org.l2jmobius.gameserver.model.actor.state.InitialState;
1 |* V- Q: P8 N, c6 y8 J; {
3 q$ U L4 a; L1 G0 w7 m0 w! I2 g- public class Monster extends Creature {
( v. z7 P* D# S" Y - private String name;/ y, b7 @+ u" X5 N* I# C
- private double attackPower;" C8 l9 L: D! I+ n% k1 w
- private MonsterState state; // Текущее состояние монстра, N( _/ M' y: Q! L/ M2 j
- ) P2 e5 X* F& F2 S, p
- // Конструктор монстра
( x! [$ b. {- O7 K - public Monster(String name, double attackPower) {3 R/ e! [- W6 c* F( I5 j& K
- this.name = name;
# `9 B. |1 Q/ X6 B7 \ - this.attackPower = attackPower;! f' i* c9 y/ D" t( V. o9 r3 i4 I
- this.state = new InitialState(); // Устанавливаем начальное состояние* N9 K# c% T. p8 e+ _: T
- }
: d$ q1 x2 p9 o% ?- G - 6 `# I3 v! B! }$ A7 a
- // Метод для смены состояния
* I. S+ ]+ L7 t. U- W5 ~ - public void setState(MonsterState newState) {* V3 N8 x/ |* d2 K8 X6 Q8 u0 G
- this.state = newState;* D8 @! c7 N! g; |) f
- }
& n4 S( h% s6 ?- u. d - ; D$ q0 h/ ^- M" B7 A/ B
- // Выполнение действий на основе текущего состояния+ r. q" _" x/ G+ Q
- public void executeState() {
3 T& E' s$ A6 P1 u+ _ | - state.handleState(this);
( e2 j! f) g/ Z: R - }
5 i) \" X c+ r. k) J
; ]" p% h" k! g I- // Геттеры и сеттеры
8 X2 ?9 L# O0 I- E% D$ g8 u2 F7 j - public String getName() {
1 O1 C; N7 }! k. `8 ^/ u' r4 x w - return name;- V3 k, s! K2 w% e5 `# F# X
- }
* K7 c% ~" t) L& Q, J2 o' ?0 o9 x - 4 E# ?) q" Q9 l! e; ?' f, i
- public double getAttackPower() {
' L+ n/ s; g9 O - return attackPower;: U7 x! X, A( |' W0 f" g
- }
) K2 D- { m; b - . g2 v& H4 L8 ]7 y# H% O
- public void setAttackPower(double attackPower) {
~; k* d2 G. W. ? - this.attackPower = attackPower;7 G0 T$ p" v7 g. e& d
- }3 V# ^1 R' H" C# T+ W! c; e- u
- }; c1 U$ c' D5 _/ w2 Z$ Z
Скопировать код
~3 i% y$ q; o8 q" ~Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.; t5 K5 G6 D9 H- g; J
" b% q* v8 M) l5 G" S- // Пакет org.l2jmobius.gameserver.model.battle8 |3 T' c! O/ o3 x$ i
- package org.l2jmobius.gameserver.model.battle;- B4 D5 E4 [: f5 c
- ; o6 d1 I- _0 c ~" p
- import org.l2jmobius.gameserver.model.actor.Monster;$ j4 k% N' \% H1 B% G" F8 V+ @
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
8 F* _1 ? q1 Z& u. {0 v% ^ - import org.l2jmobius.gameserver.model.actor.state.FinalState;" `; A# \# c. c9 C+ z
- 4 b' P+ n" A4 Q; P& ~
- public class BattleSimulation {; [* j% a3 ^' J& X
- public static void main(String[] args) {0 e& }; w4 c# @; T' m
- // Создаем монстра с начальной атакой8 a, ]4 T- t) u/ [8 q: X7 E
- Monster monster = new Monster("Дракон", 100);
) g' z3 I5 V9 `0 G - , s3 S- D' |+ x* ^
- // Начальная фаза
7 S$ d+ n. U) u1 n - monster.executeState();7 D5 N. v' W0 P8 b( u8 I
- ! j, f' ]4 m n4 `
- // Переход в агрессивную фазу
& }( O- K9 d' w6 k - monster.setState(new AggressiveState());
! v m) u# c) b; b - monster.executeState();; u2 y5 G0 O: Q. [9 H, t8 R4 G" c8 p
* _ F: ^7 G. ^) F+ i; ~5 J) F- // Финальная фаза
# U+ X7 {" F+ Q. p! F0 @0 D - monster.setState(new FinalState());
7 S v, l* I+ j; y+ a4 p* C2 C1 H8 ? - monster.executeState();5 y1 h9 @ a4 G
- }$ @- v& h4 {4 i( V3 q
- }5 ?+ X6 }! [8 J0 Y4 U Q
Скопировать код
6 x% \0 R5 L6 iКомментарии по структуре пакетов и классов:
+ h3 H3 }& e: j- B# B- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
1 c0 l" \( m$ X/ @, l+ o& P ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
. T# T* _! }" T' k) V" ?Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!+ e( i( c0 L* c) W# P
$ _( K6 }; y, d& P5 ~- S
+ U+ j' N( b) Z1 d5 F
3 g# i! ?: |5 ~. D# x. a. _" J! I* {% u3 U! B& F
6 ?" ~! S( U) \5 L
0 X# E0 {# v8 X8 B
& y) X7 G; _$ c8 n: p3 e) A% [, p# H
: R) _, u( L" o# p# O0 \& l
2 V* M- e! ~7 R$ w R6 ?
1 t6 L- {$ m# D! f0 Z ~. u* d
) ^2 J3 ]0 Y M# b) i# Q/ ~$ g0 w: |5 s# m
5 N* e' L+ Z( B# P6 y) c% c
$ U# x4 t$ q/ X0 @* p; W4 a
|