Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
1 ~7 A% q, A0 M1 V& O+ E
# \8 |! d& L* |0 ?6 a* i+ }Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.6 k% f1 n+ ]0 H1 m1 x: u
$ G M8 q ? d1 o/ @2 s0 l+ wШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.% S2 V4 k+ L% }) ^" F
" A/ U# `" i0 F4 Y- // Пакет для состояний монстра4 X1 S( V5 R r3 W& S5 J8 g. C
- package org.l2jmobius.gameserver.model.actor.state;; E, i/ _" v$ a) J, E( S1 c* R5 |
1 C: z/ U# _( P$ y% F3 w6 U- // Интерфейс, представляющий состояния монстра- B; C) j8 ?$ V. r7 H4 R: G- e
- public interface MonsterState {
( j) z e5 K! {% ] - void handleState(Monster monster);0 D0 U2 k( X r+ _
- }) k. ^5 n, I7 j4 m- B& ] R) `7 M
Скопировать код
# f) p7 B. H9 z3 {% P: l; {Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. & a/ i4 L0 N$ x! t( ?4 I
; e1 u& z1 x$ X2 y
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
( U J% h/ ` Q
: J6 T6 t, i. WКласс для начального состояния монстра:
) a% h: B: B5 J- // Пакет org.l2jmobius.gameserver.model.actor.state
+ x$ \8 P6 ^- ~: y2 W. O s% }7 }' N - package org.l2jmobius.gameserver.model.actor.state;7 B l0 z* j# [
- * K, b; Z! F& ]' q
- import org.l2jmobius.gameserver.model.actor.Monster;3 l& `* s3 U7 A* \3 {7 Z8 i
: K9 Q- T7 |6 |- V4 ~, H' [- public class InitialState implements MonsterState {( W! R i$ D: j$ O P9 S& X
- @Override4 ]0 o- f/ p ?3 M7 x3 K- g, K+ d6 F
- public void handleState(Monster monster) {1 ~, g3 }7 t& Z- {0 v* G
- // Начальная фаза боя
+ _1 @ x6 h g9 p' d - System.out.println(monster.getName() + " начинает бой с обычной атакой.");6 m) X9 t' w( }9 E
- }
3 l+ ~( l' c. b$ w8 s - }* U% e B% O7 ~4 k
Скопировать код Класс для агрессивного состояния монстра:
( E! \+ p# G! J1 U s8 c- // Пакет org.l2jmobius.gameserver.model.actor.state
: g& i$ h, K2 |9 d5 r - package org.l2jmobius.gameserver.model.actor.state;
% x2 K/ A, j; t% `
: F4 \* D) U% z- import org.l2jmobius.gameserver.model.actor.Monster;( ?; T e+ c) E5 @ ?
- 0 ]$ N1 v9 w, f
- public class AggressiveState implements MonsterState {& N$ d' M3 }) V0 N* S7 d# A2 I
- @Override% S+ K& J( k1 o; L
- public void handleState(Monster monster) {
8 s' o/ d( o( h$ V& D - // Агрессивная фаза боя
2 q# c4 Z) V; b - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
1 X- H9 q# X* |: t4 G, P* D! s - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
( n8 e& B$ F& f7 x4 B' L! r - }
0 P! D! R# e1 F - }$ n- @" }' `$ Q5 \* a) w
Скопировать код Класс для финального состояния монстра:
7 ~4 N A( S+ Y) U& Q) k, g- // Пакет org.l2jmobius.gameserver.model.actor.state
/ ]$ G: s7 ~$ ]) Y2 @1 n - package org.l2jmobius.gameserver.model.actor.state;
0 @& ?4 a( k3 w3 U5 t( i
' k9 c- r! L: B. ^" o- import org.l2jmobius.gameserver.model.actor.Monster;
0 |5 o# {/ p: O8 M, i6 |' _ L" R - 9 ~9 n: \( t9 V5 f; s6 x+ x6 F
- public class FinalState implements MonsterState {) g4 `) C7 c1 B( `4 L7 N, A1 R7 o
- @Override( D# q# x j" h7 S8 D4 g7 g
- public void handleState(Monster monster) {8 J6 I- @- J# ?- X4 ?3 Y Y
- // Финальная фаза боя
- Z6 V( _9 g. J M. y- _. w6 {0 [ - System.out.println(monster.getName() + " готовится к финальной атаке!");
: l' d4 u1 z$ }6 H( _$ U4 u - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
1 _! M& h7 B5 f3 \: n! s# I1 B - }8 h. n+ f/ @+ I1 Y
- }
7 b% C: K$ g% @* Y' ^# N9 I H/ `& @
Скопировать код $ R0 _: P2 q1 \4 j2 i
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
+ c+ z: V' H, k% k7 o. C- // Пакет org.l2jmobius.gameserver.model.actor$ ]/ p6 v9 ^$ h) o: H
- package org.l2jmobius.gameserver.model.actor;1 @ |8 O1 _: O2 F! J) E
- 9 u. r3 O3 ]/ n; p7 }' n
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;9 P' V4 K; O5 w" b, ~. ]9 U! t
- import org.l2jmobius.gameserver.model.actor.state.InitialState; f/ @1 R1 L5 D1 X
$ B& Q% e' O, ~! Z- public class Monster extends Creature { E6 y" O5 ^( A9 b7 A
- private String name;
4 E! M4 f+ n, T/ P+ `+ ] - private double attackPower;
6 w) o; X, h% G5 a9 f - private MonsterState state; // Текущее состояние монстра* E- a' F6 J. e" U6 V8 `9 f
- ) G* T7 L% O, N$ N# {
- // Конструктор монстра+ p4 [# m# |. Y' d, k3 w4 U
- public Monster(String name, double attackPower) {" x! z6 U* d6 B+ J4 e; K
- this.name = name;
8 i) t% v9 t. I0 l3 n - this.attackPower = attackPower;3 P& t( P0 L4 _2 [3 U& [
- this.state = new InitialState(); // Устанавливаем начальное состояние8 d& c- r" U$ W2 @
- }+ s( |* v( a8 C* o* E
6 l% r) v/ Q! ^7 M- // Метод для смены состояния" W; b0 O! @% h0 s6 r! k
- public void setState(MonsterState newState) {
/ f% o% \% h% i, ` - this.state = newState;
9 t5 X) }" [3 V) L9 Y; [. y" A - }
% R) ?* y) }3 T0 B. ]/ L7 x- X4 u
6 U& w& U5 c( |( Z. L5 ~) e. Z% o0 d m- // Выполнение действий на основе текущего состояния, f, A- e8 I' U' ]
- public void executeState() {3 ] z: ]! Y+ H+ f7 R: ]* E8 f
- state.handleState(this);
) L8 Y5 O3 ? X, h: G8 |* n' R- r9 \ - }9 @6 k l" a2 q( I' y! K. L4 Y* Y0 c
- 0 d" _. Y1 c1 Q! {
- // Геттеры и сеттеры0 S: \' M8 Q; ^; {$ t
- public String getName() {2 j4 z' M1 G; r; X% O) ?4 K- L
- return name;
4 u [# _/ F. R9 k; U4 z - }
: z8 _; O' p# N( h! ?) C - ) p: C/ d6 b& D. l( j- {
- public double getAttackPower() {, K+ p; i4 a9 L8 K9 s' q0 r* t
- return attackPower;6 R$ p. M( S$ I. {$ z5 R4 L# V
- }
# y7 V- d' v+ @+ d: h: B" y9 n - 2 p# p2 n, y7 |
- public void setAttackPower(double attackPower) {
- z: ^+ j! S' r. C - this.attackPower = attackPower;
1 p! ]/ ], S+ }* { i - } D+ g( h7 T$ c
- }3 O3 e0 H3 U, i Y$ K
Скопировать код
9 h4 x- i- R8 ZШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.6 F. N1 u5 a8 d- {6 o% {5 s
1 x- I- _' [, v; D! {6 S4 [/ k) G, X7 V
- // Пакет org.l2jmobius.gameserver.model.battle
: {0 W/ D b _ Q - package org.l2jmobius.gameserver.model.battle;
& ]) g8 S% t) f4 t- B. K" t0 W
1 e1 _# b7 \4 U9 ]3 @4 V: O- import org.l2jmobius.gameserver.model.actor.Monster;" r6 z# K/ y' D
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
9 A& C0 D; L) D7 G7 B( t - import org.l2jmobius.gameserver.model.actor.state.FinalState;% f5 [9 w0 a+ j& C) S; y( I3 x8 q8 R
4 N8 r+ l( a: f: q- public class BattleSimulation {. a& h3 K$ ?. @$ W% [3 ]; c" S
- public static void main(String[] args) {& `# j# C8 T* f/ J
- // Создаем монстра с начальной атакой
* w) V$ S. w" T, s% o: U - Monster monster = new Monster("Дракон", 100);+ {" I P( n$ X; i+ V" t
- 9 @; J6 i: X$ @" s3 n
- // Начальная фаза
4 W: S9 @! j: R2 n. ` - monster.executeState();$ z$ f+ P) ^; `3 F% ~
- . O' B4 D/ {/ M2 ]. N9 d- M/ h
- // Переход в агрессивную фазу
- {% B+ {; p W8 F- ` - monster.setState(new AggressiveState());
T/ n; O% U# E1 A - monster.executeState();; t' d& ^4 v# _4 m7 k
- 3 a! ?6 c: X$ R. g$ S7 g: _; p0 W6 e
- // Финальная фаза
/ ]8 J: N0 J' V1 r" [/ m - monster.setState(new FinalState());8 {/ E0 s; h- m/ p( D- k# m! H
- monster.executeState();( T: G; n- D: \4 i
- }. H, e7 m, b' [
- }2 [. o, Y. O$ l. I! s
Скопировать код
. W6 D$ l' `3 n/ p9 U+ PКомментарии по структуре пакетов и классов:0 g* Z+ O5 K+ s5 Y1 a, U! q
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.6 ?# y W# [% k+ P; c3 `0 L9 j6 \0 Y
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.+ i& _5 \! D' t% \
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!/ [0 D. j$ V9 r
+ g. P# j0 k+ \4 }( M
( Z9 S/ l# `& U
8 ^+ W& g- r- O/ A- m) k' B/ M7 ]) P4 x1 s
5 R+ ?" F$ Q; _2 B/ O2 N8 {' u2 V
) H$ w; |# B- Y$ Y: J) D) b1 @% P; Y$ b( ^
3 q9 k# i2 {$ H0 H- z: @7 G+ N
' h& }+ W; T* q" A5 k$ l( d
0 b4 `7 K6 [% A! S9 c
5 f- l* X6 [7 V# {4 p6 w
6 r/ R$ g. Z% N4 b3 b/ q. h' o; o9 D. n! C( g% ^- B. `7 v2 R0 I
/ a8 o, v5 d3 R1 h4 p* W; b7 \& T
|