Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
% I3 Z0 `( z3 ? D* H \
8 m6 i& }4 A+ R# b) r) pЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.3 {* b P6 T n/ ^- Y
( I, R: h0 p) D/ J8 ?- p7 p4 @Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.9 e" p. f+ ]/ Q8 \9 z. V* y
`# u4 S: ^2 X4 v" G# G- // Пакет для состояний монстра
* w* }. z! x% p' J2 b - package org.l2jmobius.gameserver.model.actor.state;
* K( ?, Q3 Q+ _' F% H" ^4 R7 {
$ J- F2 z( i, q1 \" Z. g* _! `- // Интерфейс, представляющий состояния монстра
0 B. i3 A) x7 |8 x% l6 T. ? - public interface MonsterState {8 m% [; d# _( G" A
- void handleState(Monster monster);% n5 Z1 y7 `6 e! c* m
- }
i7 N& B; R; h! D9 I! d1 j; a
Скопировать код
0 A' J+ ?. h5 a4 t/ lШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
7 r, v6 E9 l. m- J h9 P1 U
; \" R- p8 M j' g f9 x/ ^; AЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
% A M5 H2 H9 M; s, F/ C9 w# g/ c* m# ]! y8 N, O2 S. b& O4 L- w; w6 L
Класс для начального состояния монстра:2 B1 ~4 p. Y8 I% m5 t; K* R
- // Пакет org.l2jmobius.gameserver.model.actor.state
- P' B9 q3 D8 \$ V) r) @5 a - package org.l2jmobius.gameserver.model.actor.state;- I* W; k8 l' h
4 Y5 V f6 L k8 ?6 Y- x }4 s" w- import org.l2jmobius.gameserver.model.actor.Monster;5 L. w: T3 Y& M- V0 H7 F
/ K2 n' w. m; n9 [3 F* Q- public class InitialState implements MonsterState {5 C( ?2 z" @' J# @
- @Override
2 P$ V$ }" q* C - public void handleState(Monster monster) {
4 V z/ J# E- I- U; v1 u- F - // Начальная фаза боя
0 s, U, U# k7 \; f - System.out.println(monster.getName() + " начинает бой с обычной атакой.");
! P3 r/ M! k' X) j# r: ~7 Q( \! E - }- j- h' H. D3 g; n. P4 s
- }# D% u7 g- A7 \) w
Скопировать код Класс для агрессивного состояния монстра:1 _1 {, s/ p8 J% m5 L
- // Пакет org.l2jmobius.gameserver.model.actor.state* @1 U' i8 _. v3 M. \+ u$ e9 S
- package org.l2jmobius.gameserver.model.actor.state; E7 n% H1 n2 _9 a1 Y9 ~
- 8 i$ B: a( ~) w- u, H% o
- import org.l2jmobius.gameserver.model.actor.Monster;- p+ i; d# ], n ^' U2 i
2 z. w. ]4 y$ O* H5 t4 k- public class AggressiveState implements MonsterState {
, M' j R5 o2 S; W - @Override4 C$ K( I, Z( ?& _2 y% d
- public void handleState(Monster monster) {& g5 |8 v/ o( I% T
- // Агрессивная фаза боя
1 j+ T' @8 c' J# c - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");3 Q6 N% l: D* h. l( N
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки1 Q3 o* N! T' x/ d; F6 C
- }
, T2 Y: r( H( d' b) S% p5 h - }
1 N; G2 ]! y Z+ q
Скопировать код Класс для финального состояния монстра:8 S! [) {# @+ d$ G8 I6 c7 \
- // Пакет org.l2jmobius.gameserver.model.actor.state& q; R- l7 C. ]* |
- package org.l2jmobius.gameserver.model.actor.state;1 W% ]7 U: T, u0 V y5 E8 H
% J @2 g, i* s, L& |+ ~. \- import org.l2jmobius.gameserver.model.actor.Monster;
( k4 f# O. }* g0 S! C- S
/ J# p. }, X! p) k- public class FinalState implements MonsterState {
; y! T4 ^2 E, H - @Override; B$ b3 O( Z; x. w% @
- public void handleState(Monster monster) {/ O$ ^: {$ s8 @0 S; H
- // Финальная фаза боя
, s x( C- G) p5 H2 G - System.out.println(monster.getName() + " готовится к финальной атаке!");
, _3 J- v3 W8 t' U( E! E - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки# W. U9 [: c' L. H
- }6 r# ^: |3 w: \2 {
- }9 W) t0 b1 ^' r9 o2 \' @
Скопировать код
/ Q0 \! e* N U$ a) {Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
, J1 ]+ M C; l, Z6 s1 v- // Пакет org.l2jmobius.gameserver.model.actor
/ i4 u& L# [5 t$ l K0 r3 i: g1 d4 W6 T - package org.l2jmobius.gameserver.model.actor;
9 ~# e6 S1 b5 {
; J9 A9 W: u% N0 R! B8 X+ ?- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
" j& y# h2 t* s* o+ v4 t - import org.l2jmobius.gameserver.model.actor.state.InitialState;
0 }$ D5 x& _; y& e2 V5 L7 i) g
2 c& B. L' ~/ L- c6 G4 m) Q5 @5 E( q- public class Monster extends Creature {/ T5 J7 \5 v$ u8 N& u, N, ]7 Z8 u
- private String name;
0 T: m/ a8 T+ B" X0 ~: w - private double attackPower;
* r# W. h" [! R9 M& [ R+ S) z - private MonsterState state; // Текущее состояние монстра. R" G& j$ W! `: q E. S" ^4 W8 r9 ?
0 D+ }" C& I" T/ F, E* ^- // Конструктор монстра3 R i! c& ^. [9 V9 }
- public Monster(String name, double attackPower) {; s8 H: T, `2 s0 ]2 ~
- this.name = name;- K1 q& x" a. m7 m7 o# h5 s
- this.attackPower = attackPower;- Z6 @9 }) d8 w. j7 C; \% i7 c
- this.state = new InitialState(); // Устанавливаем начальное состояние
) o% M% } s: ~5 \* [ - }
6 I! ^1 L, y$ B! C - " A# ?2 d& S6 m
- // Метод для смены состояния! M" B1 q1 a) n/ p. K
- public void setState(MonsterState newState) {& y$ w4 ^& a; V$ R, V& b% j
- this.state = newState;
! J- v; ]. J$ A/ x$ G* h @- O - } c. c% F! H( s2 a* W) v& p5 y
" H1 e6 m3 d% e; b- I8 |- // Выполнение действий на основе текущего состояния
/ p8 C3 |$ A' P - public void executeState() {# O, ~$ B- Q2 ?
- state.handleState(this);
# W& t. C: B# Q+ n' ]* ? - }
" O: h" @6 q: K9 A; C- i3 q6 ~
1 ^1 s% `: Q+ S* v! a. f- // Геттеры и сеттеры! g* C: w4 V: R2 e0 N8 O
- public String getName() {
% D- y6 m8 }+ k b3 T - return name;
9 M$ G' |6 n# g) ]$ q - }$ H! }! l& ~7 Q7 V9 V
- ' r1 a* B' D3 x# E6 \$ |
- public double getAttackPower() {
. ?9 Q1 Y& z6 q) X3 n - return attackPower;
7 X: b( i% ]1 K/ q - }
9 _: y* u& {* {' |
, a+ R- P8 m" Q- p0 o- public void setAttackPower(double attackPower) {
* M/ I D$ u3 I4 j4 i; f {- ] - this.attackPower = attackPower;5 D; U% p% k9 y8 _, z# ~: |
- }
8 p/ U# F2 _+ ~' {' b! ? - }! \. Z1 ^, V+ U* _
Скопировать код
+ b& y' I) e; q5 A) |; ~Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.8 W5 P {$ T1 h$ D
: j- x# ?" B, l; A' @& Y s% [
- // Пакет org.l2jmobius.gameserver.model.battle
5 l% F6 k8 [- M/ \ - package org.l2jmobius.gameserver.model.battle;7 y: S) S+ ]# M. X
& I7 a% Q1 M6 h( M* X- import org.l2jmobius.gameserver.model.actor.Monster;
0 y8 _9 J, l5 q- B4 P$ [2 z% h4 x4 {4 h - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
0 c. K# {/ e. I# s" ^& ? - import org.l2jmobius.gameserver.model.actor.state.FinalState;
6 V5 a) \3 P% @: b4 e% C/ v( G" G$ z* X
T) A# \1 b& |$ s4 d- public class BattleSimulation {/ V% t N. b' C r
- public static void main(String[] args) {
& H& ?" b y& ?2 L% U - // Создаем монстра с начальной атакой( s( F2 C7 b& K' X' I9 r5 \) ^ R l7 a
- Monster monster = new Monster("Дракон", 100);% }' z0 s9 g' b6 g( o
, s% J' u! R$ p2 |. s4 o% z- // Начальная фаза
* K- Q' q% A1 [$ s6 `8 A - monster.executeState();
. I; B$ |# r! _- ]3 ?+ ^
! p$ j8 `; w+ T1 r+ o2 T- // Переход в агрессивную фазу
9 l: [- J6 P; D2 y% y$ P - monster.setState(new AggressiveState());
3 U3 E: b( `. n/ O3 v) M j - monster.executeState();( c2 T, k h) ^1 d: l5 v! A
0 a; D$ q$ S: \2 v2 | C! Y9 T- // Финальная фаза
$ \9 d9 g/ h, y; w) x - monster.setState(new FinalState());% k9 A' o, j: e) a% i& a
- monster.executeState();
U5 U3 L/ `$ v; W - }0 b7 e) x# C( ^$ S
- }/ g$ G: F5 ~+ t( i- n7 ~$ Q! [% _
Скопировать код - B8 I+ v/ M; Q) w( E9 x3 Z
Комментарии по структуре пакетов и классов:
2 h3 D: t. f4 i& g# a0 }- O- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
1 q) R: Y* J: t2 _ ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.4 L3 D6 a" {0 A2 T. H: K. H; f4 r
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!6 P" K1 p* v* O+ Q& c' Q
! I9 O( U! Y% }9 u; ^. c" a
, T1 y3 b+ ?' [9 _0 |
; l# Q) G" V0 }6 I" x4 L8 B ?7 p; [
( M" n& b7 q; f6 S' C
, [& [/ C8 r9 `$ J4 v" w, l8 P! w5 e- j- U. f* r7 C
* N9 y$ c6 [' z: J: s6 Y& A: a
/ f# F* ~ ^& T$ k; ]9 U6 @
3 j! l6 u7 l/ T- O% g) u8 Q: L4 v L3 b5 k/ I% A- j ^# s
. e9 k# b0 H! ^+ U$ k4 j/ w1 J0 Z/ A7 t* w/ Y9 N4 Y1 r# D
3 I# |, H7 d, b0 q: v
|