Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 9 R" E: j( k. m! {0 h
, X1 u/ D* w. z3 e# O$ nЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
6 \9 L ]% h$ N1 D7 n* u5 s9 Z M$ ~' n
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
8 ]9 }3 ]; W2 C4 J
' x) {6 W2 s, h' U' @* d- // Пакет для состояний монстра: [9 `1 o" H _* }* [
- package org.l2jmobius.gameserver.model.actor.state;# Q& y) i( y/ d
- 7 p3 R1 Z+ ^, F
- // Интерфейс, представляющий состояния монстра
5 e# E. h( I) ~1 G: A# i; {0 Y - public interface MonsterState {8 A8 I" @; Q0 ?4 Y! x) V% S
- void handleState(Monster monster);
; n/ x( Z/ R" r7 N( e; ^3 g& h4 P7 ] - }1 w8 ^2 d8 g }9 m! l7 D2 \) L' K8 W
Скопировать код 1 o: ]7 M- m) U. s2 [5 d
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 7 J% ~( j$ G5 a- t7 ^8 O
8 ^+ m+ C+ r6 `3 M* A
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.: h2 B/ ], W6 }# E: M
: {' t+ O2 s: c4 j" a8 K, B
Класс для начального состояния монстра:
. @8 u& i% h5 P% F- // Пакет org.l2jmobius.gameserver.model.actor.state
4 q( W1 X+ p7 d6 p+ \- c - package org.l2jmobius.gameserver.model.actor.state;. ^1 Q/ F5 ~% b0 _5 t$ O. M6 g* d
' x8 x: D2 r5 [3 a8 E% b# ^- import org.l2jmobius.gameserver.model.actor.Monster;
# k% V* _5 l8 k1 D9 B: l - ; r( Q4 l, ^5 r3 I
- public class InitialState implements MonsterState {# l, k* Y) o& d! i/ {
- @Override5 O6 l: M) \2 M+ M: N' o5 A
- public void handleState(Monster monster) {! m" U) |) {* M
- // Начальная фаза боя; L& E: K; S5 ]$ Y$ Q. l( {% i' J: W
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");) n9 F6 ~! M) o8 ^ R6 }
- }$ a$ A+ Q) \" J) M+ d, x
- }- p& F" {& f9 }' v
Скопировать код Класс для агрессивного состояния монстра:
: J' D& v# v1 w% u- // Пакет org.l2jmobius.gameserver.model.actor.state
" L% q* m$ {1 I! s8 J - package org.l2jmobius.gameserver.model.actor.state;) ^6 _2 Y4 j8 D& W
! d# P2 z( k4 f* E0 K- import org.l2jmobius.gameserver.model.actor.Monster;9 s, T5 C: o" _* Q' `/ o
- 6 Z# @. j5 |( ]% y/ B4 |2 Y
- public class AggressiveState implements MonsterState {, p W( e; Q, o. s- ^* H
- @Override# g) S K3 E* A" P2 E7 W
- public void handleState(Monster monster) {& q( ]- r5 y7 I" m' d
- // Агрессивная фаза боя
6 z) L- Z3 R2 t - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
7 j+ N* N! e. v' ^0 G - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки8 [) A) [) A0 t, V1 }. X
- }( x0 ?+ |, w& f
- }
! z9 k7 T1 A2 w& P% J# b- }& Z
Скопировать код Класс для финального состояния монстра:9 n7 u# ?, \3 m6 x L
- // Пакет org.l2jmobius.gameserver.model.actor.state# e7 |: n' `* c% j: [% T8 y
- package org.l2jmobius.gameserver.model.actor.state;: {+ f5 M+ F( e! N- I% M6 O
- $ f- ~7 _5 K$ z8 A; H
- import org.l2jmobius.gameserver.model.actor.Monster;
0 w S5 u4 d# j4 o; R - / A$ \+ k! |8 n& Z/ {
- public class FinalState implements MonsterState {# c5 P1 K" y7 _
- @Override; a( n' w; n8 V) v- @5 I1 g
- public void handleState(Monster monster) {4 Q$ d2 [8 H" _9 K! R; M/ F/ k7 e0 Y
- // Финальная фаза боя
& i }3 I: V2 v& C: _ - System.out.println(monster.getName() + " готовится к финальной атаке!");' r- g$ ?7 R$ X' S/ d# Z
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки! [2 P, U) v6 @8 B6 W: J, [1 Y. X
- }8 K) p, _" i2 X1 n* I ~
- }) B1 `" G: r4 C8 M; f# X3 I
Скопировать код
* i6 D* V8 C% z& qШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.2 N7 E0 Q, X# _- L2 o* E% T( W
- // Пакет org.l2jmobius.gameserver.model.actor
& d; w1 A6 p% { - package org.l2jmobius.gameserver.model.actor;
$ `$ F9 a% H5 e' ?. s! p5 R) H3 h - # k# O; U) _" T, ^& \
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;2 s5 ~! p6 D3 g
- import org.l2jmobius.gameserver.model.actor.state.InitialState;: Y) I) @' s# t: y) i& S( c
6 I* u% _4 F4 W9 d- public class Monster extends Creature {
; F: }- o0 o! t1 @/ q - private String name;# q8 t4 w( v6 Q, g+ ?
- private double attackPower;2 |8 ?/ t# J) E J0 V% ~( S
- private MonsterState state; // Текущее состояние монстра5 Z2 e$ A# c1 D2 ]! p n' S
# @6 U6 e# \5 a# ]$ f$ ~- // Конструктор монстра# H. j$ D8 g2 a$ ~
- public Monster(String name, double attackPower) {
7 m/ y- I2 N- U1 g) f8 w0 ]2 r" Z6 d0 w - this.name = name;
# e: s: [+ i7 h1 X- @ - this.attackPower = attackPower;: s+ n8 F- V, `, a* u7 e
- this.state = new InitialState(); // Устанавливаем начальное состояние
) D/ F. j+ i8 S - }
N4 ?3 |. H, l7 c, @
3 T# T; B6 a: r2 J/ v- // Метод для смены состояния2 I" r% b) }: x) m% f: e k
- public void setState(MonsterState newState) {2 v( a# l" i h1 H" X% L) c% ~! `- F
- this.state = newState;
) s$ f2 a0 |! g1 Z$ _) L0 Z4 d8 B - }
$ _. L2 }* U$ T/ _+ P) d4 h
1 I2 r) Z, Y, o8 P: E/ Q- // Выполнение действий на основе текущего состояния! N# ~" g% `4 z3 f+ u! J% Q
- public void executeState() {6 w& X: @9 ]+ `; e% P5 A
- state.handleState(this);; Q% A# S) ~! t& `: ~7 a
- }, m" V7 H& B8 k6 I- v( n6 s4 m s
6 e( _" [9 I' U! b- S- // Геттеры и сеттеры0 G8 H, O- ]- t4 x3 F) h- m
- public String getName() {, t @6 R$ k! L G7 m# P5 X+ A
- return name;+ I2 j9 g; \/ |0 r+ ]- h
- }
5 V: p* t2 ^ x5 q% p. \ - % y( l9 }3 O2 Y7 [
- public double getAttackPower() {
8 X0 z+ m- B9 @: j" `+ l1 p' @: X - return attackPower;2 R: z0 z) j4 `9 @5 H1 `8 y- i9 D
- }' {& K$ P0 u! f# z6 d8 W; Q8 p! ^
5 f" w9 ^! X4 b9 T3 U; U: D- public void setAttackPower(double attackPower) {, }5 K J% Y6 z' G0 [. m5 O/ `1 G
- this.attackPower = attackPower;( C4 W: a2 j" T- d( e- G
- }% e. m! l6 I. v+ v: E
- }
7 h) z) _/ ^* D; ~* ?+ b* Z1 e* k
Скопировать код ( h( @; R0 \. i% {* F
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
. D; u, o0 I. ]. @( S4 n7 E- f9 |5 r, E1 ?* ~
- // Пакет org.l2jmobius.gameserver.model.battle! N& U. F7 T3 b$ Q# f+ B8 E
- package org.l2jmobius.gameserver.model.battle;
7 ^0 u, K# C$ r! N - r/ | z" e) i* w. U8 K0 n8 g
- import org.l2jmobius.gameserver.model.actor.Monster;
8 L3 G" l, b4 T - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;5 u4 @5 N) v# p+ {; Y
- import org.l2jmobius.gameserver.model.actor.state.FinalState;
5 w# l2 \$ e/ a# r# ^
- P! x- F- J7 |( C% [, r9 J- public class BattleSimulation {
8 ^/ `$ t6 E, M! c - public static void main(String[] args) {
6 L$ X- Z* e" J2 d/ p- Y/ H - // Создаем монстра с начальной атакой
0 w V& |; F: o$ s6 h. _ - Monster monster = new Monster("Дракон", 100);5 G& R- u/ e: b# b
- + q1 [4 {$ r) R# x C
- // Начальная фаза) E( S0 e6 {: \8 { v) p% Y
- monster.executeState();4 |( l& Y' x4 a: G `
# b' F& T; K' m) u* O- z- // Переход в агрессивную фазу( `) j) c& E! a6 i: d
- monster.setState(new AggressiveState());
9 @! I0 X. `! x' x - monster.executeState();
2 ~( v2 h: P/ h# _7 f- H - 6 |' R, J, `! H1 K( Y9 ^4 b8 B
- // Финальная фаза
. S( q" v- z0 \' R" K6 h0 ^) | - monster.setState(new FinalState());
0 h3 j6 ~: j9 B/ _2 @! e* W% ]' w - monster.executeState();
& K8 l5 ?% N, H - }& v# C, ~ k! [
- }
\* W! c4 w1 y& @9 f! z$ |- \
Скопировать код ! \7 g; `# V# }
Комментарии по структуре пакетов и классов:. I5 h* z9 \5 [* {5 w6 _. E7 b0 Y
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
% \- }6 G8 t* \ ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
6 N+ X5 E/ C wЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!# O1 N/ E! v& R1 _/ i
% v: B: f' W4 `% T7 k/ U5 _0 M% D
2 G8 B$ {' ~- C* |1 y2 u/ V4 r; s( p$ R, G5 ?
: ]4 h6 Z. m/ D; @
* ]2 H/ u6 s) n( X7 z$ {$ j
8 I1 ], j' @1 k- y! H2 w$ _; R% T; v! }
; Z: F$ x4 m1 j8 i" ?4 s7 S3 F3 m" T& A2 `' j' U: m- I2 m
0 p$ |) E# X p" U8 c/ j" t/ `
# g: B8 p; n' g5 D
1 K: Z( j; e( E: m
9 f4 S* j/ w& O! Y
4 {9 q2 V: }3 l! b7 R4 l3 r1 K+ k# f' z( i. T. ~- K8 G' }% A( W
|