Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). ' j! r4 r4 j# m1 o- p$ _/ z
* J7 T: D7 @3 M+ }
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
# R- f+ w: q9 ? E& `
3 U/ {. h" @4 l- DШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.' f5 a9 P7 G+ J! S
) p2 I* W; M/ n) \+ W' F0 z
- // Пакет для состояний монстра
9 G- z- i# h6 ?$ H* U0 i0 W7 ?; c - package org.l2jmobius.gameserver.model.actor.state;
3 n( i$ {' | I8 b - 4 B6 z0 U" l4 M+ s# @& D8 k9 A/ f2 J
- // Интерфейс, представляющий состояния монстра( d7 J9 N* \$ ~) j7 h0 N) p
- public interface MonsterState {& Q: ^' h& @7 T2 I' J. f2 f
- void handleState(Monster monster);
, ?8 Q$ C7 J9 X# @ - }
2 t8 G$ U \0 p5 ^, M
Скопировать код ; q4 Y7 @. i2 u9 S: d! A$ A, J4 O
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. ; u( {- p9 o, K4 h( E0 J4 }# G
+ }3 p8 l" ~( i6 H4 D$ i+ RЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
# D) r5 J+ k) {9 _* C6 S8 Q) m2 T8 T
Класс для начального состояния монстра:3 ]7 Q* i: K" c# n, @5 X6 D: ^
- // Пакет org.l2jmobius.gameserver.model.actor.state
9 I# o3 `) g( {2 Q0 ~" [ - package org.l2jmobius.gameserver.model.actor.state;% X9 L% {& D: \; `
- 1 Q! V8 L: Q1 f3 Z! Y* L
- import org.l2jmobius.gameserver.model.actor.Monster;
) h3 Z! I& |! ^1 x' a5 S - ' p5 O; F; _, f" A) ^
- public class InitialState implements MonsterState {
$ `, |3 h; P2 `1 S1 Z - @Override+ V# f$ k4 ~! f% p4 v. E: p* q. z5 B
- public void handleState(Monster monster) {
$ M8 U1 ~* T. H - // Начальная фаза боя9 D( g7 l3 ?! g- H" Y; M8 }
- System.out.println(monster.getName() + " начинает бой с обычной атакой."); k! A t( L& E' g. J
- }
1 W7 O; k) ?& \ - }2 C/ D! u1 N, v _5 [/ A3 C
Скопировать код Класс для агрессивного состояния монстра:* T( `4 U" ^' B( w
- // Пакет org.l2jmobius.gameserver.model.actor.state
5 S. C. z5 a/ Z7 T - package org.l2jmobius.gameserver.model.actor.state;4 g5 @* x6 h2 N' [# D# `
0 Z4 c8 ~) D9 ?& \- import org.l2jmobius.gameserver.model.actor.Monster;
8 ]6 t+ X' {1 \4 ~3 z5 @# a# L4 `
7 } U* q: m* F! q: d1 j- public class AggressiveState implements MonsterState {
4 F; m- o$ y" S - @Override
0 Z+ b( u: z2 o/ _6 ?# ?/ X7 W - public void handleState(Monster monster) {1 |/ A- i! b% \ {, k
- // Агрессивная фаза боя
$ S3 g! h1 ?1 x* y - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");( h7 i' H7 K! F5 l9 F
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки Y# H1 d, h. U
- }0 l2 x0 J8 s5 _
- }
) d/ F$ c7 B$ k: }% G6 j
Скопировать код Класс для финального состояния монстра:
8 m5 l' b' [" d; `1 V( X- // Пакет org.l2jmobius.gameserver.model.actor.state
/ E# j1 X, A$ d - package org.l2jmobius.gameserver.model.actor.state;# ~7 A1 J" R4 V" H) Y9 Q+ [8 c
- 3 b" ~, j8 E# S! p
- import org.l2jmobius.gameserver.model.actor.Monster;0 U; V0 H* d1 D% K3 `
- $ L% e8 e2 {6 I& {
- public class FinalState implements MonsterState {
. \" J3 y1 X0 _6 H) V - @Override
. t, q: n! ] s' @& x - public void handleState(Monster monster) {3 f7 ?" }* x+ F% o
- // Финальная фаза боя' w& x" W1 }! Y: b
- System.out.println(monster.getName() + " готовится к финальной атаке!");
; n6 W z9 {: _, q* l. ^7 a - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки3 D1 g2 Y* F# s; o5 R
- }1 `6 [* @- {$ {, m2 L) D: O" t
- }
& A, \8 j$ F1 y, [* n
Скопировать код 5 L W! N! C1 y( v( p
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
9 z. _) r# h4 o/ a4 x6 C- // Пакет org.l2jmobius.gameserver.model.actor
; I/ W8 H1 K/ y6 V& Y W - package org.l2jmobius.gameserver.model.actor;$ I* [! w( m0 J' j: Z
: X; ]2 @" S$ M- import org.l2jmobius.gameserver.model.actor.state.MonsterState;6 B/ p! i7 b+ G0 I( T. L: G- @& `5 x0 g+ y
- import org.l2jmobius.gameserver.model.actor.state.InitialState;
% B5 A; ~" F+ z) n0 i0 k$ x5 ?6 x
$ `: n* N: u& C2 ?4 @- public class Monster extends Creature {
/ b4 A# \8 y5 I% ? - private String name;
6 l0 b \' x4 x, T+ N ` - private double attackPower;
; c8 I3 l$ u7 D D - private MonsterState state; // Текущее состояние монстра* @9 h; _. [1 ^
+ l, y+ V; k0 }. d+ C! ?- // Конструктор монстра
1 J, v5 t8 ~6 A* V4 M8 j: Z- ~& }% [ - public Monster(String name, double attackPower) {5 }& n9 n( U2 _; C6 M i
- this.name = name;
3 D5 x) X' x: J; Q; v+ g& @ - this.attackPower = attackPower;2 E" a9 ~: ], d0 N! M1 h
- this.state = new InitialState(); // Устанавливаем начальное состояние
9 d- d" g- x {. Y: k - }; [9 \. E' _. i
- 1 k; f, H9 [. u4 C+ z$ C9 j
- // Метод для смены состояния% H2 ]7 S+ }+ O6 b: V, e
- public void setState(MonsterState newState) {/ s) K, J* J/ a! R
- this.state = newState;" A% G. ^% y0 g( C6 R3 s+ j# `( o
- }
! W8 J y Z$ Z' X- z/ L- J& c - & W& W! s6 X Z! |0 H- k
- // Выполнение действий на основе текущего состояния
1 h! g& X% B& l& Y' ~4 R; } - public void executeState() {3 U& Y1 a: E M' T/ V
- state.handleState(this);4 {. V+ o& l7 X5 K- c' G4 Y7 x
- }
' A# D) K' u$ x" T8 j$ I: ?
: | a2 A/ q% Z; o( b7 ~- // Геттеры и сеттеры' F" W1 q* L1 A/ l
- public String getName() {
( ~, o9 p# e" P+ ` - return name;8 A& S$ j' b5 ?
- }4 E: U. j- G s
9 ?3 B. u+ u) q) T/ G# g, \- public double getAttackPower() {/ I" z9 O& h9 ^/ ~ |5 `
- return attackPower;/ }1 d. V9 z* D. _7 J6 j9 g; d9 {
- }
% u8 ?3 V$ z0 x I
3 d% p4 o$ V- |* C( z6 ^- public void setAttackPower(double attackPower) {
5 s/ n j; \& H1 J! M - this.attackPower = attackPower;
0 E/ J( L$ z# ?; ]5 U% [ - }
1 e3 j& b" V, v$ s( U, d - }
! j3 N$ o. R7 I
Скопировать код
- h. j" S: v9 K- T8 r. U2 dШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.. J; |6 l( Y$ \9 ?5 Z8 M m
+ Y& G [- f4 v* m* c& J- // Пакет org.l2jmobius.gameserver.model.battle
, g# @& ?+ s8 D( g* }( C - package org.l2jmobius.gameserver.model.battle;
. }, ~8 V) q& j - 2 x! }1 z; S3 b' q+ o
- import org.l2jmobius.gameserver.model.actor.Monster;
& ?2 V* E! M4 r3 s$ ~+ f - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;% F, j/ f' f1 Q- g9 u
- import org.l2jmobius.gameserver.model.actor.state.FinalState;
% A a! F6 _- y1 \1 T/ \; ~ - 2 f3 S, Z( I, n* ?" p5 [8 U* o
- public class BattleSimulation {) J+ D+ S/ Y8 ^. R$ v
- public static void main(String[] args) {2 T y n& a9 W7 n! d4 E& M
- // Создаем монстра с начальной атакой% p4 i% z, i( Z& ?
- Monster monster = new Monster("Дракон", 100);
* R, O% L+ `: J1 F. C- V
7 g3 e( }0 @+ D0 \- // Начальная фаза; v* d5 \9 L% N- g' B9 F* D8 q
- monster.executeState();( _) z" \. r& M7 ^
. k' \7 C5 J, S+ D" g- // Переход в агрессивную фазу: ?' s1 B* s4 h* [
- monster.setState(new AggressiveState());( q: j7 ~0 q% b% g8 C. _( B
- monster.executeState();" w3 i4 u& Y" i: r6 i0 ^
$ a+ L- {* ?' ^; K- R# H5 S9 N% Y' {! C- // Финальная фаза# _) N/ E/ N8 `3 }9 h- u! \7 d( p
- monster.setState(new FinalState());% s" \. h, Z" `7 w
- monster.executeState();
$ y' n0 t: H6 L2 ^ - }9 A6 [2 O- y- x$ E7 W5 L
- }& _6 X1 m( R; ]0 E% [3 b
Скопировать код 8 O- s7 K& U8 Q1 J- R
Комментарии по структуре пакетов и классов:! D3 S! g. f0 v# h2 B$ E6 S U
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.$ }& y5 F! G9 i- Y3 p8 X
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.( q; M8 K! s" h5 f
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
" }: [, Z6 ]- u# W# c3 Y% w. N8 h3 A* U% Z& ?1 b/ h; z) t; G! P6 o
3 ^/ I( d2 b- o% Q
7 z! W& {4 ~+ `0 k
' V& C4 z; l$ G% P% b4 G
# c/ ~; R. `. j2 ?9 }
" P7 I7 o: D! T' Y$ Z
% B, a( u1 ~- }1 V
9 r2 T$ y" {, S9 A5 i
3 }/ F+ K& f! P& S) ~. y6 z+ l L3 c* X8 b5 R9 V1 A
: a" U4 q1 l- t# L B
: S) q. a0 D+ z, J1 G
# B* [8 F% w+ y W
3 U. H6 L: ?+ M# ^- c# v+ W! e. q7 d |