Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
$ n, J G+ I' T* k' }- p: O+ Y, m( c. f- \# y8 ?
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.7 Q N1 d; Z( d5 H
) w1 o' H& y& ?3 L+ `Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния./ H& R3 _; F# K! p1 h- k
; o# y$ w0 f h/ y- // Пакет для состояний монстра
: q& N; U& R: X. A T& I - package org.l2jmobius.gameserver.model.actor.state;
: [' h8 d* p7 R$ \6 H7 I+ X
% Q+ x. l5 t k" W. v8 g- // Интерфейс, представляющий состояния монстра
- ?3 k e+ q: n* ~0 v/ _( I - public interface MonsterState {
( n% K9 r2 T/ M& @1 d6 M* e5 o - void handleState(Monster monster);+ G" t8 _9 T( |* k
- }' z! W" t+ H6 D. g8 F% I
Скопировать код
0 F$ Q" I3 `# k( J( A+ O6 T% R. @Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
a' S- D! H4 S' r
) h+ V4 o7 ^2 q, Q: c* jЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
" p; C2 S) C# M' A; t T% p
( w ]; W# l8 }) ^, O; SКласс для начального состояния монстра:
1 y" y$ @! I2 U; J/ S, F1 n R- // Пакет org.l2jmobius.gameserver.model.actor.state
' _! _0 |0 _2 V9 Q( o# C - package org.l2jmobius.gameserver.model.actor.state;( ?6 v; @! S8 |' T5 Q' Q
- 6 d9 T" L: p' v9 G% L7 ]
- import org.l2jmobius.gameserver.model.actor.Monster;
1 z0 x+ ^# C4 D& \2 F/ G( I `
6 @2 F) v$ _6 F! P5 a8 x- public class InitialState implements MonsterState {
1 R1 e& C2 T( l N - @Override
9 L1 Z% z0 U2 l% L- a O- j - public void handleState(Monster monster) {
Y4 I8 i& v5 g( t6 R - // Начальная фаза боя/ }: K: p# q. i' g+ C5 O
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");
* ^. x4 @9 e0 B* A/ G - }
- z6 b7 H# X ]" l6 _6 m - }
# i6 ` A ?* [5 t9 G
Скопировать код Класс для агрессивного состояния монстра:0 K0 O# g/ z: f) Z b Q) g
- // Пакет org.l2jmobius.gameserver.model.actor.state
( C @+ e1 u% `0 y# {( Z+ b - package org.l2jmobius.gameserver.model.actor.state;, }2 A9 x: [) z; L/ i
- d( o' J7 y9 f2 [) e7 h8 w
- import org.l2jmobius.gameserver.model.actor.Monster;
; Y+ M2 L6 R: A4 g' c - ; t! _( B' B; i A! k% @
- public class AggressiveState implements MonsterState {
5 w7 _4 \2 y! I+ F7 ~' F; o4 i) l - @Override- M4 Y! |! v8 n* S
- public void handleState(Monster monster) {/ m6 ?6 y* W1 J$ o8 j
- // Агрессивная фаза боя% z& `" ~- A- Y* H; V1 }# N
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
+ O7 t* g( m |- Y. c - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки* p3 D0 ?& [* k T
- }! Q5 m% n) ?$ r& a/ m8 [: D7 e- D
- }" g$ ]1 Q8 \' g, ~: o; r
Скопировать код Класс для финального состояния монстра:4 r7 n7 {6 A2 p; i( ]5 b3 v
- // Пакет org.l2jmobius.gameserver.model.actor.state
' f0 u' ?5 Z+ J, u - package org.l2jmobius.gameserver.model.actor.state;4 ?0 I3 j+ Z& H3 a, ~
: O: S$ p }% f" |$ _* V- import org.l2jmobius.gameserver.model.actor.Monster;- t4 Z. r$ h/ q- @7 S+ A9 C
- / n& r6 T( y. n' ?
- public class FinalState implements MonsterState {
% C2 D, n0 i# \, V0 k, \ - @Override
/ L7 {2 M8 Y5 D2 C5 a7 y7 Q: ^ - public void handleState(Monster monster) {2 p: S; e9 U) @* B+ c3 L9 P& g
- // Финальная фаза боя
7 | @, l' r( T) M - System.out.println(monster.getName() + " готовится к финальной атаке!");1 ?5 g4 H+ q$ p, W6 x o! h O
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки% j3 Z7 t$ [- L+ Y" j* H( m; B
- }
# W# P: F2 N& c2 L# `( ?/ R9 G0 q9 o - }
( O: W: n) ?3 [& M$ a/ @( T% q
Скопировать код
+ z6 i p: ?& @# B+ N: EШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
- S C' w2 k/ j1 B. }- G7 ^- // Пакет org.l2jmobius.gameserver.model.actor
, F; a- z5 h1 I6 x) U8 F J0 r - package org.l2jmobius.gameserver.model.actor;* V# Q9 d4 p @1 v; T# \3 B
- * J# o6 V) t% H% S* X ?! [
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
# n \# \0 m. g4 U5 t - import org.l2jmobius.gameserver.model.actor.state.InitialState;
4 D4 X9 G0 X: K5 y* M - y0 L- v: L7 j8 B, Y
- public class Monster extends Creature {
* E. e+ j! D3 H$ A8 V - private String name; R2 T" V6 u( `8 d
- private double attackPower;' Z* m/ J' i# |6 s- q( c6 N
- private MonsterState state; // Текущее состояние монстра' f/ _8 E+ p3 w j* Q4 R4 W
- ; F+ K( V; j- q" h, o5 Y
- // Конструктор монстра% f6 X! _0 U7 X
- public Monster(String name, double attackPower) {6 t: g+ d" H" {) f/ R; v1 q* k0 }
- this.name = name;
9 V( Z1 m: J( n T$ X* T$ A - this.attackPower = attackPower;
6 E3 u" f' Y$ S. a+ N: Q1 q - this.state = new InitialState(); // Устанавливаем начальное состояние
* H! m* G" E4 `# q - }
- j* E3 z* H, Y" b7 S7 O2 L4 h- w% b
8 V$ S4 Y2 h% I6 ?7 ]- // Метод для смены состояния/ H3 F) G3 C9 W! C( n! `
- public void setState(MonsterState newState) {
3 S2 X A. F+ p- F - this.state = newState;
; j! R% V+ I5 c+ E - }) M% l3 v1 r7 j4 s* V! d) |4 I' j0 a
- ( Z2 c7 i R5 _" ?; c
- // Выполнение действий на основе текущего состояния
" Q9 S% U n8 o2 A2 {+ h* ^/ h - public void executeState() {( x- w; A/ `# q0 k2 C
- state.handleState(this);+ h ?% j+ t* z# @. p
- }
, w6 I6 p7 e3 |# i1 p% F
7 J y, L$ A" X- // Геттеры и сеттеры! b. w, ^" B( I! Z8 x4 H
- public String getName() {6 M( w' P u- Q. I1 y
- return name;# z* Q$ x! ~( t8 K8 S0 [
- }
" d- G" V' o0 L/ }6 [: b+ C
l! T7 T) x" x# _. x0 d- public double getAttackPower() {
1 ]2 K2 m% r4 u5 D. r9 {" X - return attackPower;! z, L- W: F1 I
- }
6 O) ?% \" `( O9 s6 u% ? - 4 r; C* c! S) r; t
- public void setAttackPower(double attackPower) {
6 R1 f' n6 s3 |* L/ \0 O; X4 l( Y - this.attackPower = attackPower;+ w4 T: v+ [ h& ^
- }
# \+ H! y/ _) |/ O: o5 g# o - }) r9 o) {& P# } y
Скопировать код ' @6 o0 l v% ^% x7 Z4 |
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
9 l5 I; [- i' j3 O) t2 E( v2 r4 g0 U5 T4 }) w, ^# B" C; `6 d9 R F8 y; n
- // Пакет org.l2jmobius.gameserver.model.battle
3 I' U: ~9 s5 v3 I8 z9 I3 o8 C - package org.l2jmobius.gameserver.model.battle;
/ W1 |) S2 a& O0 z9 \% O: t% v7 s% a
) {/ x4 R$ M' P" Y8 U- |3 O/ V- import org.l2jmobius.gameserver.model.actor.Monster;2 t" R5 h- Y$ j8 N+ N( Q; W
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
- |% e3 J8 B- [6 P - import org.l2jmobius.gameserver.model.actor.state.FinalState;
9 r+ E; R, m- d% W+ M6 A' U
6 j9 b E4 d. ^4 x5 e- b- public class BattleSimulation {8 _9 j7 m: k" g) O$ \
- public static void main(String[] args) {! J, V0 y+ m, X" M2 S
- // Создаем монстра с начальной атакой9 q- }% r8 [: O9 ]; K
- Monster monster = new Monster("Дракон", 100);$ E! g$ } {1 }# s# }- d
% \" f& K# A( ^+ V- // Начальная фаза
, ?& S' y) u8 Y8 h$ @! z - monster.executeState();
8 [3 x0 q5 k" i! }
. s+ \3 F6 r* J5 H- // Переход в агрессивную фазу
. C$ X( c! B+ o4 d - monster.setState(new AggressiveState());; W3 ^* l3 V; d ^8 T1 H
- monster.executeState();) i; u- X7 |! @5 T- z' ^
- : K3 X) K) v9 g
- // Финальная фаза
' B6 K- M) o# {+ x2 }4 ~0 p9 d+ A - monster.setState(new FinalState());/ w' @" P. h7 V) |& s; l4 o
- monster.executeState();( t" X. c% _( Y. V) z
- }
/ S# g8 |' L# p. g7 s - }3 s: O7 s7 N% u1 T' h4 C
Скопировать код
3 }: x9 E! [: a; W, ?Комментарии по структуре пакетов и классов:
+ J x$ v4 T" C- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
+ Q- c5 k: ?' q7 t$ Y! X ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.* U% E9 t* w& L
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
8 L# Y M4 r5 x) k$ R7 K" }4 F' {4 a" W( K' h; F
$ R/ r0 f, p1 Q4 F4 ^
7 H+ G0 K- S: v0 t" x# ~ a, c
( M% C4 j2 I) m4 Z+ s) Q) e1 W
! v0 f) i/ I0 A
* Y; @) ]. y! L$ L) \) ` Y) V/ Q
7 S1 r7 V$ X! w0 E5 M
+ g/ @4 I! |' Z: C. `$ R! }: t
) h3 e1 q' ^/ z9 l9 H; g0 N
$ i. |) o, q7 B+ C# a: }1 n3 Q( L$ @& O! \% i4 z
3 d* Z! R9 R" J+ c* m5 ?
+ p/ M3 `. b) L! r# L
4 Y9 E% V. J- _4 K2 _ |