Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
8 `) |' [3 e. _0 V7 C8 Q9 f7 W- z7 Q% G* v$ v! C0 \
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.7 D( I5 W6 X$ k' @' f) }. M, D7 W
$ V/ q3 J1 \0 f1 S5 s5 ?Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.$ c+ |* m2 m. d
8 _7 w f, z2 ]
- // Пакет для состояний монстра$ d' j* ]& L" F9 R( f
- package org.l2jmobius.gameserver.model.actor.state;
3 n5 N9 I" {; G/ s" l* y& \
# Q2 V8 p- a1 g5 h$ s4 f, {9 a- // Интерфейс, представляющий состояния монстра
) t% i3 j9 Q5 K4 }) b) p - public interface MonsterState {
7 O+ a! B5 P. y3 z' I* F$ E - void handleState(Monster monster);
( _1 f3 V/ \& r% w/ Z - }, M& L1 _* q! L
Скопировать код % @% K( O1 e% V5 r$ p- y X
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. * D) p8 i) Q( j9 B9 @* ~8 ?
2 m7 v3 ]8 R$ F
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.+ g4 ?. s: s) g3 y! L- y- Y$ r
4 }2 Y- I) ?; FКласс для начального состояния монстра:+ w) s( _; J p! h6 o
- // Пакет org.l2jmobius.gameserver.model.actor.state
9 X& v1 q' e/ f( Y$ }" T- t - package org.l2jmobius.gameserver.model.actor.state;) s0 R( j7 f# M5 ^* v8 P
- & U, t, J2 T/ |: N8 |* L" ]6 c
- import org.l2jmobius.gameserver.model.actor.Monster;
" y, R! h6 v* N1 Z. l
, d) ?% P8 O( |. c# F% D8 W- public class InitialState implements MonsterState {
( n$ c0 \' t' i( s5 x - @Override: A) f' h% C0 t
- public void handleState(Monster monster) {
. C0 X8 ~" J& } ^, k8 L0 j3 r, S - // Начальная фаза боя7 e" n* w! o. I6 u7 Z
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");& `# i. v9 t9 c9 k
- }; H9 c5 S( {7 s& K) g
- }
, Q% b; O$ |( ~) J4 m) F$ L- i
Скопировать код Класс для агрессивного состояния монстра:
9 v/ ~" J' {, e6 S4 n- // Пакет org.l2jmobius.gameserver.model.actor.state6 q5 X: k5 o0 @3 e
- package org.l2jmobius.gameserver.model.actor.state;2 d* b3 F o) ]0 |3 @; C0 [
- . _6 V4 ]1 }5 R; I8 ^6 ?5 c" G9 A% d) a" V
- import org.l2jmobius.gameserver.model.actor.Monster;
0 q: p( E: m& s$ @# ?+ H# ] - ( e- L8 p2 N( q. _- N" D" b( n
- public class AggressiveState implements MonsterState {
& c0 j7 H7 `0 |0 ] - @Override: e5 ?2 h# e& T, v
- public void handleState(Monster monster) {& x- V) s" E9 K0 |1 w
- // Агрессивная фаза боя5 d+ m6 p+ d4 h/ E3 g' k, y
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
) e7 @) ~3 @" z8 S8 ~' ? \/ @ - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки& g1 k3 i" K8 u; r* L# ^$ m, H
- }
8 g* v: L( [) |# ] - }
8 O) l& U8 X* D* r
Скопировать код Класс для финального состояния монстра:
6 O; m2 }" [5 f& v; T- // Пакет org.l2jmobius.gameserver.model.actor.state! b2 g2 {) v% _ K
- package org.l2jmobius.gameserver.model.actor.state;- J1 I3 d- {6 N' y
- . `; a* i% j3 d& i( j& R
- import org.l2jmobius.gameserver.model.actor.Monster;
/ b# }+ }! s% i7 p5 J! r. T - 7 E. D0 B8 B3 _2 N6 s; [) m1 r, K+ Z1 ^
- public class FinalState implements MonsterState {* t/ l% Q# }$ E# I I) B
- @Override2 w' U& g9 S) ^7 O, |8 n; t1 L* K& @
- public void handleState(Monster monster) {
0 U) W$ `$ h( i - // Финальная фаза боя
4 a; s0 T- I2 L5 c' y4 m4 q. X - System.out.println(monster.getName() + " готовится к финальной атаке!");2 k% ]$ s! a! u. Z/ p5 q- L7 d
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
& N2 x- n* k( v8 F$ p7 n1 { - }( Z/ c: t# }5 l6 Z7 e
- }
/ _7 h- v! ?2 L; R* a
Скопировать код + |$ R7 K9 [0 s" L1 q
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.; f$ a3 E. [' p% H& R8 H9 n
- // Пакет org.l2jmobius.gameserver.model.actor w* H' i/ f) `5 \+ b: M
- package org.l2jmobius.gameserver.model.actor;; a R ]* I' G4 B6 J- o
7 n. Z1 y6 W$ d/ _' g# ]- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
% `8 c: a- O, ]8 {+ S7 Z( ] - import org.l2jmobius.gameserver.model.actor.state.InitialState;: z8 i! a" r9 e) _) H
, k- h- ]& _. J5 g$ r: T# ?3 |9 J4 _- public class Monster extends Creature {
* q% t8 e$ o: ~% a) f# W9 v - private String name; G8 }9 ^4 V" e
- private double attackPower;
/ u& ? v& g1 S' h; f2 N - private MonsterState state; // Текущее состояние монстра
+ T3 j* @' y# ~8 @" l0 h, Y
1 d& [+ V3 U+ E% ?9 U0 ?- // Конструктор монстра
% v3 T8 s; A* A. o$ _- N - public Monster(String name, double attackPower) {2 q2 {- Z0 g$ u* T! Y% J Q3 A
- this.name = name;
) R7 M' T% c) i; T- Q9 v - this.attackPower = attackPower; f3 e4 G$ y& {% U& Z5 t- K: N8 R
- this.state = new InitialState(); // Устанавливаем начальное состояние
, j0 s# a# ~/ Y2 I4 V - }; Y: e v2 i% S* [, l0 |
- R( \* M$ K: U7 t0 E+ K0 ^: A
- // Метод для смены состояния
" Q2 h. |; Z ^( G4 X Y/ K - public void setState(MonsterState newState) {
; Z" A( U' x q* P8 R: Y7 I9 |) L9 X - this.state = newState;" E7 ]& Y3 J' J4 b) w3 |
- }
# ]. V' }/ n* R4 {$ z - % r1 \; T# A0 B
- // Выполнение действий на основе текущего состояния+ W- p3 Z9 ~ k) Y l: {7 K* p
- public void executeState() {% V6 l+ R8 Q0 M( F
- state.handleState(this);9 \4 c5 e: z) G/ J
- }# ]+ s1 R4 i5 g e. n
+ Q/ u4 A: I4 q9 S4 t- // Геттеры и сеттеры
6 j6 K) P! `* P; g5 a2 u - public String getName() {
+ h9 H/ G9 q! ] - return name;" Z1 f6 ?, F: c1 ` X; c
- }3 m4 |" Z9 a) @" }* Q' q- G
- ) A7 s( c9 i0 V/ g
- public double getAttackPower() {. ]8 h7 ?2 \, T' g
- return attackPower; o# T& d* U) P% @2 O( {
- }- P8 H& `( O( \
* v$ \2 L& T% J+ R4 v0 V1 ]' c- public void setAttackPower(double attackPower) {) U. D/ L. B* h% K! G+ i
- this.attackPower = attackPower;
# C, `5 A+ z$ T( ~+ L% w - }% h; j$ s1 v6 l. ^# f
- }+ W, d: z6 [9 r: z1 F# Z& o: v
Скопировать код
5 V! R' Q5 Q, T$ \" VШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.3 S5 U" D1 n; A9 h# q
; M7 Y/ f: N1 s W" O
- // Пакет org.l2jmobius.gameserver.model.battle
+ ^5 p" B' ~5 R& v L - package org.l2jmobius.gameserver.model.battle;
# l* T" s h2 g5 M5 k6 L
A3 x, \4 U1 ^3 C% b- import org.l2jmobius.gameserver.model.actor.Monster;. ^4 r: t* p( s' X6 N8 z
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
, N! U; _! W i2 g+ X* q - import org.l2jmobius.gameserver.model.actor.state.FinalState;% F- Z- r( \# [1 ]7 ^: q
- 1 O1 v* x% H; t% B. b2 F
- public class BattleSimulation {9 s" x3 n. C5 |* ` U% @8 x
- public static void main(String[] args) {
1 z9 X' j$ B7 N. g8 G: D - // Создаем монстра с начальной атакой! l8 o4 [4 [. m* w$ \& x/ M
- Monster monster = new Monster("Дракон", 100);! f( w: U# S& q; i* S* C
' F4 H* r* g1 B( @9 b K/ N- // Начальная фаза; @" y& X/ g2 `4 X" V- z4 |
- monster.executeState();; y9 M/ s$ ~( @2 ^
5 g7 e/ h4 P6 w6 X; R/ p, }- // Переход в агрессивную фазу" b: @- C. ?& W% e
- monster.setState(new AggressiveState());
+ [% m, T& M2 q, Y - monster.executeState();
$ [! X" W5 F5 E9 r
8 T) C! r" W; X( q2 f6 D& Z; G# H8 V- // Финальная фаза% R4 G( s/ n8 R6 A+ G s
- monster.setState(new FinalState());
: l7 @) c: M& ?7 m0 V; E0 K - monster.executeState();, a( C, o2 ]" i& n
- }/ B/ J: M* b4 [/ ^4 H% [- t
- }7 l, o( b( ?: o: J9 n3 Q
Скопировать код ; Q9 ^- K' N! Q5 ?. y% w- L
Комментарии по структуре пакетов и классов:
+ P' ?) E# L+ E3 I5 j1 [- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.% J, B$ R5 x7 p& D# a- c
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
- ?; W( R1 P& i! oЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
' ?3 h" x4 z* I8 j2 ^
/ p U+ j7 l1 w `: R7 E7 M1 ^3 i, u" v. m1 k
0 V# K5 b: ~5 w
; V; F% R4 G' K$ g2 f3 [
" V5 I$ v0 b2 @& a0 E' j* ~
- z# _3 K2 ]/ m& k- R
% o- ]9 L( D0 h1 u( ^
^! L4 k, Z E& c/ c
* S0 C- O2 e0 M% E0 c7 h
$ }: M, \7 y+ n; R* x; k* I: s* x* z: i9 R3 u9 P W* O
% `" E2 }* k7 `; l9 P
2 B2 G8 h1 j3 U
3 E. K4 _ D4 H# g+ D4 v |