Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
9 Y( m. g& ?8 j3 m8 X- f
# U% s: C' b$ BЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра./ S- K2 u/ f/ t# O- L
# q {6 ?: }% dШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
3 l( L2 F9 f' K6 l8 j; Y7 I6 k f$ ]5 `5 u+ A2 r) n# Q
- // Пакет для состояний монстра n/ n+ G7 H& Y% Z5 `
- package org.l2jmobius.gameserver.model.actor.state; W. S5 W% P6 }
8 ?3 M9 u6 P6 E* X. Z$ e9 s5 V. j- // Интерфейс, представляющий состояния монстра
1 Y( r' w( ~5 o& z( a" M - public interface MonsterState {$ ~; X; ~7 a# Y# ~+ ]
- void handleState(Monster monster);
7 [$ t) h; | r0 S - }! q) J8 U/ p A7 T( Q' m- v+ I
Скопировать код
, I) @8 N9 X5 l1 z. A) u3 BШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 2 |9 p }5 u! A' z c
! u2 i- `3 p2 h' @0 e9 b
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
5 n8 Y+ C$ n; W0 ?$ Q8 t; }2 V" P5 k* f2 l, h9 D6 {, D3 d7 L
Класс для начального состояния монстра:, R" t h1 e2 u8 q8 q& D
- // Пакет org.l2jmobius.gameserver.model.actor.state* D- w! J" z! `4 ^
- package org.l2jmobius.gameserver.model.actor.state;
- _. V" \% H8 L$ ^8 S' N7 I& t9 f
6 K* L8 V4 F2 L. p9 \- import org.l2jmobius.gameserver.model.actor.Monster;* O1 L2 r, y" Z/ D# r; q( d+ U' A% v
- 0 v$ o) l4 u7 s9 ~) S
- public class InitialState implements MonsterState {5 |" X4 P' ~9 Q' `5 x
- @Override. G' B# v1 a: s. D' ?, k
- public void handleState(Monster monster) {2 B4 k A# s R# Q' }6 K1 M
- // Начальная фаза боя3 F8 Q6 r3 P4 r0 B+ s) x
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");
) F- P$ u s) r* x0 y* Y2 W - }
/ ^1 V- c ?9 n% G5 Z% ]: q* K - }
0 k. b2 T% Y* W M
Скопировать код Класс для агрессивного состояния монстра:' A6 {# m" I2 n9 ?8 j
- // Пакет org.l2jmobius.gameserver.model.actor.state, f( e7 L+ p4 T1 W
- package org.l2jmobius.gameserver.model.actor.state;
* E ~# F) A+ k* d) q7 @ - ; u6 N5 I, w: b( d- \2 T
- import org.l2jmobius.gameserver.model.actor.Monster;% L. {8 R* B: Q0 }8 V9 b
- 7 _* `! i8 P' c: G0 l E& m
- public class AggressiveState implements MonsterState {
8 s: L6 V; l1 b1 Q% m2 z. k* L. f - @Override) ]) \/ a' |* T
- public void handleState(Monster monster) {. \8 ]1 I- |, m
- // Агрессивная фаза боя
1 q/ f- \% W7 P+ |$ [ - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
( G3 \: w) N8 a - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки* A# o/ Q% b% k
- }4 [# f+ D E# l* K0 M
- }: A5 a5 o' y/ Z
Скопировать код Класс для финального состояния монстра:6 f0 r( ^8 O& W/ s
- // Пакет org.l2jmobius.gameserver.model.actor.state
* B' |6 x0 k% j9 E - package org.l2jmobius.gameserver.model.actor.state;, n1 P" E5 z; A T% ]
- 6 b, G( Y' O- n
- import org.l2jmobius.gameserver.model.actor.Monster;
1 Y/ h9 A) S- m+ W: T* o! \ - e& F3 ^# W6 ~' [
- public class FinalState implements MonsterState {2 H1 h6 l# G" z6 T3 _5 i+ _; [
- @Override
1 o7 H/ k, H; {* C! H9 h m - public void handleState(Monster monster) {
9 f, ?/ @9 {1 E5 N8 S - // Финальная фаза боя
/ v7 i& D" ~2 l4 D4 X8 A - System.out.println(monster.getName() + " готовится к финальной атаке!");
" Y1 Q h O( ^$ W" ~ - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
$ A+ H0 k5 ~: n. M; y& A m) U7 g - }6 T; _ _( b* i# V+ Q4 ^# s5 Y( v
- }5 B+ C: U# q- M/ h. W+ x
Скопировать код
% ?$ V3 M, v b* pШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
! p. J+ K/ k& E, o. \- // Пакет org.l2jmobius.gameserver.model.actor$ T/ a. g9 @: a5 D7 z
- package org.l2jmobius.gameserver.model.actor;9 h6 Y( Y0 ^1 x; x! G- w
$ h- E2 r0 C8 W6 Z, n+ l- import org.l2jmobius.gameserver.model.actor.state.MonsterState;' y! R9 Q( S0 y. v. K
- import org.l2jmobius.gameserver.model.actor.state.InitialState;+ ~2 k: ^3 Z9 f3 O4 c: G
8 ~- u( O$ U Q& v- public class Monster extends Creature {
) u& N3 x/ d" J+ X+ X - private String name;
9 i, y% D4 C4 R7 p$ Y" H7 z5 I - private double attackPower;
! K" Y" z* m# h$ l8 d" Y0 l- p - private MonsterState state; // Текущее состояние монстра
Y, ], w' g( U; ?3 C& X3 O
0 d+ b& B, Z9 C* L- // Конструктор монстра) ]1 T7 D6 U* y+ |+ v$ }0 f
- public Monster(String name, double attackPower) {
8 {% _% q! t, c+ z' T! [ - this.name = name;2 P0 m, l5 p1 K3 F
- this.attackPower = attackPower;
- F) ~8 A0 w3 Y/ b - this.state = new InitialState(); // Устанавливаем начальное состояние
" ~* Q% }; @& e% {" o+ z5 A - }9 Y/ C$ s! r0 T" ]
- 2 l& S+ F9 w( D& I d9 `8 o& E
- // Метод для смены состояния
/ h I, X" E% z - public void setState(MonsterState newState) {' z9 J3 o+ k# C2 v+ l9 _( M
- this.state = newState;
0 V8 r7 A" W( _$ ]! \1 x4 T2 c- V( ^ - }. W/ c# n1 x8 A! [# H3 r3 t( P
- 3 b8 y0 @ @7 h0 }8 ^
- // Выполнение действий на основе текущего состояния
% | W' x f# {: a) |& I1 H2 ~6 L7 z - public void executeState() {1 S6 q. z& f, w Q: _9 y6 Y6 ~
- state.handleState(this);& I ?: j+ {; {* t
- }3 g/ s3 E# @, i- _. O5 ~! {$ _
- % W& Y6 e- W3 U% ^/ l
- // Геттеры и сеттеры
% S8 g* d0 N+ [3 J" N2 m8 Y* q - public String getName() {
' }* [5 I/ i3 n; }; b2 W - return name;$ P8 d( A% R- E4 @+ Y. K: d
- }
0 u( g8 f+ v0 I- @: f2 i' m' u" \
- ?5 j* E% n# M- public double getAttackPower() {
$ a k4 b2 o7 Q* x/ B9 }; T - return attackPower;
( J4 d; ?% E/ c. }# e% c - }1 M; [# I% z& G% W! `1 ^4 R
- $ K, f, \* L0 e5 B2 D+ z4 X
- public void setAttackPower(double attackPower) {
: O( [5 p4 X5 Q# l) B. m* |/ p& f - this.attackPower = attackPower;
5 q; R7 H5 b+ z, a: q+ _/ N+ ^ - }" h6 {& ?4 ~6 \4 z& @5 e, J
- }
* q7 b1 k# ~- F/ U
Скопировать код " V4 T; J& f3 V9 F8 Z# {! C) {3 ?( l
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.* A5 z7 r6 G9 F1 v9 m4 P
6 o: P2 Y# B; L! U1 R- r
- // Пакет org.l2jmobius.gameserver.model.battle$ V$ a, S9 Q( y: r2 y4 j" S
- package org.l2jmobius.gameserver.model.battle;3 d5 a. m- T1 p
- 7 U2 ?& s5 ~" @6 f* A
- import org.l2jmobius.gameserver.model.actor.Monster;
0 K) K6 Z# _5 A. ?; V8 ^ - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;* a2 E1 f" F9 u
- import org.l2jmobius.gameserver.model.actor.state.FinalState;) z6 S4 f! L( z
% {; E/ Z6 `( R4 o5 G9 M- public class BattleSimulation {
3 H" n& k$ i- _- Z; h3 C - public static void main(String[] args) {. ~; Q% t" l, Z, l0 k
- // Создаем монстра с начальной атакой
u7 N/ ` ]! R, q1 C! ^ - Monster monster = new Monster("Дракон", 100);
' S- F; H( ?- o. q0 H - + J4 t7 Z4 y4 _8 ?
- // Начальная фаза
) }( ^9 |8 H; v - monster.executeState();
& p6 p2 a/ }) b( `$ i/ j - & P. V1 g8 d: U# `5 o
- // Переход в агрессивную фазу
" [2 b' s Z7 D - monster.setState(new AggressiveState());( `( ?8 W3 O' ~, v0 P9 a' U
- monster.executeState();
! a. m2 C/ g/ p - 5 j* V Q- [4 Z) X
- // Финальная фаза7 Q4 u" l& i) Z, T5 u+ }( d U
- monster.setState(new FinalState());1 H. d% D. J L* e9 `% m
- monster.executeState();
2 n* w6 e4 U6 {1 j$ x - }: G4 q" x, |. B
- }7 V3 n6 {$ v8 f! g1 q. M" S% ~& m
Скопировать код
6 I2 P7 w/ F( ^Комментарии по структуре пакетов и классов:
$ n# ^- Q' L4 e9 ]) O- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
/ y8 q! |2 T7 L# X ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
8 c6 ~5 B- A1 S) _$ S: W: B! {Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
. J2 M; m! G/ O2 _/ q5 h* s/ h* q8 y! t7 u* L6 B
/ ^% U9 o6 P- Y9 [* J
; T- G3 [: V3 `5 X6 I( m! t6 G$ K9 ~. D% ~
0 |( r% K; k6 T0 `3 t% J' E
" g% v% Z/ f M6 U
- q$ r3 ^$ F; b0 R2 m
0 t; X, w2 N4 m5 i; }9 l$ E% |1 x+ J3 O: u& Y3 b
& c& y8 Z+ ]+ A7 }& b( U
- r" I/ |) P$ M3 |9 H; I4 r' g$ s* i
: k" c9 t( l6 Q8 a: [# x; L
( x& r) c- B) @* D2 g |