Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). " l/ O3 A" o) ]- L3 `6 w
% }: C7 W$ k B
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.) A) i0 l$ {& \, Z0 X9 N) n, m
* `6 ~ R4 V' ~5 ~Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.- z+ Q/ l- d' D
. l* U3 X* W- e' M$ p* A6 I5 f
- // Пакет для состояний монстра2 M d) x8 s! a; @; E+ T
- package org.l2jmobius.gameserver.model.actor.state;
; n5 N! E4 S$ N( _* ~( ^' T - ; h# O: _$ v$ x& S) p! t8 z
- // Интерфейс, представляющий состояния монстра' U, r- t E$ ~- L @9 C7 @/ C
- public interface MonsterState {
8 f( i- g! ?$ U2 v' b' b( Z1 K* @ - void handleState(Monster monster);
% F2 O- w" E: a' V - }
/ X( d( y# Q- v4 |( z9 ~
Скопировать код 1 \' j0 }9 u0 _* z! J: N$ O) ?5 |3 U
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
1 ?; C) Z3 G4 A* m: t; N
# S6 ?8 O3 {& R- P* S& xЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя./ d9 N) {8 a5 \6 Z; L
# d' r$ h* x& o `! o+ G
Класс для начального состояния монстра:0 A" s" Z* N$ G& S+ `$ q
- // Пакет org.l2jmobius.gameserver.model.actor.state
4 _3 F: f8 z5 S1 J+ s$ L' X& P5 F - package org.l2jmobius.gameserver.model.actor.state;
' z- O2 h( I3 o p5 Y - 2 A. M! J: D6 g6 p' Z) `+ l! }
- import org.l2jmobius.gameserver.model.actor.Monster;% J- B+ y( V% a& L: {8 W1 [
! U* }" C: w+ W- public class InitialState implements MonsterState { e6 h/ O! Z3 N9 ^& P
- @Override. Q' q* ]* z: w& X/ e( N v$ S
- public void handleState(Monster monster) {
4 N: S4 M2 D$ g' d) u - // Начальная фаза боя! d3 O% X! f2 @. P, J
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");- e* J' A2 _1 Y, t
- }6 Q1 X1 Y- C/ ^+ G# U9 e
- }( p: p p9 b$ i$ m6 j
Скопировать код Класс для агрессивного состояния монстра:
. e# ~3 m& D9 h& d1 K- _- // Пакет org.l2jmobius.gameserver.model.actor.state
& t% _3 i& |& q! {) I; m - package org.l2jmobius.gameserver.model.actor.state;
6 g3 u- P# X; t0 a- w5 I - 8 \. V3 l6 B0 D2 S. H2 ^
- import org.l2jmobius.gameserver.model.actor.Monster;
0 h0 C, Y) A6 O( Y8 P
2 T: u9 ~+ L2 L" y- public class AggressiveState implements MonsterState {
% O: [* J: s( R: X - @Override
8 I- O. u9 }7 `& z - public void handleState(Monster monster) {$ n' I- |& \$ \; d% g% t3 d
- // Агрессивная фаза боя+ v+ r4 F$ C" x- `3 ]4 x% b
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
$ X! A1 A2 r9 z7 o& L8 n5 N - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
% n" ?0 z( B6 _& \+ e' u - }
, K, ]: x) X+ {, H - }
0 n; s" A2 v& @
Скопировать код Класс для финального состояния монстра:
4 U& r5 s* n" p: E" ?3 q+ [ o- // Пакет org.l2jmobius.gameserver.model.actor.state
) U6 H% ]! G- T5 r9 h7 |# q - package org.l2jmobius.gameserver.model.actor.state;6 P$ ?3 v) N' c* l* b
- , M/ P6 M3 i4 J& F" ~( F
- import org.l2jmobius.gameserver.model.actor.Monster;
" h1 v3 }- N# ]/ Z7 x4 s" ~2 g8 z - # T6 A8 @" g$ @9 Y
- public class FinalState implements MonsterState {
" q+ ]) e" O: h3 Z- { - @Override
- E1 u! b- L4 f$ h: f0 b c - public void handleState(Monster monster) {
% B8 _% R+ h. Y E3 T$ g - // Финальная фаза боя
$ P+ K( K% O/ m2 j& Q - System.out.println(monster.getName() + " готовится к финальной атаке!");- W% I: Z, q9 r. ]1 H
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
, t1 j% A9 ^* X9 K# i - }
9 d, a' F, J* G( P - }
9 p. k) g- ^' H! r4 _$ y' z! F; n W
Скопировать код
, N% g2 |: C8 H7 u/ CШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.3 Z) n1 g2 e, R& t9 q4 r6 B
- // Пакет org.l2jmobius.gameserver.model.actor
7 i& u- x' f. E6 Q4 {- q/ f - package org.l2jmobius.gameserver.model.actor;4 ~ E7 h' |& D; q4 D7 }
% f! ?# I. z% w# }2 o' O) ~! b- import org.l2jmobius.gameserver.model.actor.state.MonsterState;- i# m6 D* z4 ^0 S
- import org.l2jmobius.gameserver.model.actor.state.InitialState;1 c5 L( w* i' D
8 P. i7 q$ O* r9 i2 Y' S- public class Monster extends Creature {3 Y6 V5 O4 q! e$ ~8 J1 P/ x- V
- private String name;
4 X1 y/ ^9 K+ S% x - private double attackPower;
5 a9 Y8 \: u7 I - private MonsterState state; // Текущее состояние монстра: z8 N5 f9 c: n' U$ f
- % q0 a: M5 K k+ b
- // Конструктор монстра
& W) D4 P: p1 n! m8 V( x0 d3 ?8 U - public Monster(String name, double attackPower) {
$ ?* x2 {* Q& x3 }. `3 m! N/ i$ I - this.name = name;; D4 o. T$ v* H: X# n* `4 p. o
- this.attackPower = attackPower;" u9 T1 y. g8 Z/ j* D
- this.state = new InitialState(); // Устанавливаем начальное состояние
: o& X" i1 \! A' O, U% ^. A, F - }/ s( F k& m) J' B6 @6 `. Y" ^
2 O/ f: B. W; m7 [3 o- // Метод для смены состояния& |- B# J3 K( |; S
- public void setState(MonsterState newState) {7 J$ T' ^/ j2 h2 |4 v) v+ c
- this.state = newState;
6 I! k! [: G0 f! z {2 }3 Q - }+ i5 z6 U7 |) t
7 S/ x( J) [. y1 z+ p2 X i q% {- // Выполнение действий на основе текущего состояния
! H A2 o% w! E6 Z/ H/ X0 @ - public void executeState() {: }5 T- U3 A$ v) u/ @" U) I
- state.handleState(this);
5 _1 r b' N& w3 d - }" I3 [7 d. \% `# \0 {- o, W
- ( e/ v4 R+ r/ e" F$ @- J j3 i2 f
- // Геттеры и сеттеры
q+ ~* Z# ?6 |! F3 S - public String getName() {; N7 O- N. H4 U
- return name;
3 ^8 h2 H) s( n6 P9 J' U. N0 k: } - }3 T: h5 b8 S8 Z' v- L# r
- + m6 n2 \% t! M7 B5 C' r. C9 ~" A6 @
- public double getAttackPower() {
* R( S& H6 s K3 W8 R - return attackPower;
3 @: b" L$ f: y/ R' t) Q. c - }
9 {& `6 V) _4 I. a8 n' v# ?
' d: r T+ W9 g q4 b- public void setAttackPower(double attackPower) {
, L+ U9 `2 K* V/ }5 y8 H; K - this.attackPower = attackPower;
a2 D( E+ P9 q3 q; W0 ?' U - }
( [" h: p% \. L! f: | - }
0 i5 D" B+ S2 q% ^0 K$ [
Скопировать код
0 U+ Q/ I- ]0 d# l4 [Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
0 I; N, L' p* V m+ K. p- \9 Q
% |+ W' z- C! A) q- // Пакет org.l2jmobius.gameserver.model.battle
7 R6 x) d2 Q0 b8 o: ^( c) y - package org.l2jmobius.gameserver.model.battle;
9 | i9 U* ?" Z Z/ c! |: q
. y. K: }; ?1 E e" Q- import org.l2jmobius.gameserver.model.actor.Monster;
# Y8 t4 r! ^ M9 Y5 c* U# p - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;1 u5 Q$ L W! k
- import org.l2jmobius.gameserver.model.actor.state.FinalState;
& R& w7 W; ^) \
+ P1 B- P, R& p$ x- public class BattleSimulation {' y. ~# ?, P2 A1 u( c
- public static void main(String[] args) {* W# ?+ v* v$ A3 x; K1 Y
- // Создаем монстра с начальной атакой
% Z7 e, A+ _! [! N - Monster monster = new Monster("Дракон", 100);
9 C7 ^5 X! r p0 d& t4 H - # [1 c( Q+ I/ v& Y! S; \; C/ z! e
- // Начальная фаза
/ J9 P, k2 n2 r( ~5 {/ \4 H6 K7 j - monster.executeState();' }: z7 @8 @$ @% t9 j
- ) ~3 n# K5 Q0 p
- // Переход в агрессивную фазу
: c, s: r2 l1 b: k - monster.setState(new AggressiveState());
" a$ F/ p! u% R( m& q4 _ - monster.executeState();9 o% \* i. E5 u
+ x. Z# k5 V! d; z b7 X& E% c- // Финальная фаза
6 v0 _( _* J K4 s% ]4 L) A - monster.setState(new FinalState());
' s8 p c2 L8 t& \) Z; ?! N - monster.executeState();0 E; _# T7 N5 f l/ }
- }6 g5 C0 i; t# K+ z; J7 q( V
- }' N, y! x0 s- G8 Z
Скопировать код s5 Q- B+ p" t/ K* i1 L3 f
Комментарии по структуре пакетов и классов:$ D o: E" Y2 ?. N8 U) w) x( L3 r
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
3 j6 t. E% k( ?3 T ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.. {8 r3 B9 `& y; A$ Q* H: Z
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
, ]# ?; e {9 h n8 R8 A. w7 W L: I! N3 s- ~
' Y' ^' j0 e; h! y5 p- P: z2 R2 t. Y; X X; X: T
& L3 L4 |, r: V6 W! q
5 m) x& S8 f/ u
" P, y0 h# M6 g3 I4 _4 P, M- `5 P9 M7 q& x
& @6 _9 g/ `1 ~
- g% G, k. V8 G, B1 U
& T9 E3 C+ f, v7 |/ X+ d
9 j7 P4 ?7 C$ X9 ]& b/ a7 i8 Q5 n+ ?5 `3 o( s8 j
" s% r+ X* r! y2 ]2 x! C) `8 S' f
|