Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). ( S) F1 E3 N0 e' ?+ U
: V t; [) m8 F! X, m% h5 {1 vЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра." \, r4 C2 h4 z# a
9 {4 V; o" ^% T7 @# V2 N+ a4 \. vШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.. V2 Z' s2 b# D7 i& u
7 q; E6 e% n% v$ L D
- // Пакет для состояний монстра* j% W$ f& V9 @1 L# L
- package org.l2jmobius.gameserver.model.actor.state;! b* J' m' c! A, u: ]8 S3 {2 ?
( S" {1 v w! g; i* A, y+ N ]" y, Q- // Интерфейс, представляющий состояния монстра
& d/ r2 ]# n( Z6 w# ~0 `/ ~6 N+ W - public interface MonsterState {! j$ Z& E! I. x' X. K" E2 T0 R3 B
- void handleState(Monster monster);
! P# n( ?! X! ~- U2 |, G - }
- b) f! O1 I) Y7 c% B' V8 j- m$ q
Скопировать код
9 d0 x* p6 z% |; h( {& o7 EШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. & o6 Z4 }* Q2 j0 h- h
& U! s9 |, r C* a: kЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя., [" }7 w. k. x0 h! V
* V" I8 v+ ?6 {- o. S
Класс для начального состояния монстра:
3 c6 W7 C D3 {, B. z! w- // Пакет org.l2jmobius.gameserver.model.actor.state
3 w; o/ q! {- m3 ~! n G* a4 E' I - package org.l2jmobius.gameserver.model.actor.state;
4 X% P6 T. _% \6 y. _$ P - ( R5 C" c8 Q+ \0 H8 `2 i( z
- import org.l2jmobius.gameserver.model.actor.Monster;9 N4 A l% z7 L. A- h1 }2 B3 s" K) h- s
1 c, y" z9 K5 B7 d( U F) m/ U* F: C8 ]- public class InitialState implements MonsterState {8 Q% u# \! c. \$ q
- @Override
( T& e, ]/ h0 x. U! N% q$ |1 q/ m - public void handleState(Monster monster) {
; ?. `" j& |, z8 L - // Начальная фаза боя: B- {( Y) V! e& f. R! ?
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");. A; ?) r* [2 q/ r9 \
- }
9 W! @2 U- Z" _2 z; q+ L" J - } F( n2 V% M: `7 p1 z6 l9 G
Скопировать код Класс для агрессивного состояния монстра:
6 d% ^4 ]$ D2 c1 ~' f- // Пакет org.l2jmobius.gameserver.model.actor.state7 R. L) |% a9 K
- package org.l2jmobius.gameserver.model.actor.state;
* |: o. ~) ?. c
/ W2 r( S4 A9 T' q- import org.l2jmobius.gameserver.model.actor.Monster;
6 g0 p9 w3 j2 A& K* i" }
8 r$ e* j& |* {( ` }- public class AggressiveState implements MonsterState {
5 t6 J* o' C, R& d2 E1 A) B - @Override
3 L/ a6 `1 Y0 B( b% O3 ~. O# D - public void handleState(Monster monster) {) d! ^ x8 }: L4 b9 K0 _
- // Агрессивная фаза боя
' w+ g+ ?. t* h, N# |0 B - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");. h/ c3 K7 `; v/ y0 \
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки) C7 }7 ^! |3 u4 ]3 D9 I* u
- }
. d" i0 r& `' Z" t' e% _. O - }
- C) f1 d8 ]5 {* e0 C/ p+ e* C7 _' A
Скопировать код Класс для финального состояния монстра:
2 p J+ B# g$ e2 V+ _- // Пакет org.l2jmobius.gameserver.model.actor.state
& k3 }3 V+ @. ^ B8 g; P - package org.l2jmobius.gameserver.model.actor.state;/ W, `* U# ~; D, E
, m D0 \2 V3 _3 S- import org.l2jmobius.gameserver.model.actor.Monster;* W- {8 E- U' v% S! ?4 k
" f6 m6 J( T# r) G- public class FinalState implements MonsterState {
; e! V9 d' G4 u$ A - @Override5 ?) F m1 _5 ^- @' R
- public void handleState(Monster monster) {
- S; \- t; G3 l6 u+ U* b5 M/ Y - // Финальная фаза боя) @9 W0 A3 ]2 ]! v
- System.out.println(monster.getName() + " готовится к финальной атаке!");
. C: e7 q1 h) L - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
; g# }+ W4 N4 q3 j: A, X - }' f( Z D5 N& H0 y; l* @( _% Q
- }
* h& J$ Y( R; l1 p' I
Скопировать код 6 C' C: e- q0 g" s& V' }; |0 p; E& m
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.# Q8 O9 v, w1 D1 u3 z' q; q
- // Пакет org.l2jmobius.gameserver.model.actor
4 ]- J; u6 [; R, D$ J! Z" {) l! U - package org.l2jmobius.gameserver.model.actor;' i9 r& Y/ [/ @2 Y
3 k/ {- M" @5 e' m1 [- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
: `% ]2 y" w7 C; Y - import org.l2jmobius.gameserver.model.actor.state.InitialState;3 e/ a7 m; |5 T. v
- 6 X' P' \+ _7 a) J" B5 z
- public class Monster extends Creature {
7 K# |8 Z5 Y& A* x - private String name;7 u2 r" X- V5 n. z6 x$ w. t1 O
- private double attackPower;0 @* f2 m0 C6 L' `
- private MonsterState state; // Текущее состояние монстра' B9 r' f8 U- x: q8 Q! k& C5 S
- 6 B0 R! N5 t1 @' p% e) n
- // Конструктор монстра
. ^6 H! i5 W# }8 Z - public Monster(String name, double attackPower) {) g# K& R4 M- I- ?
- this.name = name;
# I) C( u$ {8 V( l - this.attackPower = attackPower;+ z- n- `" _% Q B
- this.state = new InitialState(); // Устанавливаем начальное состояние' `; F$ u+ [2 B
- }' e( T$ \5 ]$ \( a
$ ~9 q3 m9 g) F- l- N- // Метод для смены состояния
% t& K+ w( [; [1 ~ - public void setState(MonsterState newState) {' x" e! Z; h% N" a: X m. j
- this.state = newState;
5 y# ^ W4 x6 C: }0 K. j - }
& k+ h& i8 f* o0 D' |
, D) l" U$ c/ V- // Выполнение действий на основе текущего состояния# X3 D) |2 ]3 N8 |0 f- }
- public void executeState() {* B# `; N* l/ a. K% {
- state.handleState(this);5 @0 Y( \6 ~1 O2 M4 d% m& H
- }- p3 T6 a( D$ r) k; w& P
R, Z8 g3 d+ [) K- // Геттеры и сеттеры
" k5 Q! w4 W2 b' \/ r- h) L5 x - public String getName() {5 g i- i2 W- m8 ^! O
- return name;
! r7 H4 L$ S3 Q9 [% J: m, L) j - }6 N/ m# E' M' M* n& ]. W! n5 e
- 1 m' u. F2 r' B) O. S9 F
- public double getAttackPower() {
" }: \ F9 f' u; ~ - return attackPower;& [7 N1 _7 o5 i' i
- }
( P v6 T$ l5 D
& y- m+ l- ]8 ?3 F# \* N% ~- public void setAttackPower(double attackPower) {
3 ^1 X y* a9 G+ @8 P1 W - this.attackPower = attackPower;# L8 W% L7 Z( I8 k9 T( t9 X4 ]
- }
& S2 c& n2 I& X% E/ ^; } - }
1 s% q! ~, u; B; q
Скопировать код 9 u' E; F* a1 {
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
' `1 e( Q; S7 |( l+ }; `, K9 w' W
# w, d5 m* X6 m8 u2 _. P5 h- // Пакет org.l2jmobius.gameserver.model.battle: _; N& `' G8 I# U8 }) p6 a3 b
- package org.l2jmobius.gameserver.model.battle;' V" }1 \% _2 ]) e
- 1 U/ @3 v$ J5 l% ~* ]& G: t
- import org.l2jmobius.gameserver.model.actor.Monster;
( v* e, |6 e4 l" J) f p1 E o: p - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
E3 } \ @2 Y i* V5 t q7 q - import org.l2jmobius.gameserver.model.actor.state.FinalState;; F' e k4 m- A, p+ B
- 6 \) Y" I! q: ^
- public class BattleSimulation {$ ^8 S( \# x- \& [: O7 a) s `# \
- public static void main(String[] args) {8 a- s' D% l) d# r2 l
- // Создаем монстра с начальной атакой) Q) G7 \* E! h8 Z! |
- Monster monster = new Monster("Дракон", 100);
, D7 d8 L3 r, L/ ?1 M$ }) F) ^
) ?! @. O i1 _- \2 N" [3 [- // Начальная фаза/ _2 N o! ?* Q0 S8 a0 q
- monster.executeState();& M% X$ m7 F7 |# L9 L) s' @
- |8 N! f4 X3 Y8 a2 o9 x( n- // Переход в агрессивную фазу8 {8 S9 E( s! {7 [8 p/ x; l& F' K2 L+ R
- monster.setState(new AggressiveState());
$ C9 l5 ?: Z' ]1 X - monster.executeState();7 Y( V3 ~$ F' p$ B+ p
9 e" h/ M5 \* p* Y: x- // Финальная фаза
$ m6 A( A0 o4 O, j0 i5 \3 Q - monster.setState(new FinalState());
& M% n5 w% x* ]4 ^ - monster.executeState();
( ^5 |% m; T/ X - }5 [1 ~& B: L+ z# a' r" x# A4 b
- } L3 W* x8 v, u i: g* ?- e; |0 A
Скопировать код
- E0 G/ ~, s5 Q) i; t' q7 KКомментарии по структуре пакетов и классов:" @, R& s: j. h+ h! z7 i$ _5 i
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.- P4 j& C6 `6 i# F* }4 G
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
% i2 Y. a9 k1 F3 {Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
- M* y4 t" e* @5 C. C' n: X8 F e
, e, x6 P$ G9 ]4 x- W' g1 f! |7 m& ^7 B; t2 f% b
8 e: O4 b* |; z( |: y" C" x
) ^! Z, k& V1 V- p' Y8 b2 x6 g7 ]) N+ _# j
& O' r# G6 R1 O% O& v" c7 S2 @: J8 h5 d
' B7 [+ f2 a$ u" c4 a6 ~; T) L
+ i% Y, q& E2 M5 x
. ^- g; ~5 t, P, C; h# s
$ F; ^. F0 l' k* w( B. i- H7 T
: v$ }1 k! d# s$ U
# \7 }: X* s7 M) K1 ^, {% y |