Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 2 ~9 x4 E# I% q- W
6 l3 f5 ^4 H2 K7 F3 G* c
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.0 J7 q8 f n" E, u6 L; M
- U0 i \! E4 m# |) |Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
9 X/ Z) Y5 F" x6 [# f9 a& N5 U* c& Q1 t, {' v: c' U6 _
- // Пакет для состояний монстра5 o: ^; q/ ~0 M
- package org.l2jmobius.gameserver.model.actor.state;1 H% A5 B& c" L9 y" x# Z$ m
- f; S; R+ g6 L4 ?* V- // Интерфейс, представляющий состояния монстра2 l' ?& I- d7 c* U: T( W
- public interface MonsterState {
( D5 c+ i, B5 s+ t - void handleState(Monster monster);' B& A3 |' s6 R7 B7 l
- }$ l! q* B" ~* G) F( @
Скопировать код
* ^# T% Q$ @' ^* q: t# DШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. , V. p1 j& ?4 |
; S$ E" p# ]. K5 H) D. _- i
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
7 K6 `. C% z! ^' o+ e1 r' |1 ^- ]% }2 P6 s8 a
Класс для начального состояния монстра:
; R+ k* M4 O; `# E/ @- // Пакет org.l2jmobius.gameserver.model.actor.state) M3 ^/ F& }* n' S
- package org.l2jmobius.gameserver.model.actor.state;
( [6 D5 D4 v8 I! ?2 C
, _: w/ ~7 p2 U: p( v# L! [+ T- import org.l2jmobius.gameserver.model.actor.Monster;
0 Q% r2 i3 c2 s$ T+ V: f
) R8 ?% f% X' z7 G2 g. w0 E- public class InitialState implements MonsterState {
1 F) o% W2 V1 a2 t - @Override# `: e4 V9 H: K9 i9 `# f
- public void handleState(Monster monster) {
: R2 n0 ^4 I2 {+ t7 e5 t! v - // Начальная фаза боя, r9 ^( Q* O; O/ D/ [$ N
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");& Z' @$ y0 w* z5 J+ y) [
- }
2 t X! _; q# z h. P; A/ ] - }
8 p! k& l& X& t, V) G9 h
Скопировать код Класс для агрессивного состояния монстра:
3 p- ~& b, P4 e, j- x& c% E- // Пакет org.l2jmobius.gameserver.model.actor.state
4 e: t' U$ t1 v9 x4 i. n - package org.l2jmobius.gameserver.model.actor.state;1 ?0 `, d- ~ T+ G( d1 Q
# e8 d n8 u. ^ x# f- import org.l2jmobius.gameserver.model.actor.Monster;
$ a/ ?$ P) y# g+ _ - " r2 t) t" f( U# r0 m& ^4 L, L8 S5 H
- public class AggressiveState implements MonsterState {
( T9 F: q" q! }$ \, { - @Override
* Z& v# K* x6 ~2 J& m - public void handleState(Monster monster) {5 U0 x8 H9 w/ {, E; N
- // Агрессивная фаза боя
Q- l" [. e# j7 Y. V - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");* K# J$ I/ B- x$ G, {) K
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки* S6 V7 g; M F8 m! i, m& P) |6 ~
- }. L, y6 v; O, z; B
- }- \; {. T/ I) M+ p3 i! @/ v
Скопировать код Класс для финального состояния монстра:4 w2 n7 m+ u0 W) S; m1 _2 Q
- // Пакет org.l2jmobius.gameserver.model.actor.state
% m% ^# _$ G2 C% C5 u - package org.l2jmobius.gameserver.model.actor.state;9 s. M( @* M7 L. @0 A9 O0 g$ g
- + T1 b1 k2 X- y; L5 q' p
- import org.l2jmobius.gameserver.model.actor.Monster;- A8 b' M0 b9 G& h5 H. I
- 5 J+ p5 N# n& z0 z8 P, b
- public class FinalState implements MonsterState {
! C) v3 f4 I) H* G - @Override# y* j" l6 f/ P: _% P' f
- public void handleState(Monster monster) {! {8 O& n/ `" l% z$ T9 t2 X0 h
- // Финальная фаза боя: B/ v- A q4 S) g P# V
- System.out.println(monster.getName() + " готовится к финальной атаке!");7 O6 N) s/ g2 o: [, _' q; ~
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки% Q8 `* u* X, @$ ~3 X, j
- }" {' k: G7 O4 D% |4 Q
- }
. Z9 Q) F4 ?2 z; A/ n: m9 S
Скопировать код
, L- U1 f1 u x" A# O+ W- }Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.7 c1 N+ }6 g% G+ j+ ~+ O
- // Пакет org.l2jmobius.gameserver.model.actor
5 g. o% g8 S9 I r6 V$ g% q' M - package org.l2jmobius.gameserver.model.actor;: u6 P8 P' F. \8 j, P, x% h
& j- k. c _) ~ c6 }5 S; i- import org.l2jmobius.gameserver.model.actor.state.MonsterState;" ]+ J. K( J9 ~+ r, g
- import org.l2jmobius.gameserver.model.actor.state.InitialState;
8 B; h6 K! Z5 b5 E& R
- S: d, J5 u3 s- public class Monster extends Creature {: G2 [$ z- R, u: z) {0 i0 F
- private String name;; {8 s5 B2 k: a
- private double attackPower;" h/ s$ M$ x- o
- private MonsterState state; // Текущее состояние монстра- O4 F- c, S5 k* j5 h7 h* b
& i4 S4 z* b9 r' _1 c- // Конструктор монстра
; @5 f$ z; o, {: V- T% R - public Monster(String name, double attackPower) {) @* P' p/ I0 e2 k+ E+ i; q* m! }2 G
- this.name = name;5 ~- d! |$ E: `2 @ H* W
- this.attackPower = attackPower;5 y3 s+ L0 K: N3 E7 @% @* n& o) q
- this.state = new InitialState(); // Устанавливаем начальное состояние% k% V5 X5 b) R+ h: w/ m
- }! H& e: @5 b$ ]# @
& @" \/ d! H8 N3 I- // Метод для смены состояния
" i: S% Z% J1 V& }, C - public void setState(MonsterState newState) {, C2 j* z' o/ \
- this.state = newState;
) C+ J; K2 C- P% Y& D - }9 @+ Y' }# i$ a
- ) l: c* H1 a5 j* C5 O: P+ @
- // Выполнение действий на основе текущего состояния
$ @4 W# K$ k. K1 s1 a2 s; A) d' q - public void executeState() {
$ h2 i! g% D n: x9 t - state.handleState(this);
& \# o, v6 s) y$ [/ H4 y - }/ e# z& W# P) |! P/ `' M. p; ^
- # R& t" H* P/ I9 d! s7 ?% |0 W
- // Геттеры и сеттеры& p9 U4 n: ]) j8 S7 i y8 e
- public String getName() {
2 M- o$ i( Y$ L2 l6 t" i' R# s( r2 a$ t1 U - return name;
! U6 t7 f% Z! C& t4 H - }8 `8 d' l! k: B) K: l4 s4 g
- ( \, E+ l; ]9 F( i% J) \4 m! O
- public double getAttackPower() {& j! n' E o% D6 g7 y
- return attackPower;
9 B9 |5 B* L6 v7 f- o - }- @% i7 g2 Q- ~
- " S( j$ l/ }: d
- public void setAttackPower(double attackPower) {
3 z+ d* s9 V2 ^& T - this.attackPower = attackPower;+ ^4 X$ y, _, a4 d/ @4 X( d v; Z2 t$ y
- }
1 ^, d- _% P" B1 p4 `2 N - }+ D9 N2 V3 Z+ e* y- T- p' M( _) Y/ E
Скопировать код 0 l0 b# j H( _9 q" U4 \
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра./ `2 l+ J3 @' M. g4 D* W
, p: F! F4 S% ?) B( K+ Z- // Пакет org.l2jmobius.gameserver.model.battle
2 y2 `8 f% ]$ J% E! n, ~5 ]) V - package org.l2jmobius.gameserver.model.battle;! ?1 y& ]8 w: F: L
# B8 L7 F2 z" [4 S3 a. m- import org.l2jmobius.gameserver.model.actor.Monster;' \7 C- W5 ^6 A: ]& ^; R' B7 ]) Y
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;" W9 ^# a, { I2 a. U2 y( W
- import org.l2jmobius.gameserver.model.actor.state.FinalState;
) j$ ]# y! A5 W& u1 z" O* Z
- }/ J7 s5 n" R$ ^! E- public class BattleSimulation {
7 L* v* h+ ^) t3 v! w: |. Z - public static void main(String[] args) {
4 a7 U* \) L9 t# d! W6 @# v - // Создаем монстра с начальной атакой3 _0 z: C! q, V# L. M- m
- Monster monster = new Monster("Дракон", 100);/ e; F/ H) d9 U: T3 S
' i% \6 R4 M; f8 f/ U- // Начальная фаза
; ^' U, L2 F- W3 t - monster.executeState();1 b2 L W( n+ H6 @
- # n: z. P" _; m' y
- // Переход в агрессивную фазу5 f3 o7 d& m- c, @
- monster.setState(new AggressiveState());
( d! r7 `3 J2 X+ M+ f2 L* { - monster.executeState();
* ?$ A; J+ Q7 a4 v7 f/ X - , k. I/ n, Q7 R# Y
- // Финальная фаза
6 X' |4 H3 u# N! P) _8 H4 j - monster.setState(new FinalState());& \- `" T) A4 I( F8 c
- monster.executeState();9 Y- I9 K( C2 Q, M# l+ {# l( Y+ f
- }+ t* h' X' }% {( f
- }8 N8 a/ T2 }8 @& E6 ?+ m6 @+ K
Скопировать код s: ]8 A8 y! k# e8 L' u9 ^1 D$ I
Комментарии по структуре пакетов и классов:
' }2 F6 U. r1 |6 g/ M d3 r- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.+ Z, d8 [* D- U* ^+ m9 }
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.( S* g h, H3 E
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!! O) I5 l+ j6 e
- c: H1 S) \! F Z, v# O8 h. }6 F
# R: q) F5 s! r( A: |7 ]
' s" Q/ _ W) d( r' l! c9 l$ [1 N2 T/ o, G4 X9 I* b% ~5 P7 g* r' B
7 T; `# `. G% X; K5 X6 z5 o& j" y- j5 f9 ~0 B, M
/ z8 h* g7 q W% ~0 q6 V
" v0 U3 r: w) ?% `/ J
1 C" p! Q+ Y% q! j4 {" e! b, J0 i
, n& T0 R* z: O! Q! K1 T- `* |. O# R
" J( X# o& X* `' n- k! n
_+ n* d2 Y) |0 P6 r8 n* r% ?
( A% J$ n e7 z( X: d
|