Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 2 r4 x& I l( q$ Y( B' N4 @
: l7 {# A l+ O0 C h# ZЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
. i* X, J" e2 \0 P8 b1 E* j7 B6 v+ l
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.! q; n* j9 @0 i4 H! E' `, @
& T Z" c Y3 |" y3 Q" x* s- // Пакет для состояний монстра
% d) W* T0 ]: [3 h - package org.l2jmobius.gameserver.model.actor.state;
6 P" U$ _$ M, h/ S9 \( Y - ; O) {2 s, n8 f; t* N" r! b/ x, ~
- // Интерфейс, представляющий состояния монстра0 _6 E" L- g- j1 ?, T
- public interface MonsterState {$ j8 g" `& w9 U+ A
- void handleState(Monster monster);! p. z& p* B) N4 w5 g; }: q
- } r5 R. ^3 ^. t& Q
Скопировать код $ _$ R( X4 x+ A4 R
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 2 I8 ]# \. j4 c0 \9 w' I
4 @! H4 Z4 K1 {+ @Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.$ T5 t5 s& W8 J0 V0 Q' V2 |
# V( J5 [( u8 b: i) Q( U9 r
Класс для начального состояния монстра:
6 i( x9 B! N. E* y- // Пакет org.l2jmobius.gameserver.model.actor.state& r$ i) ~0 f7 j, V" F) T9 ~3 k
- package org.l2jmobius.gameserver.model.actor.state;
! `) X7 l2 D" K: V: Z3 Z( S, v1 T" i - ; X) a% K8 }2 g" x! W
- import org.l2jmobius.gameserver.model.actor.Monster;8 C$ y- r* {% |' ~: ~5 `1 R* f
; z+ N- b1 L; d- public class InitialState implements MonsterState {( b$ P( m, q% u8 B6 J. B( y: V4 y
- @Override
- z# L! A! u; V8 T" ~ - public void handleState(Monster monster) {
/ h; e) z' {: i$ [! ~/ L: e/ r - // Начальная фаза боя; v% t* M# s- `: R2 m3 |/ L. ?3 b
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");4 c3 V3 L# F* r4 T: Z5 p6 E
- }8 [1 }0 z# P1 h' |
- }
# t. X$ A% q3 K6 Q
Скопировать код Класс для агрессивного состояния монстра:7 @4 m4 V( F4 t* @& D% Z# O
- // Пакет org.l2jmobius.gameserver.model.actor.state5 N! ]5 u- B! w" x) c/ a- V$ \0 }
- package org.l2jmobius.gameserver.model.actor.state;
6 G( Z T& ]; H3 f" G( Y7 ~
# N& J: I9 w( `- import org.l2jmobius.gameserver.model.actor.Monster;
D+ }3 y& p( ]% x' ]: E9 d0 a
. {! K# t4 _3 h$ ?+ `- public class AggressiveState implements MonsterState {8 B2 G" B& \# _4 S) Z3 v, f2 T
- @Override7 Y/ ?$ v, }* q3 O6 [! {% x
- public void handleState(Monster monster) {
- Q9 [9 H0 M) K# s# y% [ - // Агрессивная фаза боя
( j( c H+ A4 C/ i2 J9 `. u - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
, k9 C/ x+ B' M# r' H - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки; ^5 `! Y- j' Y# R" }
- }3 V; R/ W! O+ e$ H
- }5 H# x- f6 p' z( H5 O- Z
Скопировать код Класс для финального состояния монстра:( W* w( H( u5 F9 @: ~& J9 [! n
- // Пакет org.l2jmobius.gameserver.model.actor.state
3 G% M" i5 q% m% J+ _9 l - package org.l2jmobius.gameserver.model.actor.state;, H. y$ t& p7 J- a
9 ~7 n' Q; m" S: J9 M# F2 j* z- import org.l2jmobius.gameserver.model.actor.Monster;
9 h+ D- o& K& D1 u+ o - ( {% ?" R. S& \7 ~( L
- public class FinalState implements MonsterState {
# B7 K! q l( F2 U6 u - @Override2 Y0 j6 L6 R- W) q% B
- public void handleState(Monster monster) {4 P' J1 o9 c2 o/ O6 B0 m
- // Финальная фаза боя
, P# y4 B( r9 |$ p9 T/ ?4 g! f - System.out.println(monster.getName() + " готовится к финальной атаке!");
6 }$ I* Y' V' Z+ H' E - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки* a+ r! V5 T1 Y, L2 i
- }
3 ]9 C9 b, N' V4 P' F - }
* |, J; ?5 l# f( t; a8 }" e
Скопировать код 3 c+ H9 w0 t" U# t; ]
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
" K+ O0 M$ e" v% m% g3 r. m( T* Q- // Пакет org.l2jmobius.gameserver.model.actor
$ h* o! K! w) H( r; W8 Q - package org.l2jmobius.gameserver.model.actor;2 p1 T2 z: C% Q, S$ R& b4 M' G
/ B& \7 o0 s* o; j- |3 `( }- o, T- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
9 I) G% h W. y - import org.l2jmobius.gameserver.model.actor.state.InitialState;
8 H, V/ }, m5 q0 A5 Q3 G7 k - * `( M$ f5 D+ a$ v1 N' V
- public class Monster extends Creature {' f/ l$ u% U5 P5 U7 M% r8 U9 @! s) \
- private String name;
+ C- u, H9 n- H l8 ? - private double attackPower;8 M% e2 A8 \ {% m& a+ Z
- private MonsterState state; // Текущее состояние монстра
/ h; h- h- _$ |1 g4 m/ @
% z0 K1 `: S& W- // Конструктор монстра8 s& s8 {) }( c8 f, s
- public Monster(String name, double attackPower) {
7 V# o4 ]3 a+ w" V4 j' h8 O( ^ - this.name = name;9 G/ S( P3 L3 d$ g3 U6 Y$ b6 `* {
- this.attackPower = attackPower;
}% Z s! \8 X; b - this.state = new InitialState(); // Устанавливаем начальное состояние
& w, S# |9 A9 [ - }& m/ L! G0 X+ v; Y8 X
- + ]' w/ Q" u) U& R' n( B
- // Метод для смены состояния
6 L4 Y; O% ~/ N5 l1 z, j - public void setState(MonsterState newState) {
+ d' e6 |) X3 ~+ K# {: z1 u$ ~ - this.state = newState;7 b" i- d( e( |; i1 i
- }
# U( }5 k @) Z7 S& `
4 G. }, E _1 k) _$ n3 E- // Выполнение действий на основе текущего состояния1 J2 r& A3 o$ D. Q4 _
- public void executeState() {
& @+ a$ M6 l+ R- h - state.handleState(this);
0 f0 p0 W! Z+ L1 @' K S/ K8 t - }+ r* I- ~. V9 a: j; r5 c$ ^
+ H2 y1 _& t; t1 i! u6 @3 i7 K- // Геттеры и сеттеры: ^5 A6 p# V$ K" d9 x; `
- public String getName() {# J* x) X8 |! X7 L- Y, J5 h
- return name;
% f* ^% x3 P/ n7 l' @! U - }9 u% i f8 E7 }
) c% L1 n8 a% ^3 j; p2 j1 x% s- public double getAttackPower() {2 W7 V9 P0 N0 O' l( x
- return attackPower;# C4 E; I% D; {/ g" V- @" `( O
- }* l$ c/ g8 z1 i4 U
- ! z+ C/ r7 Z4 o8 G6 G# D4 q: t
- public void setAttackPower(double attackPower) {$ C- u0 \) n; k" ^+ I' F
- this.attackPower = attackPower;
1 j z2 A1 g+ G - }
2 k/ _+ y+ w& V - }
0 x, z: l$ S( w Z
Скопировать код . u+ @# ~' E4 t2 q5 e6 J
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.! V3 z3 b; J2 D) J# a$ c
* b% k+ w$ ?* R, M( D, e- // Пакет org.l2jmobius.gameserver.model.battle
: i) l7 ?/ y; p0 ^, O; u- B' v - package org.l2jmobius.gameserver.model.battle;
9 d, j: I& i; v( W) z" O
E: p( x4 ^' R% V$ d- import org.l2jmobius.gameserver.model.actor.Monster;
, P+ N' Z8 x1 ~2 a5 b4 w - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
( _( L1 K" o) V) K H - import org.l2jmobius.gameserver.model.actor.state.FinalState;
; @2 |$ o6 v! Y& I6 d0 t2 ^ - 4 {5 b: y! r4 b6 n/ u. N, M
- public class BattleSimulation {
0 ?/ V/ X7 j+ n) M+ U. k - public static void main(String[] args) {
+ h4 `- ]2 ~& J) ^% L* ?2 H$ z& B8 X - // Создаем монстра с начальной атакой4 A9 ]3 G' \0 i
- Monster monster = new Monster("Дракон", 100);4 g# f4 J1 |2 l! V3 Z
- 2 I. k/ Z4 u9 b" q
- // Начальная фаза, C1 }0 z/ c9 U A1 o2 ~' f
- monster.executeState();
+ J9 ?, K0 z5 Z% T- m1 X4 L2 s - ! c3 }8 \% K" K! D6 [; Z: i! t. Z
- // Переход в агрессивную фазу
" O& i; s9 _( ?0 R9 H! Q7 e2 h - monster.setState(new AggressiveState());6 c$ s" |, M& {0 V2 P
- monster.executeState();
$ E1 s& p% {3 c' }. q4 u - ! c% f3 V5 c# \ ~ T, j
- // Финальная фаза
( h6 ?; `! i& E - monster.setState(new FinalState());
% x: T9 e- m! g# g2 T9 c - monster.executeState();
/ c* S9 d3 M, L N7 y4 O2 e6 g9 N - }& A: @- A7 p" h" s1 h7 k1 V
- }
0 ]! v& `6 S4 g. b$ l m+ O
Скопировать код
; J' o9 p f7 }" A0 `6 \, oКомментарии по структуре пакетов и классов:2 t+ @. q9 R R
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
" [: z3 B5 q6 a* C6 B3 n+ ~3 G ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.7 J* F' e, G- z: f$ q
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
. ~! ^$ N w! R
! g9 y3 {3 ^! ]4 Y
8 H& D& O, \, V6 _
$ y9 Z+ m6 R$ \3 ^% r" K& {
# y$ g. L6 C5 s! Z5 Y
$ G; T ^7 O) C1 r3 ^& p5 a6 S
/ j1 d3 i }: ]6 J
9 e6 \1 N7 q/ y! P* \
4 Y7 H1 k9 V9 S- D+ \( I1 n$ c3 I2 j v( p* E4 ?' F# ^
. X* d; H/ ^* k
$ r$ E, C0 s% j, o! v
9 J; F, O! L4 o; R
5 z4 M: [# s5 a, g' H" Y3 }
- |2 W) @! r o& w" A- V |