Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
( m, d! `- p+ A% X; |. F( _) p3 h0 a
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.0 o4 O1 A8 J! t3 Q5 q4 O
# I$ C# `% r7 c+ q
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
0 f4 F! V( |6 H% k
5 R7 T2 L1 c* C; |% o/ F1 p- // Пакет для состояний монстра$ y: m0 X( ^) {2 } W" {! J# @; {8 V
- package org.l2jmobius.gameserver.model.actor.state; C. r9 t0 D4 F: j8 B1 e9 @2 L
- ; g e! e6 @- O
- // Интерфейс, представляющий состояния монстра
; U3 {* s- j* S+ A5 K6 C' h+ u - public interface MonsterState {" d: }3 t6 r: N9 u- Z5 |
- void handleState(Monster monster);( [5 [/ L) l$ e, |2 u/ c. J- f# p
- }. \; _: ^" J* ?0 s
Скопировать код
; K$ ? V" J1 l% }% w4 dШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
1 J0 B; I C3 H( E6 {4 r! J4 N$ a, @* d* F6 S! c$ d
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
2 i. M5 B6 n+ s* T$ ^# i/ F! D# A( V7 g1 H: ?- y
Класс для начального состояния монстра:
|: k+ c" F3 o- @- // Пакет org.l2jmobius.gameserver.model.actor.state
1 @% r9 V9 Q, s1 X6 ` G) F - package org.l2jmobius.gameserver.model.actor.state;
6 [/ T/ g/ d( Q4 Y2 f
/ Q& y$ S7 o4 S& `( M- import org.l2jmobius.gameserver.model.actor.Monster;- s- m) n) W/ d8 d7 {4 O# p- d$ W6 o
/ D/ L& s, B+ K7 |# d. P, e& X- public class InitialState implements MonsterState {9 z( |, D- A% r. j6 E, ^0 D0 I
- @Override& D' W/ R( { }. e' C3 w
- public void handleState(Monster monster) {
1 C8 J- Y% K* O& l* I/ l# @' d6 q - // Начальная фаза боя
0 g2 _# y, m6 l: _, o9 B - System.out.println(monster.getName() + " начинает бой с обычной атакой.");
; `7 j6 z6 a. j9 A& q& t X1 t B' t - }! m+ ?3 G) I' K5 x* V* ]; ]5 d3 \
- }
4 I: R& D6 G$ r/ R( h
Скопировать код Класс для агрессивного состояния монстра:
5 z" y7 t; g# t" k6 j J) U- // Пакет org.l2jmobius.gameserver.model.actor.state& _* {- r3 |$ f" l! G1 h
- package org.l2jmobius.gameserver.model.actor.state;
7 S5 A4 Z, f, ~5 h9 T
# U0 R8 W7 w. W; O4 O% z1 K- import org.l2jmobius.gameserver.model.actor.Monster;1 L0 @- `) e+ \* t5 }
- 2 e- Y$ B' z0 t5 s5 c; n1 {3 I
- public class AggressiveState implements MonsterState {, I9 K8 v0 j1 ]9 Z/ m8 N
- @Override
$ \9 h; s/ s( r% F - public void handleState(Monster monster) {+ p% K% |0 R- c7 N
- // Агрессивная фаза боя
; ?: p( L& _& I# w3 S5 ^ - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");6 P z' u5 V8 q. c! r
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
: e0 q4 x& U0 R0 B- x. Q6 D* e - } R( y: O& N' u4 `( j
- }& U( o# P6 H; C# I0 h9 `
Скопировать код Класс для финального состояния монстра:+ D2 {) e& s- `5 k4 F
- // Пакет org.l2jmobius.gameserver.model.actor.state
k7 w: X3 l* I0 x. t - package org.l2jmobius.gameserver.model.actor.state;
$ c% P( P) e0 {% d# G7 q, C
3 C3 Z2 n; A& G* B) C- import org.l2jmobius.gameserver.model.actor.Monster;
1 F8 m5 x8 v6 t4 e2 z3 E$ ]
8 S+ a/ ^: P2 B0 p. \# Z- public class FinalState implements MonsterState {, A+ i8 M, Y. N$ Q
- @Override; a2 n2 D6 C |5 \+ o& ^
- public void handleState(Monster monster) {
- `4 }) |& H: q+ w - // Финальная фаза боя
& G" T( s" x% _4 _7 g0 n5 m - System.out.println(monster.getName() + " готовится к финальной атаке!");
: n" {$ j# z9 ?- x8 t9 I* S( B - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки" Z1 J( i7 a: s3 \+ w+ d/ ~9 J1 n
- }- v5 Z! {' v, G
- }
V" g: e5 O" D0 D
Скопировать код $ r! S5 @9 N! c
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.6 D% @ [( B# Q6 r$ l* _ S- L; X
- // Пакет org.l2jmobius.gameserver.model.actor
3 {: |, {' X7 Z% _5 w. B6 C- J. b - package org.l2jmobius.gameserver.model.actor;) o' S5 D2 F, ^8 Y( i7 r
# t9 P2 p: ~5 U2 l2 s, u- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
! K! }0 A( K% g( Z - import org.l2jmobius.gameserver.model.actor.state.InitialState;4 ~5 p$ l/ X* c. J; |
- 4 g- X: W- C9 h" O
- public class Monster extends Creature {; ^% c& O8 J/ m; b3 n7 d
- private String name;" Y5 U1 t* k% e# ^9 T' D
- private double attackPower;
$ f9 B6 z( o9 h9 Y1 g- t% U8 G x/ | - private MonsterState state; // Текущее состояние монстра
4 P4 t& U9 @- \4 K2 h: w5 V - 1 f2 h5 q: p7 @' t3 C4 P
- // Конструктор монстра
3 g2 u4 F( J5 l7 V - public Monster(String name, double attackPower) {- t3 z4 z2 E C' i6 W( a {& N
- this.name = name; v# D: n; C* _9 o' H
- this.attackPower = attackPower;2 ]5 G ?% R9 \& i, k0 S$ M4 g
- this.state = new InitialState(); // Устанавливаем начальное состояние
$ l! w. A6 X7 q, Z - }+ t' E8 {; x- _3 t3 T
9 E$ E* _9 q* P/ G5 U+ p/ V; J- // Метод для смены состояния, w- |7 _- [; U. ?1 h9 \* B- p
- public void setState(MonsterState newState) {, V* I' w( a# e' a
- this.state = newState;
: z& Z/ R" o/ \, ~: m% W - }
8 v7 k; r) z3 D: C. f- z - , t) k8 \8 s7 O
- // Выполнение действий на основе текущего состояния8 j# y, I$ U! C( M' K
- public void executeState() {
5 P7 o9 }' ?" ?! e7 R) V - state.handleState(this);
% ]5 `2 b) Q8 d - }' _9 m0 d g/ J1 l ?
- % P' z% H5 z$ {% @) p7 d6 G/ ~( X
- // Геттеры и сеттеры3 Y3 [; C; i7 [8 B* W. R
- public String getName() {/ B; h+ ~" Q' f2 Z& f
- return name;3 U4 P, h/ a% f2 K
- }' }) L5 U3 h q
- D: B& g" B# s1 S8 s( @
- public double getAttackPower() {
& b; ]6 c2 R2 {' @ - return attackPower;
/ k8 N( n6 D0 U6 v0 `( S- `1 { - }# ^7 m% n9 w! c/ u( S) w
- 5 E4 I" a6 P8 \+ Q7 H# l% w
- public void setAttackPower(double attackPower) {9 S) H! ]' \& S
- this.attackPower = attackPower;
$ w6 I3 M" S) a2 d$ b/ V! l; `) } - }. o5 U4 W3 k4 r1 T, `
- }
, [+ x5 @; i2 Y& v7 s" ~! D3 u( {
Скопировать код
! C! |# _# I4 m3 E4 p9 o8 xШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.. _* @" Z$ d* i( W, z! O4 @$ O
7 K# I' D3 z; o4 k* D- // Пакет org.l2jmobius.gameserver.model.battle
) X9 M( _4 [7 u& J9 l1 ~* i8 i3 I - package org.l2jmobius.gameserver.model.battle;
6 |4 z2 N5 Z) u8 x" d5 S - ; K5 m9 O( A2 l; P# J! }7 X
- import org.l2jmobius.gameserver.model.actor.Monster;
; s. y' ?. h8 N, `6 T" Q( N8 j, W - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;- X: ~! y1 F$ z# A$ z' T
- import org.l2jmobius.gameserver.model.actor.state.FinalState;* d3 c, [- N# l4 @4 c9 ?9 l
- / d$ c m% x& _, {2 Z
- public class BattleSimulation {
) ?( U9 `$ ?# c! X1 h5 l - public static void main(String[] args) {# w1 y" b0 I, d% C5 g1 t- x3 \* X
- // Создаем монстра с начальной атакой, Y R2 f3 w; ^$ G6 |
- Monster monster = new Monster("Дракон", 100);9 w, ^+ c( v0 `9 y, u
4 A1 s9 ^6 V# D% p5 t# @$ E7 v- // Начальная фаза
; R2 ~$ s- q' v6 o! H - monster.executeState();
$ `5 i2 o! f6 u' U5 O - 9 i3 r# C; v. h* ]( s
- // Переход в агрессивную фазу$ o5 L! M$ c' q y) j0 _
- monster.setState(new AggressiveState());
' L. @. J( T& J) C& r! t/ X - monster.executeState();
S; W8 U6 B7 b" V/ _) D6 k8 H1 i - ) e7 C" g0 ^ _) f T6 B- C, M' z$ P
- // Финальная фаза' g: m( v, h: n, F& G% X
- monster.setState(new FinalState());
. ^' a0 _- h* m - monster.executeState();
7 m6 s; ~( m0 H% u3 E$ B. v - }
3 W; O* v2 F! }5 Y+ H( \ - }5 M2 s' {9 i6 q: Y: c6 K* \
Скопировать код 7 ]+ H: |- l; T9 {( d
Комментарии по структуре пакетов и классов:5 h$ I5 D2 t5 o, z+ l V/ e
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.2 l: J3 E( U0 |( m$ R# V% Y
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.) X. g6 P( c: Y# w3 K. D
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
8 N6 w/ z9 r; r$ I/ E h) z! d3 ]& q1 r& ~6 U/ [; O E9 s; B1 o
, j% S1 l$ R" h1 ~: W
# h8 y; L5 |0 Z T
4 y, N3 a( q( S7 a3 f
* G( [$ K ]6 X( W7 i1 G+ q2 W' b- H) Y! n4 F
7 r% B, a8 S5 g2 _# t0 [
5 ~5 G0 y/ `3 X7 D9 `, `( U; ]9 M" {
+ B6 [) U5 S) [. h% |; m/ |7 e; z, c: `! D9 H/ R( H3 q
. e3 Q2 Y5 m9 W6 @2 |
7 f$ O0 l3 ^3 x* n
- m6 c" X& @2 I# |) v* e6 H |