Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
* H& U5 c, G% n$ ~( V1 W
0 t8 \) @+ Y3 P* b' @0 \! R1 b' ZЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
) E5 l3 d. V- H. [/ m2 o$ ?: H' ^4 B9 d* l
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
& E" t& o; g! h8 P$ @7 Y
7 q/ V$ W- z, C, L8 O0 L- ^( f- // Пакет для состояний монстра
4 {! i8 k! a* [: t0 _ - package org.l2jmobius.gameserver.model.actor.state;
3 _2 E- o$ h0 Y) C; X$ v
$ A6 [( f$ y5 ?! x7 M+ y- // Интерфейс, представляющий состояния монстра8 C3 u3 h$ w# w* E7 a+ K) i3 ?
- public interface MonsterState {2 e8 K- F3 B4 h
- void handleState(Monster monster);3 O# H5 ~9 s" M
- }
4 T" `2 g, n0 I" l, {, `; g
Скопировать код & B; K2 A# G/ J% F$ U
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 4 ^3 p3 U" r, W t4 V' R
/ q0 j3 q: G3 N3 W7 @' z2 z- O, zЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
) A& Y3 t, K; k3 v" }1 R0 ~3 ?! T9 G
Класс для начального состояния монстра:
( g* u: `* b! ?* `+ F- // Пакет org.l2jmobius.gameserver.model.actor.state
& [ [9 r9 H& }8 p1 q: [ - package org.l2jmobius.gameserver.model.actor.state;% W& t. U' e$ `% S% n/ X4 [
* a' T/ Y1 Z$ g1 ]3 U2 ^; e, H- import org.l2jmobius.gameserver.model.actor.Monster;# Q# [" T* [" F2 g
- - x8 z* f/ }4 }* x) X, X; o
- public class InitialState implements MonsterState {
/ }" x. B0 V' O4 j - @Override
0 P. K3 e0 N! _ - public void handleState(Monster monster) {
+ v, r2 {% M1 s4 A" F. g - // Начальная фаза боя! i% u! M0 q+ m$ `! s! I8 `
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");
% Y9 C$ w& C+ \4 S( c3 Z% j) u - }
) }& o- Z; S" @; G4 p6 k+ ~ - }$ k1 N6 ?% t8 W0 R5 l. M6 n
Скопировать код Класс для агрессивного состояния монстра:
: v. T0 f) h; E8 o7 W- // Пакет org.l2jmobius.gameserver.model.actor.state& V+ [- d, T& N2 a9 r1 O) g) N0 g
- package org.l2jmobius.gameserver.model.actor.state;
! R) }& R: ^+ H+ M
* d) v& c6 X3 i+ @4 g- import org.l2jmobius.gameserver.model.actor.Monster;
- b( J# ?! ^' Z' g* l: \% I
! |7 ?+ q& Z5 i& _) z* N( J: \- b# c- public class AggressiveState implements MonsterState {
* ~6 } D' r! D9 ]+ n" p2 B: I: K - @Override
. y" e& v6 I# S) U - public void handleState(Monster monster) {
; P1 L& ]5 o! h7 u/ C2 r4 ?9 W - // Агрессивная фаза боя
' a5 g3 h* ^! W( G% S9 P - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
. H5 H* r: R( {6 |8 X2 t6 V - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки# m! h- O/ F$ x+ w, F7 m- }9 ?
- }3 j3 e: m7 ^0 F3 D
- }+ u1 R/ r* S# P. T* ~6 d
Скопировать код Класс для финального состояния монстра:
4 n* y3 F1 Q0 k. e) s3 x9 \- // Пакет org.l2jmobius.gameserver.model.actor.state) o; X4 q. U+ K7 T% g- H
- package org.l2jmobius.gameserver.model.actor.state;6 {: Z3 W5 `9 Y
- & m3 e1 @2 a! e; D
- import org.l2jmobius.gameserver.model.actor.Monster;
: \7 v' X7 V* W3 Z' i2 ^ - , U y0 Y0 l! X1 P; z
- public class FinalState implements MonsterState {8 z r! @1 P6 R u$ m7 L
- @Override7 N) y3 J: B6 F5 d1 V
- public void handleState(Monster monster) {! T- S( W6 c9 \2 j
- // Финальная фаза боя9 x! p7 ?+ A/ w+ g# ?4 @
- System.out.println(monster.getName() + " готовится к финальной атаке!");
5 o- o- ]$ \1 C/ z0 s" p - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
; R( t& w1 F6 i' s, a - }
/ I, T" `/ p$ V" V' q. w - }$ W4 Q9 u" \% C
Скопировать код
$ K& p; {) C* [Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
* `) `: t% W6 w/ P& @, r$ o- // Пакет org.l2jmobius.gameserver.model.actor8 M' e7 r& G) Y3 _
- package org.l2jmobius.gameserver.model.actor;
' j$ m8 p% V' [2 l
+ f- u* [: d4 s( m" C- import org.l2jmobius.gameserver.model.actor.state.MonsterState;( w3 h; p5 o0 Z3 @" F: c9 b/ L
- import org.l2jmobius.gameserver.model.actor.state.InitialState;' E6 k+ u5 u2 }0 s
- p& }8 [8 U, o7 S7 e) c- public class Monster extends Creature {
+ A; G' }4 M% h a/ h' @" F - private String name;: T8 C h$ v$ p9 B
- private double attackPower;$ V2 f- e5 I4 W6 ` R- y, ]8 J1 k
- private MonsterState state; // Текущее состояние монстра- A8 ?2 [+ i: l% E* Q
- " h" @' L7 z. U) Y3 _% f
- // Конструктор монстра
+ p8 _2 f! T" c$ { - public Monster(String name, double attackPower) {
: A8 y1 A1 \+ u - this.name = name;
; c$ E0 t; g! Y- n4 b3 ?; Z' o( r2 P c - this.attackPower = attackPower;6 L' c6 f H+ p% v+ f; I
- this.state = new InitialState(); // Устанавливаем начальное состояние
. s" E3 E$ E, z8 L$ h5 ?( J7 a - }
9 z/ D$ q# o ]9 c
1 r, [; x3 |: z% [( C6 N/ s- // Метод для смены состояния- [! R, e( b6 R. r$ \8 H
- public void setState(MonsterState newState) {1 i/ Y# z9 u# P1 J) h4 I
- this.state = newState;
! ~) N7 `$ V" ~( H - }2 X& i. m$ G' `) K& N8 n
- ( l i* N5 G2 J7 z) g* d+ w
- // Выполнение действий на основе текущего состояния
7 }& X; D9 s: T - public void executeState() {
. r* r0 k2 e6 `- c6 {* B3 a3 R: d - state.handleState(this);, n" O$ ~3 K$ o* C5 A
- }+ Q' V6 _! |7 b
- / p8 a: j$ ~" q; {/ k; b
- // Геттеры и сеттеры
+ t m( C$ Y* |" } - public String getName() {
3 K! L, K) m" P. \ - return name;7 W) R# @0 m0 ?% U$ z' x! J, u1 V, e8 R% w
- }2 F g( _6 {) V7 @/ C4 ~
- ; l; \ @! x6 B5 d$ X
- public double getAttackPower() {
6 {+ ?5 c. e. v- N1 k. y - return attackPower;
7 B& d9 a6 H S+ u - }: q6 n5 [4 v' {* g) E8 o9 Q* V1 }$ F
9 D c" r$ k4 V- public void setAttackPower(double attackPower) { U1 [, i- g: G; D/ g. G
- this.attackPower = attackPower;
- H, p: q3 B" g% t3 [ - }7 Q; I. z& O/ t5 Q
- }
, F! w B ?4 `: n8 J, o* Q
Скопировать код
: N2 ?4 t o* `. X1 P- a8 ^Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
: I+ J: i. v: H" t' ~3 Y
3 C3 {' V' h! z" k4 z- // Пакет org.l2jmobius.gameserver.model.battle1 a [2 _4 a; Q! j& l
- package org.l2jmobius.gameserver.model.battle;
/ l/ l* T' d4 o$ n" f6 x - 8 H* V t2 s' w6 B% O( n
- import org.l2jmobius.gameserver.model.actor.Monster;7 t& ], P4 {( u T! r1 K/ g) ]
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
3 U4 p) m5 s- v; t6 _: E" ~ - import org.l2jmobius.gameserver.model.actor.state.FinalState;/ n9 R6 r# X/ D1 q# E9 a
- & `6 W/ H( l$ M' `0 j
- public class BattleSimulation {# a R+ ~0 e+ e: g* }4 d( S
- public static void main(String[] args) {, m8 J! l* H5 t, {; c$ N; p0 e
- // Создаем монстра с начальной атакой
- r% D: U& r/ E3 y6 ?- D! ? - Monster monster = new Monster("Дракон", 100);
7 a% j5 ^8 S: ]8 U - 8 O5 {8 P5 \1 j: ?$ z/ I8 S" t1 x
- // Начальная фаза
* H2 Q8 b. w8 v2 Z+ r - monster.executeState();
; s1 X8 M, x1 r* Q _0 x$ ^! r1 u
6 N) o% e6 o( P7 m: H- // Переход в агрессивную фазу. W( z- r& a7 g- f3 P
- monster.setState(new AggressiveState());$ g, ^6 ?4 A: T
- monster.executeState();6 A$ Y! s1 S* P1 s
* T5 y7 h/ F6 V0 W9 ~, ~- // Финальная фаза- B* S* X7 U# e$ }
- monster.setState(new FinalState());+ y9 k, Q; \" @3 v' d+ S1 B0 r
- monster.executeState();
" @- |& ?8 d# p - }( O& k2 x& y$ \
- }
: |# s- Z* d) P7 y: x
Скопировать код 0 G, L# _) l! c6 a. M9 D
Комментарии по структуре пакетов и классов:: L+ P A5 C& u% ?# O
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.4 ~+ u. }3 M, {& X3 Q" u
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
4 e8 `' U! X1 r! wЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!8 j: N0 H3 ?" `
5 U; o y8 \" I# W% y2 r+ `
: T0 g% w5 `& y3 O
" u2 i2 m7 H& p1 X% u' X+ l
5 `7 T( G4 C8 n
: D0 s1 m* {; J+ j: Y. x: n1 f( ]' O
/ D% r' J, Y( A- z: H6 X$ Z! W
1 Q7 z4 q3 d8 Q' R! X4 h& _
4 O# U6 m' U ]5 {$ y
2 V9 E% G( i4 @
3 M d! v- i9 x+ t% c$ A/ |/ [0 Y) [. ^. L: U' A3 d! c4 F7 q
) D6 m( m6 J* U. \8 J t- m$ q$ W, ?# }. y, c
|