Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). & F) s! v" _6 h7 X v/ v: e. G0 C
/ i+ b, X: |" {6 k5 O
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.. G* M" b' \+ O2 g0 n4 B2 k
3 ]7 v5 }* m. }6 Y5 y. d U
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.+ d! f3 }6 p4 P$ U/ f' l& ~' c
7 l; c. l8 C- P# t$ d- // Пакет для состояний монстра# D% W4 M2 g+ {
- package org.l2jmobius.gameserver.model.actor.state;$ {% P4 j+ c8 i1 x6 d+ M- `
, M% t& [+ o% k0 B- // Интерфейс, представляющий состояния монстра
- U, `5 Y6 x% \& t* l1 t7 `6 R - public interface MonsterState {
, y8 E, S$ j; r& ^ - void handleState(Monster monster);5 _( h; h- K# K3 F( @5 J* r
- }, E3 i9 f3 B; r3 ^7 l! v
Скопировать код
" A! g. k8 l! JШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
- p. K$ v6 h1 P6 G% d4 {! _ c& K; q6 S1 _0 A8 M) K0 i* p: a
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
+ ~' _* @, _9 {# k2 } N
7 W+ |, o" G" e; A7 G1 _; TКласс для начального состояния монстра:$ Q* ^7 l# v$ E( c
- // Пакет org.l2jmobius.gameserver.model.actor.state
3 y( s/ d! G8 _3 H& O8 {8 a* I9 \9 R - package org.l2jmobius.gameserver.model.actor.state;8 h4 p' o9 @( Y* D
- * W6 Z. S! i: ]' z
- import org.l2jmobius.gameserver.model.actor.Monster;6 d+ \( i, I' b) v, \3 J7 m
- * z, o+ M/ f: Y6 F0 [1 b& t
- public class InitialState implements MonsterState {
" i2 c9 m) \: a0 E8 p5 s - @Override4 T2 O5 A) ?% m' a- ?! ~
- public void handleState(Monster monster) {% L: T4 O% ?1 U8 `8 t
- // Начальная фаза боя
7 W6 z( e1 z7 E+ f/ r% x" U& \ - System.out.println(monster.getName() + " начинает бой с обычной атакой.");& @: S/ d. B) g- B
- }6 U+ f4 i! ~( {& T) M
- }% _* u6 I% t1 q; |; n4 ]; ~
Скопировать код Класс для агрессивного состояния монстра:
/ M# c& i9 @0 x) `- // Пакет org.l2jmobius.gameserver.model.actor.state# t( y3 [3 Q- M$ G
- package org.l2jmobius.gameserver.model.actor.state;3 W8 Y5 a/ i: r" E. Q% G: c, L
" Z3 e3 M" @' o- import org.l2jmobius.gameserver.model.actor.Monster;) J1 c: O1 c b$ I" T6 P
# Z/ A0 R Z V$ g3 s4 J3 T# M- public class AggressiveState implements MonsterState {
) P( Z1 R9 x) r6 J2 ?, q - @Override
% e- V( r' Q- U - public void handleState(Monster monster) {) t1 X: }4 v# k2 X7 X* O6 F5 |3 |
- // Агрессивная фаза боя
/ N( r% M! J5 g \. q$ \% x - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
4 N7 ]6 T% H3 s9 Z - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
* ]4 k+ t( J2 h4 r! v2 Z+ p7 y - }2 G5 [5 N0 I4 `- B
- }. U% A7 I# @# h" U/ I# z' N0 w, C' T
Скопировать код Класс для финального состояния монстра:8 c/ o7 y2 G4 {, X* u. a
- // Пакет org.l2jmobius.gameserver.model.actor.state' Y6 q; J0 a) g* |, v0 |
- package org.l2jmobius.gameserver.model.actor.state;
1 Y! B$ Z* U* x) G! ]( N9 m - ! e, i4 p- ?! e5 `6 B* T3 D
- import org.l2jmobius.gameserver.model.actor.Monster;6 x2 _4 g2 a, j+ N. }% H
! T/ i: J9 a9 A# f" H, V3 q: H- public class FinalState implements MonsterState {! \& L. s$ k8 J6 k k0 l
- @Override* [ J6 A0 @0 U: l$ _# |
- public void handleState(Monster monster) {2 v- k! p" {( [4 m& G
- // Финальная фаза боя
) D1 D% v8 m% \% g; [1 { - System.out.println(monster.getName() + " готовится к финальной атаке!");
5 K+ o" z6 j- a - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки3 Y7 d* R9 f6 ^* L
- }7 F8 B' g1 m- o; w L+ J$ |
- }0 J: H/ `8 H, Q) |, r0 h! r
Скопировать код $ r" |2 _ I! X7 R6 m) Z" ^
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.; g) m Z: X7 f8 E# c! N
- // Пакет org.l2jmobius.gameserver.model.actor
( x, `7 X Y' ?( U0 E8 ] - package org.l2jmobius.gameserver.model.actor;( ~- V1 M3 m, y; t% u
7 o% Q: ~5 w. [* Q- import org.l2jmobius.gameserver.model.actor.state.MonsterState;0 {) d) X6 c/ |+ G% f7 Z- D
- import org.l2jmobius.gameserver.model.actor.state.InitialState;* F" q) C, C5 T/ X6 \4 G
5 ~# j# |$ T' J- public class Monster extends Creature {
7 r$ w! N9 [( M - private String name;; ?; t: v0 @. ^+ p( {; A" } x- m
- private double attackPower;9 o, S. O# c* o8 s8 a: L6 t+ ?
- private MonsterState state; // Текущее состояние монстра* a h4 T* w; l; L+ w4 C( j3 i
4 ]7 W5 t1 ~- K+ X) U! z! G- // Конструктор монстра
) e6 A' F( b( c# u4 o1 Y - public Monster(String name, double attackPower) {: z( p. O9 i, Q
- this.name = name;# v6 h1 `% Z. }' x; L( j
- this.attackPower = attackPower;
3 H: D7 t( }) F3 O - this.state = new InitialState(); // Устанавливаем начальное состояние! B* @5 K! w' ?9 t
- }
' q+ B+ z; L5 v# u
; u8 K; p! ]6 b9 @- // Метод для смены состояния) I3 v/ K# u7 @: C' H- D1 V; q
- public void setState(MonsterState newState) {/ @8 g8 S. u& X4 o9 i) q) K5 {
- this.state = newState;2 p- [3 m: q v+ K, F
- }
8 ~ b* I- v3 G0 f - 1 X8 A/ I, M+ j. m3 P8 k
- // Выполнение действий на основе текущего состояния
6 f+ W2 d) m: T) ~% Y - public void executeState() {+ l0 `: A; q8 K1 x, c
- state.handleState(this);
- w8 y5 G- L6 I: f - }8 v& A- N( H( _% a$ U+ y7 I" P
- $ C, k* l$ L0 G: @2 g7 F% h: |
- // Геттеры и сеттеры; i: u5 [! x& @
- public String getName() {
# S7 q- W5 X( K - return name;
0 U- w3 X' M- {. u - }
D$ x) x5 S/ c$ J! y) b/ {
6 J/ d2 {3 m! [. i% ~* Q) ]- public double getAttackPower() {4 ]5 Q% f! B% o
- return attackPower;. E+ C) M0 c2 }/ v& Z
- }# E, d& l; Y' R" c- R" n1 y
; h" V9 c' N; k) A# L- public void setAttackPower(double attackPower) {
& v+ j" P9 g) z3 I5 b7 i - this.attackPower = attackPower;
7 z) E" ?$ x0 s7 v - }- k$ A4 T. ^; ~& B5 b: O" t
- }* T& D$ H# r7 J; ?' H/ \
Скопировать код 7 f8 _$ }8 t ]5 R- w- O
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
0 z" g" P5 W: T% k+ J, D' e1 _8 I; v0 Y1 F* ]4 ~
- // Пакет org.l2jmobius.gameserver.model.battle$ n" H4 x2 |' ~/ F$ f$ j
- package org.l2jmobius.gameserver.model.battle;
; R: t! }9 J7 q- e6 c - 1 [+ C' d" \9 s( f
- import org.l2jmobius.gameserver.model.actor.Monster;% C6 [' y8 E& k* L( |8 V
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
* n( S3 e: W: e& d6 g$ q - import org.l2jmobius.gameserver.model.actor.state.FinalState;
* w" t* y: m, v# Y - # o$ O3 s7 n. M- @4 p
- public class BattleSimulation {
. z: X$ A9 A/ }) e9 w - public static void main(String[] args) {' {# ]0 [ r: R; D
- // Создаем монстра с начальной атакой
: o9 x6 p0 V; K' {. h8 S) J3 W - Monster monster = new Monster("Дракон", 100);9 \& P# x# ~! R
- % R2 h2 K$ U4 I+ c$ |
- // Начальная фаза$ p) B4 N6 C2 f" X/ T' R/ v! v
- monster.executeState();& l2 B9 j! V7 }- E
- & r8 ^1 r5 C) E5 D8 @$ j; g& ]* S9 ?
- // Переход в агрессивную фазу
1 W. T+ H! f; P$ ]$ \ - monster.setState(new AggressiveState());
$ g2 G, r# }* o5 A6 B$ h, U8 ? - monster.executeState();1 ^! o; n, h: D$ u
- - l! }3 M- U' [: w* I
- // Финальная фаза6 h# d) w' ]' u! ]6 |
- monster.setState(new FinalState());9 _7 b2 D! ~' ]8 I" K- W
- monster.executeState();
, R }% \7 J0 h& g/ i1 t - }
+ ~3 a# i) o! s* w% u x - }
2 M5 A4 k$ @; p7 Z M$ g! U
Скопировать код % m9 x1 o1 c$ t1 t$ u
Комментарии по структуре пакетов и классов:( C, a9 ?. ^1 U" x8 g% f3 k
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
0 g, i- Z; D7 A ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.) d- B7 X8 Y! H& u4 R) Y8 Y
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
4 s- x$ s- }/ |3 c* e/ U, y& G- ^; S
& m3 o! t( o& }8 z, l# }+ x7 z
4 J: P. f% _" f, R7 k
8 \+ Q* o% \- n# y
& d1 G# ]. \" ?+ R3 d6 l. v d
* A u6 k7 C% {4 z" g$ t& F a& _% d3 H! j/ Q4 Z) v1 R* ?
3 R% ]" L* j2 e4 }% B: \, ]
# g4 y ^8 R& Q+ M9 q- ~+ `
. v7 @& Y1 Q- W# }3 q
# H0 Y# ~* V) y# q6 J
6 T' ?) ]* e5 z }! D9 h6 E! Y
6 K1 d! `3 U# X, q/ `8 u" ]5 l5 @$ S6 v
|