Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 3 I% y/ v( y# G/ F! k% h/ i
5 \7 ~# l) f: Q
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.2 ]1 J- R. e, p b
, U7 q. P8 C" U7 `/ X
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.! d4 F( ~" x/ i* W* i% k. i2 r/ X3 H2 ?
0 Y5 k6 z S6 t; L% F
- // Пакет для состояний монстра+ g4 O: k/ S/ o, U' v
- package org.l2jmobius.gameserver.model.actor.state;
3 H' |( u) }; I* _
1 e' ?: d: _1 F. K) D7 }8 ?- // Интерфейс, представляющий состояния монстра
/ F6 R, ?( W: H* X. A# v - public interface MonsterState { l0 ?/ M8 j2 p f& _% D
- void handleState(Monster monster);6 F! L, N2 M! m2 y
- }+ k1 R8 w8 ]* s
Скопировать код
; `# g; w0 k* p0 DШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 5 ^2 L/ v% E. p& P, z
* z, G X+ B% l; C* I& }: {# cЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.0 i8 v6 x" l& c4 ] _
* N. u4 e, v" i* q, Q: wКласс для начального состояния монстра:" @: \" a3 i+ U, I
- // Пакет org.l2jmobius.gameserver.model.actor.state
! K! q' ]8 Y* {6 E) v8 U6 D - package org.l2jmobius.gameserver.model.actor.state;
! f1 x% ?$ l3 k4 P3 @ C
* k5 W6 P) s6 F; r! y" b. i- import org.l2jmobius.gameserver.model.actor.Monster;
H2 m, X& g4 i @
# B" n6 P' s- R) Z* T; G- public class InitialState implements MonsterState {
. `8 J) h) D% R/ M - @Override
# c- R; ~! o( c5 B6 F; _% } - public void handleState(Monster monster) {* y7 b% n. I% n3 k# J
- // Начальная фаза боя
# \0 D# ~1 j$ ^$ } @7 \; I - System.out.println(monster.getName() + " начинает бой с обычной атакой.");: r0 M3 e* j: [
- }( F/ P; k% ]5 A$ |& V9 i6 u
- }
+ b! @$ @ Q4 ~" y$ c4 D
Скопировать код Класс для агрессивного состояния монстра:6 S4 R) {* [; t6 f" o; r
- // Пакет org.l2jmobius.gameserver.model.actor.state# ]0 c) z, D' d# _5 }) Z4 I
- package org.l2jmobius.gameserver.model.actor.state;
* O% g# G7 H) W1 a1 x - " ~0 d) P n4 R; l& Z5 c# k8 o; r
- import org.l2jmobius.gameserver.model.actor.Monster;
% t9 l% u; l5 Q2 Q2 W+ k. ^
& c7 U9 [6 Y; ^! w" b- public class AggressiveState implements MonsterState {
- p0 ?) U. w+ R# s7 r - @Override
! L0 b. {0 t, Q+ P" o - public void handleState(Monster monster) {/ d+ F/ c' i$ E( x1 H! i- W
- // Агрессивная фаза боя
% Y0 o# W Y6 |5 @ - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
L9 _6 X* g9 f0 E - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки' `+ }$ |! M; E: ?3 }
- }
4 F) B# T: @$ d9 b8 \0 F - }" A) _- I- f. ]! _1 k4 z
Скопировать код Класс для финального состояния монстра:
7 @7 V [9 ]+ ]6 Y7 U h- // Пакет org.l2jmobius.gameserver.model.actor.state6 y9 B5 M# W1 Z1 m. Q. k8 `
- package org.l2jmobius.gameserver.model.actor.state;
+ D7 L8 E5 p! I' I: u" G
# C7 G5 l% s3 l2 m9 ?4 t- import org.l2jmobius.gameserver.model.actor.Monster;) \8 Q1 U4 O5 m1 {; J2 @5 }+ B
- : t# w! n1 f. h' m+ s, |! F( X
- public class FinalState implements MonsterState {" ~+ _1 S' W9 ?, K3 G4 W
- @Override
, D9 F7 n" J* I, [7 H& U ]8 V. \ - public void handleState(Monster monster) {
/ X- u: q4 \3 e8 W - // Финальная фаза боя7 r/ }* N: P9 A( a4 E
- System.out.println(monster.getName() + " готовится к финальной атаке!"); I' E1 ]2 a8 Y0 m/ T
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
# B, i/ r1 a5 { - }) Y% c! ~) A3 M7 R1 k
- }/ v/ q9 W: p) U6 w* g* f3 G
Скопировать код
0 q2 O# Y+ Y7 ]( Z, r: hШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
; G m4 q$ n0 E7 B1 \/ }, ^- // Пакет org.l2jmobius.gameserver.model.actor
x2 q' |# X* U8 U - package org.l2jmobius.gameserver.model.actor;
; o2 h; H( x' a1 M2 _
- o' T( Q8 l+ O$ Y- import org.l2jmobius.gameserver.model.actor.state.MonsterState;+ Z9 n/ {, H6 C e0 n& j8 i
- import org.l2jmobius.gameserver.model.actor.state.InitialState;
" t; Y1 P2 B! i; j- g0 Y2 T! E! r
" ? x+ ~- m1 d2 J: M5 C$ y- public class Monster extends Creature {
! S$ E0 ]6 u5 A# m, |; x - private String name;! |5 u/ J# m7 p* t/ [
- private double attackPower;, L6 f5 x: n y) r$ ^0 `
- private MonsterState state; // Текущее состояние монстра
# t) X* a. s& ]- a/ S
2 z9 Q4 C8 M% j- // Конструктор монстра3 W6 t( ?( n, H5 ?4 r4 {
- public Monster(String name, double attackPower) {! \8 n$ |5 W k
- this.name = name;- w, n/ w* K- [4 }& N2 R6 A" G
- this.attackPower = attackPower;
2 x4 }' g- g: i P. u3 I0 E - this.state = new InitialState(); // Устанавливаем начальное состояние
8 B$ V2 K8 e6 @% u4 g - }
7 d8 ^& W1 s4 G& u H
2 q6 `# \5 q$ u3 L; `- // Метод для смены состояния
! K' H2 T& J" k4 {( U2 D - public void setState(MonsterState newState) {" J o+ A% H% t* r9 }! E7 t' j' ^
- this.state = newState;# m' Y. \* m, v% \
- }
( Q2 Q, l2 f1 X1 r" t8 F( ^ - ! z! S/ m, K1 ?4 i- v
- // Выполнение действий на основе текущего состояния
9 j, n! s& e; i* f& G4 Y - public void executeState() {
9 X& {6 `" n2 I1 l8 |# F - state.handleState(this);" [3 f$ O3 k1 s- y& z" N
- }
2 z+ _! y2 O. \8 b# q( b
, F6 U3 W4 D# v& U( _- // Геттеры и сеттеры
1 F" J' H9 @5 _/ v - public String getName() {! T7 f& @, C% {0 M3 m& `' {( v
- return name;# [4 K0 Z+ |! W2 B3 h( t4 c
- }
3 B4 \* e" [1 A) i
]3 \" F3 `+ O1 f( k, B- public double getAttackPower() {
' Y; B. I3 @$ J1 T - return attackPower;
) ^, a5 ]# u. @) v9 x8 I3 s L - }
+ n4 h8 y9 f) F; p - ( X9 [; r1 m" e. x. c$ ^2 \* R
- public void setAttackPower(double attackPower) {
Q) e/ Y% e/ s& x$ `6 ?# ~ - this.attackPower = attackPower;
3 ~, l5 d" I7 H# Q! D2 E& ~ - }
+ b1 O0 O/ j, @ - }
7 _5 i+ P/ O* H% P! ^$ X7 `
Скопировать код
5 a, d& ]) ~+ H4 dШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.( `+ d4 D" J5 A
F0 A* M/ }4 K- I5 q
- // Пакет org.l2jmobius.gameserver.model.battle
1 S2 Z+ I5 b4 ^$ B$ ] - package org.l2jmobius.gameserver.model.battle;
4 x) t- f: R& O" m' { - ) Z) e: J! N2 `3 U+ Y1 J) w3 B
- import org.l2jmobius.gameserver.model.actor.Monster;
# D& g& E! M9 s - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
9 n# f5 P( Q) |0 d7 C3 S3 c2 Y - import org.l2jmobius.gameserver.model.actor.state.FinalState;& y" V2 i4 |9 t* ?/ S) P4 A I, ?
7 K" q4 i5 C1 P+ a) a- public class BattleSimulation {
" z5 I& C! K5 m - public static void main(String[] args) {2 L/ u s. D: s0 o8 G
- // Создаем монстра с начальной атакой
7 A& R; N3 V4 C& s - Monster monster = new Monster("Дракон", 100);
9 a# ~; ]: n6 c& n& Y/ U( @7 o - - \: B3 d/ u" H8 |% m7 Y
- // Начальная фаза1 K7 b6 K y; a
- monster.executeState();: Y4 T, K; V/ S6 \1 ]. N4 A
- ; N, F% b3 r" ?$ O, K, b4 e) `
- // Переход в агрессивную фазу9 a$ R6 r* ]6 t* D& d: a
- monster.setState(new AggressiveState());
+ B- l1 _4 `8 S# R5 N1 e' z! p - monster.executeState();
& t' s" m$ G, ~ ?( F - , H/ A0 ~ m l$ {+ H" w
- // Финальная фаза' w4 X5 [. X: A) O5 [# C9 q
- monster.setState(new FinalState());' d7 Z# H8 }. z1 `+ M$ T
- monster.executeState();* p \* G i$ w: F ~/ ~+ b0 B* `/ L
- }
, Q# n- B8 B$ ?* ~$ {& u% S - }
* X; `$ n) u! f% b2 }" Y9 O
Скопировать код & o9 g# J3 j9 y# s# M. l$ v( c
Комментарии по структуре пакетов и классов:
$ e: ~) p: r: @- W7 J5 \1 F# v' Z- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.$ @/ u$ \: ^5 r9 j, Q% x
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
0 Y6 r# E: Q8 w$ _* E9 d C; Y% m( gЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
% |+ ?# \, F6 ^# Z+ D+ `1 M: g. d! e
; N$ \( t" k) O4 @" ~- y2 _. s4 ^3 G1 w# r. [: L
+ q9 I# z# t% Y% d
% W- I9 {: p- k1 W8 [& v6 J% S5 y+ Y) Q( L& f
% {2 P; ^% |/ k$ ?+ m# ^/ }0 Y# j. x! r+ q
1 l9 X# D; |5 s* Z. f7 o7 E" r
; }( m; ]0 ?+ ~: g+ g& q* i
$ W" d8 N, `1 y9 Q- e
$ C1 p# f* v: S( J
2 p" K, F8 B4 ~, ^& o
+ L, ]8 a) n5 l9 ^! j# g
- I8 E; P" [0 j5 j: k |* n |