Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). ) `) F( o+ V& x
. [# _# j N% O' H6 \ CЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
' Q! p; r- x8 E6 Z* T6 q% z( M8 ^" O- E; v! Q6 [, o T' f
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
3 t6 w1 }; g. g8 T7 V' R4 e- ]' f/ k4 y2 e6 F, B
- // Пакет для состояний монстра
8 U8 Z# f. T; {2 |9 r, ?8 e9 ^ - package org.l2jmobius.gameserver.model.actor.state;
E) j. w4 N) v2 w. s! @) E' \ - # @! ^' o! l7 h( f- e1 @) m0 F
- // Интерфейс, представляющий состояния монстра% V" M3 X+ |+ g! ]; \+ h
- public interface MonsterState {$ t- |* _2 o( m9 Y, f
- void handleState(Monster monster);
, n( c" O8 D- T: G - }+ ^6 c' f3 A& F; y- y
Скопировать код
4 b! K# @; |' ^& w1 x! e5 ^2 ]$ hШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. ) \% f. B6 k4 Z' K# y
6 q5 z- ?9 }. N' wЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
; g- a) v2 r* z$ Y) I3 y" \3 V- B; Y* V2 s( O1 ]
Класс для начального состояния монстра:. E; V" G! O( w% f9 {
- // Пакет org.l2jmobius.gameserver.model.actor.state
" B2 e! I$ ^% v- ^ - package org.l2jmobius.gameserver.model.actor.state;
6 i" M6 Q5 \: y9 g3 j) S
0 ~) I) a7 _5 J- import org.l2jmobius.gameserver.model.actor.Monster;1 ?! ?# I' C# ~$ B6 |' S% c" k
- ; P( X8 N/ m0 D6 f
- public class InitialState implements MonsterState {9 B. e, o6 w7 Z3 ~, z" S6 q5 ]* P; e
- @Override" u5 Y0 t" S H& H W2 r" p* P; F) a
- public void handleState(Monster monster) {
! _ R6 R) v9 u: c0 V - // Начальная фаза боя
+ s7 |8 A7 W: q* j9 G - System.out.println(monster.getName() + " начинает бой с обычной атакой."); ?; A+ s' C) T+ U9 _% R0 J
- }3 x9 O& B+ Z$ ?* ~$ Y2 o
- }
( x( _$ E: ^: E- m5 C
Скопировать код Класс для агрессивного состояния монстра:
+ u4 ]( ~* C8 F- @) Q% C; s8 D- // Пакет org.l2jmobius.gameserver.model.actor.state4 l3 @' D9 U/ A0 `/ o7 p# o
- package org.l2jmobius.gameserver.model.actor.state;
$ Z4 P) s0 @0 W' T
9 {, E' c( P, t- import org.l2jmobius.gameserver.model.actor.Monster;. B/ N, w' a) Q# q6 a7 ^! @$ B
- + ~8 X" W8 ]0 u0 M* M8 j* r6 p
- public class AggressiveState implements MonsterState {* r9 z' l2 C1 m+ O. I4 c3 R: e
- @Override( R" N5 ]4 t7 X$ S% w
- public void handleState(Monster monster) {
6 J0 ^2 f5 A. f! n8 a - // Агрессивная фаза боя
4 O+ S" r8 G/ A - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
( _0 h( k9 i7 z - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки( M7 b3 @/ p L
- }: g" U+ N3 j2 p5 X. \
- }
% m* K% V" [$ Y% [
Скопировать код Класс для финального состояния монстра:% c1 d' m$ k; J
- // Пакет org.l2jmobius.gameserver.model.actor.state
# G, X a& f8 \8 a! f ?& s1 I! [0 ` - package org.l2jmobius.gameserver.model.actor.state;3 q2 D$ k: d* D+ _$ f
- 6 B/ p) O0 u3 o" e7 \
- import org.l2jmobius.gameserver.model.actor.Monster;+ ~- c: D0 P* p
- ! @! }; K u0 n" A* C
- public class FinalState implements MonsterState {3 c8 U6 h: \ z) u: z( v3 w9 ?
- @Override
# Z: [. s4 _( `* f, V - public void handleState(Monster monster) {" J2 W; |7 O( B1 g4 k
- // Финальная фаза боя
3 I" b7 U0 g* G1 O( A - System.out.println(monster.getName() + " готовится к финальной атаке!");
$ z8 e! U' K; t% F2 I6 ~ - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
/ Q3 E) f! s+ e* C; ~1 i/ G1 q - }9 V. f# m( S" m, D
- }$ o1 N% S2 ~- O& q; _, y3 a: W% B
Скопировать код ) x% Z+ D4 l$ L+ c2 Z+ K# _
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
$ P2 b* C, I2 M A3 I- // Пакет org.l2jmobius.gameserver.model.actor
1 O s- O6 n) O! G& u3 E - package org.l2jmobius.gameserver.model.actor;) f5 ] U; b: f! m# O2 K! o
- - Z0 H% w$ q/ _6 c' B2 \
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
7 n' ]$ p% K2 x0 v" e - import org.l2jmobius.gameserver.model.actor.state.InitialState;9 O) v9 _# a& p
- `; q# C' }2 g; C7 ~$ U0 ?- public class Monster extends Creature {* v `9 [& S# ?2 |' T5 Y: @: n: s
- private String name;
7 v W- ]4 i7 b6 P - private double attackPower;0 s3 s3 s+ k" R; j% Y/ O
- private MonsterState state; // Текущее состояние монстра$ d6 t: _9 F) |; s
- * v! h5 G, b- J. t: Y, \
- // Конструктор монстра
' v' u, S' L5 B7 v" J$ i% f9 K3 _4 @ - public Monster(String name, double attackPower) {
$ |; v6 b7 w; L0 E, h) [ - this.name = name;
) W. m: _. n$ k6 t1 z - this.attackPower = attackPower;
- _7 ?; z9 Z, M( j- M - this.state = new InitialState(); // Устанавливаем начальное состояние
$ s1 {+ G ?* w3 E! s1 D - }
: S/ Q/ s2 |. I( S: z! L: I/ F - ( e2 e: J) E* E6 J, S* i
- // Метод для смены состояния) ?- N* \" T7 g( d
- public void setState(MonsterState newState) {2 M4 _% @" [9 B
- this.state = newState;+ \0 g- R7 A) h7 t4 b5 s6 I! r
- }9 h* A |2 ?: {3 V9 A4 f
$ S3 r: ^) a5 S3 l3 O) Y* m8 L- // Выполнение действий на основе текущего состояния, v! a4 T( d9 q# Q: j
- public void executeState() {
: y; w O2 P0 P* R' c' z - state.handleState(this);
4 R3 n3 K; L2 o/ @2 c5 W - }& T: E. U& \3 G6 `
- ; @, A4 U" e& f) r* o
- // Геттеры и сеттеры0 t% e! w( j, O% o
- public String getName() {, a8 A1 P: c; `- r
- return name;
* i. D$ O2 w4 b' ~2 q - }
+ h$ t/ U }) o N* L/ K/ f, B, n
% Q3 o4 o! u, [3 n1 A. `- public double getAttackPower() {$ J$ Z- e5 T r9 g% E: ~ K. t$ t
- return attackPower;
3 i" a2 [6 P! |. ] - }
' d5 \! `% `& n7 s. Q" g7 K
) W" N, R4 Y) ^" ^+ S; H4 o- public void setAttackPower(double attackPower) {7 s3 V4 O! C" j5 S' ]
- this.attackPower = attackPower;# Y7 q+ [& p0 Z
- }
; j$ S3 w6 M ?! _ - }# q$ U# y1 M- Z k, e% ?& b* k
Скопировать код ' }/ b( J* w$ \, |3 _0 N0 _
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.# F0 R* v/ x. s
, g0 ?$ w. S# @! o# U, `
- // Пакет org.l2jmobius.gameserver.model.battle- i9 U9 O0 D* c9 l
- package org.l2jmobius.gameserver.model.battle;
( O ?! |6 O* F2 j+ a8 ~
6 B: c% t) C5 Z9 l3 j K% I- import org.l2jmobius.gameserver.model.actor.Monster;0 {! w2 O& W* u- J) [
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
, w/ t$ | B2 u - import org.l2jmobius.gameserver.model.actor.state.FinalState;+ }, a) r" h/ m. G# y1 S: A, p" W
& ]4 r2 O+ `# {" ] o$ f+ V- public class BattleSimulation {2 x, ~4 e7 _1 j( ]
- public static void main(String[] args) {' m/ A; n |1 w" I+ O! ?% @
- // Создаем монстра с начальной атакой' q( ?* h0 S1 H
- Monster monster = new Monster("Дракон", 100);
0 b3 u- X- p. I9 x8 t - w7 k, K6 o) e$ z. h
- // Начальная фаза
7 d' w% e8 {0 B# ]: j( F, l( H - monster.executeState();
" n% J5 O2 S( b) X8 M' I' j+ H - 4 W8 `! A& |3 x# M3 B/ }
- // Переход в агрессивную фазу
1 v! u: b% b( t6 a* K' o+ Y7 q% ` - monster.setState(new AggressiveState());, p0 F8 p/ `8 \3 } o
- monster.executeState();( n% i- D: f" ^1 o0 A9 K* I3 {- l
$ P. @* ~- f- H# }, l- // Финальная фаза
, {0 d* z5 {+ S5 U% J# \* @ - monster.setState(new FinalState());
; C' }6 h2 _" I" C o - monster.executeState();# ?1 ]/ C: d( t, f# c
- }
. @7 P4 U, u) Z: _1 [( f - }
. F3 Q( Y1 ~- \! _% X6 o1 \
Скопировать код
0 b0 j; J/ h8 I9 jКомментарии по структуре пакетов и классов:
7 P1 Q& k0 ^3 M5 ^7 x- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.1 o) D% A5 G% S( t" h
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
# u, R0 Q% U2 \) E5 _/ W# _6 p$ [Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
4 C6 y, t- E% {0 ~* N) F
0 |/ P; G2 F w4 T* {, `9 O# K# V! Y5 R
/ x9 ?4 \1 s- J, G
4 `! E1 n0 P' T% ~! u- n
5 G+ F5 l1 M7 D
* ^* I5 d" z+ A; s
6 x; ^- c! |9 a% @& D& U; c& A& c9 ~ m7 T+ D
9 C8 ~8 ?+ O+ t p
8 h' Z% e. n2 p
; X# |0 u% V: }& V) o, ]' L* G' l' n; m2 `
/ s C- k% ?7 V- }. w" r
1 `0 t' K4 E2 M2 w) l |