Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 3 Y, Q7 G: K, R
: V2 d% K' e$ P8 ~Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.7 n: v! S' ^: \0 t9 G) l4 w, f
3 O0 c7 r) B! ^( MШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
8 E0 I, }! P/ L( p
4 F1 a! u4 \) I1 E- // Пакет для состояний монстра' w4 y6 G! j6 Y* T2 G
- package org.l2jmobius.gameserver.model.actor.state;# P# U$ k$ F( _# o& j* S' e& A
- 4 H0 ]4 B, O# n) W6 [0 K3 U
- // Интерфейс, представляющий состояния монстра
; c% M5 Z& s1 N# D8 s% F - public interface MonsterState {
# s7 R6 [) G9 j3 \% y% p. m" w - void handleState(Monster monster);+ C+ P( X1 [4 V" F! a, l
- }
4 l6 n. y5 D F( j. h$ d
Скопировать код
; w2 Z- X* z( V5 P# C6 bШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. : I1 t& l$ u7 z
3 T2 A7 R9 U/ V% R# _6 {Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.6 [7 J' K3 q# }- q
8 ^1 g1 X6 X6 D/ z* \. M. y5 D
Класс для начального состояния монстра:
# @0 s% F% k. f7 p i3 ]- // Пакет org.l2jmobius.gameserver.model.actor.state
2 @* {% \! H/ G" g7 D - package org.l2jmobius.gameserver.model.actor.state;
" P# W% K: S2 Q) @/ n1 T, l7 u i! c
5 m- S) D3 e/ O: Y$ C0 \6 v- import org.l2jmobius.gameserver.model.actor.Monster;& @9 w) }, `4 Y" S
- . }/ v! O1 b; m; J
- public class InitialState implements MonsterState {
: M9 b T0 k$ n# \/ Y# I; r/ V9 D3 G+ F - @Override+ g& W3 \- o* S' ~* X6 w; j( U# Y3 S
- public void handleState(Monster monster) {) r# n9 h9 d0 U0 J' V
- // Начальная фаза боя
9 y: l6 _' z1 R" h - System.out.println(monster.getName() + " начинает бой с обычной атакой.");! S8 ]) @& D1 P
- }
# J1 s+ U( R) e+ S% c3 P! t) B) O - }
: U1 H5 n8 F# R3 m3 ~% W/ ]
Скопировать код Класс для агрессивного состояния монстра:
z: k5 a$ H4 m7 ^- // Пакет org.l2jmobius.gameserver.model.actor.state
: J c) h+ m7 ^/ f1 A" W7 w1 a - package org.l2jmobius.gameserver.model.actor.state;/ W/ p1 c# }* R
- 0 I7 n( v; I' C" I
- import org.l2jmobius.gameserver.model.actor.Monster;
8 B4 [, L" ]# C
6 ?. t. V `( x0 B: E- public class AggressiveState implements MonsterState {
/ @# }/ y, P- y7 j - @Override
* l; o, n% p3 X7 d - public void handleState(Monster monster) {3 D# w" W5 x4 u: F0 O6 N E
- // Агрессивная фаза боя
* V: q) p4 G/ g - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");* `+ G* E0 j. ` E$ [' A% r: G
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
- ^9 l/ a: Y( c" q- ` - }
: {* o# G' ^9 T: d' i - }
# f. X4 D3 k2 P; e) h
Скопировать код Класс для финального состояния монстра:% k* D8 i+ ?( n4 y- F* ^% P X
- // Пакет org.l2jmobius.gameserver.model.actor.state
. N$ |- l, l- d0 T5 W' E) L - package org.l2jmobius.gameserver.model.actor.state;
5 r6 e# X4 @1 c7 x. ] - ' R3 Y: z. N% n/ _! n
- import org.l2jmobius.gameserver.model.actor.Monster;
! {6 S" y3 y- P' f& d9 a - 1 t; Z8 f1 F* g1 d& L, t
- public class FinalState implements MonsterState {" t" a; B0 \' V
- @Override
( A0 L* L& R( n& ] - public void handleState(Monster monster) {; K4 i$ a+ g+ ]" S$ n6 J
- // Финальная фаза боя
9 \8 O! w* H' a - System.out.println(monster.getName() + " готовится к финальной атаке!");
9 `0 \4 b2 [: P. F - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
8 L# V, K O' o# t4 ?7 ^! N6 i - }
) x, p; ^# J5 S5 {( n5 ]5 ]& G - }
/ y" `9 p9 h q! c8 C/ Z
Скопировать код
% A6 Q' k9 l U! t* jШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.2 v, R5 {! B' c
- // Пакет org.l2jmobius.gameserver.model.actor: a+ Y7 Z- h8 m. ^* \* |
- package org.l2jmobius.gameserver.model.actor;% Q5 p2 N. c7 H
3 f, t c: M/ {/ a. t$ x8 G- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
; \: p: B' f2 C - import org.l2jmobius.gameserver.model.actor.state.InitialState;4 X$ u9 L$ q) R5 t: P: p1 R9 A
- ! W9 Y9 L) `" n' s6 E
- public class Monster extends Creature {
! s- p! l/ ?# I& O! I - private String name;
M7 c5 V4 U$ c6 L! H3 C& z3 u7 N - private double attackPower;
! d# o3 ^/ X( _* e) D7 Y9 a - private MonsterState state; // Текущее состояние монстра
7 T( K- l+ p* d/ {4 C - - j4 x( R! U7 \0 ~7 K6 k
- // Конструктор монстра& l: T* Z/ f d
- public Monster(String name, double attackPower) {
' ^0 g) @% m5 \. u0 P6 W% O - this.name = name;
( ^ u6 G. ^" e! g - this.attackPower = attackPower;$ B, y6 F6 P6 f0 T% s$ l
- this.state = new InitialState(); // Устанавливаем начальное состояние9 G& s* y) O% h
- }/ n8 X4 t5 O/ V5 i7 r# F
- & D9 j# W, b& Q6 z9 j4 X* u
- // Метод для смены состояния) s% v! b- {' U
- public void setState(MonsterState newState) {: |& a9 o' Q/ v, v$ F& ?
- this.state = newState;+ @4 t# `' M, K" d
- }! t1 Y( _( e+ c) n7 G
: E( ?, v( f' I0 ]0 w. ?- // Выполнение действий на основе текущего состояния' R+ D' H' l- r9 z! C0 n; U
- public void executeState() {7 e% V( o8 R! `6 N/ T
- state.handleState(this);
+ P$ X# o- q% R" j$ w4 v; q - }3 J, |9 o0 w4 B: r" v7 l
0 L) {+ P0 q$ A/ Y7 N/ Z# t o% ^$ e6 k- // Геттеры и сеттеры. S9 f$ S- D2 _5 Z H$ b. A( i' D
- public String getName() {2 h# o) l0 T5 p o9 m: i
- return name;
* N6 L+ T, s) A6 B1 O) W - }$ @ ]: a6 o/ x8 Z- _+ X) b1 l" o9 F
0 S- b$ m; |+ T. `7 j2 a- public double getAttackPower() {) w& X8 ]! d# ]1 a
- return attackPower;
7 x3 U7 j f0 z6 {" [ - }
- x C5 x* o* D6 F! `6 g5 {
, p* c$ F9 P' d* w, O- public void setAttackPower(double attackPower) {8 x. s* d. t& ?) s2 i, J6 L( k
- this.attackPower = attackPower;# e/ A0 \3 i8 c9 Q: h8 m. c
- }% y: s# H- f9 I4 B9 l
- }8 k0 D' s0 d6 X, O4 f5 G3 x
Скопировать код ; N: Q" Y+ O2 ?# }2 z5 K4 m" _
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра./ n" B) y& O. U4 i7 B$ [0 @! I
0 _ {. @ Y! O7 l% B8 x5 V8 z
- // Пакет org.l2jmobius.gameserver.model.battle
1 Z; h) E: p2 f% q8 l p - package org.l2jmobius.gameserver.model.battle;
6 t. v: C6 j0 s# H- G
5 O* v, Q7 X* m* V- import org.l2jmobius.gameserver.model.actor.Monster;4 @* m& q/ A. r$ s) z! g
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
" b7 M H2 l- b/ ~/ h2 F; s - import org.l2jmobius.gameserver.model.actor.state.FinalState;
& D. O) }0 k) }! b - : r+ k4 x' D' ?8 V& H$ M; D
- public class BattleSimulation {
; g9 L* A' t3 a+ p6 I - public static void main(String[] args) {" [* Y9 [2 I3 w
- // Создаем монстра с начальной атакой- F$ A: E6 F" k( y5 g
- Monster monster = new Monster("Дракон", 100);6 W/ A4 I6 R3 r! s5 u
- 6 Q8 b( e8 }( ~1 c+ |
- // Начальная фаза
; x" B; z$ G" y9 C - monster.executeState();8 Y1 I7 h+ M# p
- , w% _' G3 _) H* ]! a- V7 p4 N/ Y
- // Переход в агрессивную фазу. I0 [' k8 f" e- [- r- |) w$ x9 }; L
- monster.setState(new AggressiveState());8 ~0 S9 W9 s j6 m
- monster.executeState();+ v' G; ]+ J7 C6 s) ~7 v! l/ I# b
- $ { ~/ p5 r" O) u" M8 f: ^8 l
- // Финальная фаза! a; S4 Y1 b2 T
- monster.setState(new FinalState());
3 X4 K1 u$ ]$ ~4 s5 n- j8 ^: x/ K& j - monster.executeState();: l' Z* L5 V1 K2 w; Z/ f/ ~
- }& e0 W4 V5 g+ s6 j; N8 t/ w1 G; p4 ]
- }
5 |8 D. P" \% q; U$ T
Скопировать код
" a6 C# k! L( d9 pКомментарии по структуре пакетов и классов:# @7 T2 K2 E) q
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.% y! _0 [; G8 T+ F1 x9 S/ { A
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код." \. V# Z4 Q; E7 p" a
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
. J2 v" r& ?5 X4 d, C
' B- |5 x$ [* _ n4 X0 V
6 F! y" @5 O: d. b" j1 t" M$ t
, I6 K7 a7 K9 U& n
5 C7 Z/ ~$ J% r* m7 }2 u. D6 Z/ n9 Z+ p
; x) @2 Y7 [/ g9 m
! a7 p4 [/ M* _0 K% Z
# N) X9 l9 C. Z9 r! M
/ `& V7 O7 R$ ] A1 r, x8 f5 |2 f5 }) \# O3 [
$ Y2 F" o" Q5 X
1 [7 X+ s! I5 t2 j" c
2 G+ ?; i' {9 `; H7 V& i$ K; d' u' c, u# t" d t7 Z
|