Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
; i- H9 t* {! C$ R
3 \1 y- W! N- C3 G* B* f2 X0 YЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
0 s; K$ m p: O$ E$ D2 F
) x( q5 ~& Z8 l0 c' DШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
0 J' O% c' t* R9 `/ m
u# F+ e$ P0 F6 p v8 j- // Пакет для состояний монстра
. z4 n8 f1 o- L$ o - package org.l2jmobius.gameserver.model.actor.state;
! Q k* q( j- b- y - 4 P) T$ C1 f! w: W3 h# h1 j" z
- // Интерфейс, представляющий состояния монстра
& w v$ l$ m4 Q( |2 t5 ?+ ^* e0 X - public interface MonsterState {% J( A% r( F0 q6 Q
- void handleState(Monster monster);9 P% J+ i l0 @2 p
- }* m, q! z, V2 z: M& E" T
Скопировать код
6 U! j: P9 R! c$ C$ qШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 9 }) v* w2 u) T& R- C- o( w
$ a# p# x- t8 F4 DЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.# ~/ ?' B ~; E9 i* T% F' h
: j# a+ C% g0 a# GКласс для начального состояния монстра:3 U% D6 a8 ?4 }. p4 O0 h! F! O- p$ v
- // Пакет org.l2jmobius.gameserver.model.actor.state
/ A+ |8 D9 I' U j1 e - package org.l2jmobius.gameserver.model.actor.state;
1 M/ s, W0 I- ?
9 }. {3 {. P% |( y- t) `* X- import org.l2jmobius.gameserver.model.actor.Monster;' K/ ]. M8 @5 u: B |+ I$ P; n
- 5 f7 V2 [' M9 i g
- public class InitialState implements MonsterState {
3 T6 e) i) U- ~- i - @Override# L7 z; A% F4 }
- public void handleState(Monster monster) {! d- G# [! `' A$ \ d& I% Q$ |; G
- // Начальная фаза боя
; O- e S# F6 m" F- f - System.out.println(monster.getName() + " начинает бой с обычной атакой.");
7 p% a3 H6 x! `( ]" ~7 T - }
1 g; y/ r( P" S2 s, V' \3 F - }
e; Z3 @* Q$ ^$ h
Скопировать код Класс для агрессивного состояния монстра:! J4 ]5 U- Y, W3 r) G
- // Пакет org.l2jmobius.gameserver.model.actor.state
( z$ B; M3 l0 K U& h) f% K - package org.l2jmobius.gameserver.model.actor.state;
8 @9 l) |5 H" E5 P - ( n8 t+ ]) D, g2 D: @6 W1 h! k
- import org.l2jmobius.gameserver.model.actor.Monster;4 {* `8 t7 d0 S# J% ^
- / B: @+ j; b5 b1 w9 Q8 s7 c: S
- public class AggressiveState implements MonsterState {2 Y& U, P6 p* q' ?3 D) t, w7 ^' O1 K
- @Override
: @" l+ f5 K' C: H1 H! j7 g& H - public void handleState(Monster monster) {
. l3 o. ^% q! l! L9 d7 t9 D9 s - // Агрессивная фаза боя
5 L; z% M) I0 W* K) i, Q. _ - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
0 T: ~% G; P: c; f& j! N% S$ }: Z - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки& R4 L- c. ]- k, ?/ x' K: g1 _7 Y
- }
( |; r& H% i5 R& g - } R% L: \1 D ~& t& W
Скопировать код Класс для финального состояния монстра:+ b0 ?% @% a* w3 U
- // Пакет org.l2jmobius.gameserver.model.actor.state
7 \: f2 ^; h3 b - package org.l2jmobius.gameserver.model.actor.state;
/ X3 Q0 Z/ R" x- }+ O( @ S2 j - + {+ i. P& m' j, S9 T
- import org.l2jmobius.gameserver.model.actor.Monster;8 e. h( Z6 W4 {5 A5 U) b
/ o# `4 G% {5 M8 k% I- y, V. X# i- public class FinalState implements MonsterState {
# h, B# m/ O' W x# a - @Override" g' h [# n. z7 [' Q
- public void handleState(Monster monster) {- M' O2 l$ d( o! a) n! `% E' a
- // Финальная фаза боя" J' a% S$ f* _) q* M) M6 {
- System.out.println(monster.getName() + " готовится к финальной атаке!");
. a" L6 i+ j8 p - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
: K$ S3 i, k9 _5 X - }
3 h, P# G( w2 u/ \ - }
$ C* ]3 N9 h% B, l/ r) c$ _4 B6 y
Скопировать код
/ v' Y8 f5 O4 |5 vШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor., a3 Z! V3 Y3 ?$ l1 {, M
- // Пакет org.l2jmobius.gameserver.model.actor
6 z9 k1 s, t* n, T - package org.l2jmobius.gameserver.model.actor;
" ~+ { \) s: J3 y2 ^. ^2 x
6 v2 Q# W8 @+ Y( D. ]8 \3 A" v- import org.l2jmobius.gameserver.model.actor.state.MonsterState;4 X. r9 F# r! T) Z" k% @
- import org.l2jmobius.gameserver.model.actor.state.InitialState;' d( P* z- ?/ V" j
% r+ I# f& f: Q1 X o7 D4 ~$ O# @- public class Monster extends Creature {( c9 \, _- ]4 D6 y4 p! Q8 R+ t, t$ l
- private String name;
% z4 S2 T1 j* O: r7 W0 M5 c3 {3 ? - private double attackPower;' ~. ]! G7 p7 ]5 ^) f$ C9 n
- private MonsterState state; // Текущее состояние монстра' @( u% `. Y; t# g, u
- # \# _2 u0 h' n8 n) D; g$ t6 v: y, U
- // Конструктор монстра1 h: t! t& `+ K% _7 n7 |
- public Monster(String name, double attackPower) {$ l7 ]; o1 f( V1 d1 C3 N
- this.name = name;/ F ~ J2 ], _# k4 o) r. u7 b# U
- this.attackPower = attackPower;
( c/ {" z1 I. |- R2 k3 G4 n9 r - this.state = new InitialState(); // Устанавливаем начальное состояние
+ k. d9 A9 F5 q+ A' [2 z - }- G' M1 J, ^3 A# u& |) k9 S. s- U1 K
j# D1 C1 h/ M9 F- // Метод для смены состояния
* q! t E% H# n* x. ^ - public void setState(MonsterState newState) {
}4 F9 I) f: m9 c - this.state = newState;" c6 Q4 R/ u$ W; J$ }+ B
- }
1 }. W4 a. V1 f A% K, n% @* W
$ i; }2 J/ i3 g4 {+ Y K- // Выполнение действий на основе текущего состояния2 ] |; v7 ~& W x2 i# e. n
- public void executeState() {
( a+ ~; Y9 i7 j - state.handleState(this);
+ J+ h- c- r! Q& z9 i' Y# E - }8 }7 ~$ e# `2 g* @* m
- - @/ q% k( a) J/ @; i, C' O: N
- // Геттеры и сеттеры+ M; l6 R7 r) l! j
- public String getName() {' c1 M, m& K4 s# w
- return name;1 J7 d; b a3 S$ o) c8 s
- }( \+ v1 C6 ]. T9 W
$ o9 b. v: ^" F! F: h0 H' }- public double getAttackPower() {
7 P8 j# n) l$ M3 s - return attackPower;
0 |1 M. [" |. s - }
( |! @- \! \: [7 B - + m. l7 ?5 h) q V; ^4 @% l
- public void setAttackPower(double attackPower) {9 N7 A# W7 G" ]$ J V
- this.attackPower = attackPower;
# }3 p# @$ R* w: b/ v4 u3 {: r; @ - }
/ P- T4 V/ p$ F2 \ - }8 R/ N7 a _. a, \( l: ^
Скопировать код % i0 S5 G# A+ {! g [& ]
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.3 S7 C5 G7 m' |, ^/ M1 \
% K0 }; {" r7 ~) N- // Пакет org.l2jmobius.gameserver.model.battle
* p& C' `% M+ s7 B, P3 m$ t - package org.l2jmobius.gameserver.model.battle;
& R# X& b1 h, U# L% V5 d* U - ; h/ E4 y! |9 P( ?$ {
- import org.l2jmobius.gameserver.model.actor.Monster;) W$ b" {9 _; A+ U: Y
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;' g0 S! Q* y$ Q: s$ }
- import org.l2jmobius.gameserver.model.actor.state.FinalState;
& T! C$ T( ] H
2 Z* f" N) d" A7 b- public class BattleSimulation {
* v( w6 @, @! E1 y. f! G; Z - public static void main(String[] args) {4 k- w6 p+ B& Q4 o, E6 s- y5 P! Z8 D
- // Создаем монстра с начальной атакой1 d. |) f+ n$ `. g2 U$ H, D/ [$ @
- Monster monster = new Monster("Дракон", 100);8 U3 b6 ^$ I$ Y2 B H
+ t- _7 ~4 i% I' Q3 c0 I- // Начальная фаза
4 s" M: [/ f1 @3 ^2 T - monster.executeState();
0 X0 r- v" Y& ]* F+ u: I/ \. N7 H. V
- o; ~3 h" Z% M# P2 P- // Переход в агрессивную фазу
6 ?! u" m3 ~, ^$ ]7 _, G - monster.setState(new AggressiveState());
5 g3 u2 j) G( S% @ - monster.executeState();3 u) {6 Q7 T' g8 P e6 P
- : Y1 L+ h! B- l' |
- // Финальная фаза8 j* m: A, F1 d0 f# ?' m$ @; _
- monster.setState(new FinalState());/ l' k$ f5 g# a. m+ I( P
- monster.executeState();- m' W0 X* l6 I7 `# h
- }6 C& i. L! i0 |6 o, X, u
- }
, _; e/ [$ u5 B6 E, z
Скопировать код
! @6 ~6 ^( \8 Q( [) {0 LКомментарии по структуре пакетов и классов:' G6 ^# q% L3 [6 }7 W' s' k
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.' n, S% O9 S) x9 x; i' K/ X
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
+ \7 C: G+ P3 D5 _' UЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!& T2 v5 I' I' V: |
4 v w6 T* m( g& u! M- ?
0 r- u2 z; N& P' b! ]
/ h7 b" p Q3 y5 @3 w
) c" y) e7 @2 r% R) X5 ?3 G) c d$ r6 a7 Q
+ k K3 S! s2 e% {0 W) P
}0 ?- m- [5 F+ S" X" }# Q
2 B8 X: E5 w m! L3 y) b, F
+ H, i1 a. I% s$ o. k6 l1 K* u
7 ^" G) K ]' Y6 T, n" n! [# F7 r' C; w2 \+ e$ b
1 R. `8 F: G3 }6 T' K; ]+ B
! L& L7 a0 S9 V8 e% F+ P
0 z9 J4 P! k! q. V |