Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
" r( F$ r$ f7 \4 q8 L
5 w1 N" q) p8 y3 N/ p" mЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
; G# v" d3 {- @. M/ G- u' B
( R4 `9 w2 u% ^4 ZШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.5 z0 b; C1 ]- E$ J ^" P1 ^
0 o2 R: ~7 i4 z5 N% g5 ]3 J# U
- // Пакет для состояний монстра
- y" X( E+ o( p" T - package org.l2jmobius.gameserver.model.actor.state;* O* v! e" T# ^5 h' z. q
- 2 n8 X5 L! b8 k G! H- M6 _0 s' F
- // Интерфейс, представляющий состояния монстра/ h! W0 ?( A9 x6 F
- public interface MonsterState {
* v9 J0 P. W+ ?7 T& h+ E! s - void handleState(Monster monster);
) K- `' ~+ i- M t# _0 `) P - }
) ?- u& t9 t' ]4 i7 [
Скопировать код % z. Z6 m) ^9 ?( {9 \/ W
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
# [& b" A7 F. i- P* p2 U! S7 a
" P# ~0 K3 a& t4 d9 aЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
$ L; c* o E% {$ K
- B( _) L, \. o- A% M( M: Z) J7 HКласс для начального состояния монстра:
1 F' h) d* z' [0 o+ S* C7 ~- // Пакет org.l2jmobius.gameserver.model.actor.state
% }3 H, I0 a* f8 W, y. A - package org.l2jmobius.gameserver.model.actor.state;" ~" _; U$ v: R/ R0 c6 r
- ; k+ B& G8 t! n0 h. ?/ N
- import org.l2jmobius.gameserver.model.actor.Monster; \) f8 j/ B% W6 Z- q0 A; a
- * C6 L3 i {8 d. v
- public class InitialState implements MonsterState {% A, i) s7 u! ~- m
- @Override
0 W3 G& }5 p1 E1 h; T2 Z - public void handleState(Monster monster) {5 \7 X5 O3 V& _/ b9 @/ I8 x# T
- // Начальная фаза боя# w' R1 I/ J9 A, J% A
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");! N4 F- G; a- K, x0 W4 _8 C
- } r4 T6 e6 n o8 L2 ~
- }
( t1 V! B7 L: ?6 i a7 v0 ^$ U
Скопировать код Класс для агрессивного состояния монстра:
, l( F* z% F2 O# h! C- // Пакет org.l2jmobius.gameserver.model.actor.state* S% c' _) R* \' i9 G6 O1 U- h
- package org.l2jmobius.gameserver.model.actor.state;6 y3 t3 q: H6 r/ F" q
- & \1 _. X+ ~- Q. R' O; d
- import org.l2jmobius.gameserver.model.actor.Monster;
4 Z, U( q) [5 \# U# r - + C; M# w5 `( ?" D& z6 f3 B- p9 P
- public class AggressiveState implements MonsterState {% ?7 ?" i/ d5 P; _. ^1 [
- @Override7 u9 J3 G" Y+ q7 v3 O' \
- public void handleState(Monster monster) {
/ k; R: i/ m' k - // Агрессивная фаза боя* a8 Z) s; g0 b7 F ]
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");" |: P' ]" b( \
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки( i) ]6 Y' v+ L/ v q
- }
" B, m( u f d# p+ E% ] - }
+ Y! G' O0 Q7 N7 v" X
Скопировать код Класс для финального состояния монстра:
5 J6 m( F) C4 h% y" O, ~- // Пакет org.l2jmobius.gameserver.model.actor.state. O# J U7 ^* `1 w# {
- package org.l2jmobius.gameserver.model.actor.state;
( |7 O' C v3 q1 |: I
; D2 J. g5 m* k V ^- import org.l2jmobius.gameserver.model.actor.Monster;) M7 l6 D! }) @6 D. I3 w2 z' D, W
$ i$ C7 r. S% }- public class FinalState implements MonsterState {3 n5 r; P, W/ l) n8 Y) {
- @Override
8 |. z: R! K0 H* k8 J - public void handleState(Monster monster) {
) g0 N. r5 }: ?: h( V - // Финальная фаза боя
$ C7 y+ O( t/ T/ X, U0 m - System.out.println(monster.getName() + " готовится к финальной атаке!");5 Z: f# ^/ w1 R: J7 c
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
( R7 I) Q% Y# n; F* i8 M - }
4 z9 u1 F0 d6 p" u" s& x- d - }
( [! V L& n6 N$ j* T5 H ~- k4 e
Скопировать код ; w7 i8 @" I- G2 U( z- B
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.# P4 A3 b4 v3 h. H% ^) Y t
- // Пакет org.l2jmobius.gameserver.model.actor
( o0 z' _8 f$ c6 p& g - package org.l2jmobius.gameserver.model.actor;/ N7 y2 `( T) z' p- u" n% f
, `# v) v0 i/ u# E- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
) z1 s# j. X0 b# W G# Z' h - import org.l2jmobius.gameserver.model.actor.state.InitialState;. d% |: V6 s! R' H/ s3 P
- 1 D l0 `2 Q0 Q5 c% O* l
- public class Monster extends Creature {8 M) c a( o; T2 S) B- X, ~. {
- private String name;$ J5 A- o( b8 R( T" Y) V x
- private double attackPower;' ^$ `: C/ s+ `% R2 n8 F
- private MonsterState state; // Текущее состояние монстра9 m' N, Y+ M5 n1 ~
- 2 _4 o. B7 q) M2 H
- // Конструктор монстра
) K" w C$ ]' S0 L - public Monster(String name, double attackPower) {0 d* Z' u* ~% k
- this.name = name;, K! h5 B! j; M6 N% [; ], z9 ?
- this.attackPower = attackPower;
! p3 d% F/ d. H4 v: s - this.state = new InitialState(); // Устанавливаем начальное состояние8 C2 z9 y' G9 _. }1 [/ ^: s
- }# ?2 P k* q1 R. h* ~9 L( l
* I9 I, T. G# b5 s- // Метод для смены состояния, Y% Q) i! W4 u$ g/ u' h
- public void setState(MonsterState newState) {2 E5 P2 S3 C7 v4 j5 Y# a4 Z
- this.state = newState;
/ b4 {% w" ^4 @' Z - }+ C+ |" ?8 v1 X* Y# N- K- C
- " N) h/ y y6 C- h _, @0 H: `
- // Выполнение действий на основе текущего состояния
" v6 k9 Q7 C- s+ p - public void executeState() {
8 s, k# ]3 L3 C! i/ ] - state.handleState(this);
5 `8 R2 T- u/ o- h; P0 [* i - }# @9 ?/ N Q+ _
- 3 o% e. |. N# @' W4 @
- // Геттеры и сеттеры
q5 x% {8 k, u) k/ \* i) W - public String getName() {- l5 G/ w5 k0 ?; r% f( y% y
- return name;2 y5 ~# V7 d& s
- }; T5 w7 F5 P& J3 M5 z ]
) ?( L }) |- w( @- public double getAttackPower() {, ?9 u" T1 {' T" `" y6 _
- return attackPower;0 G# [( v3 I* r/ a5 j& c8 i
- }2 }; c$ t, B) J/ N) f# |. W
4 z+ {( B+ s! G4 D. X2 T- public void setAttackPower(double attackPower) {
, a: s* H+ C* m- c - this.attackPower = attackPower;3 {, s& s/ Q3 [2 y. l
- }
# z7 |- _8 W8 |" k# A. b( o5 l7 ~ - }
' M+ e% C, F6 s. q' U- E# T
Скопировать код
I, Y; a& O2 F# [2 M5 MШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
9 g3 F _2 W8 a2 S
7 W) a3 J! `$ ~- // Пакет org.l2jmobius.gameserver.model.battle" f; z2 r1 m6 d _! u
- package org.l2jmobius.gameserver.model.battle;& @) f1 l2 _# `/ x3 d& n# u
- g, t* u+ s2 j: A+ K
- import org.l2jmobius.gameserver.model.actor.Monster;3 ?; e0 O4 }( }5 O6 E5 C. y1 x) h
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
2 p; _) s& t5 l+ k3 E - import org.l2jmobius.gameserver.model.actor.state.FinalState;
) L; |* w1 ?: z, M" z
, _% j$ b9 E( C2 R5 w+ s- public class BattleSimulation {
; f- I, S E# |; b Q) P - public static void main(String[] args) {
" O8 C9 m( n$ } - // Создаем монстра с начальной атакой$ M; F' c) l8 ^, E8 N' G. s- Z' N
- Monster monster = new Monster("Дракон", 100);
^' s, n% ~9 q8 l( Q) V+ ^7 Q
, z( B/ F# W( @# [6 b, `- // Начальная фаза/ d3 F( ~( |! q6 ?, E
- monster.executeState();: e+ j P* K% [! `. Q) w3 U
/ n" u1 b" ?: u7 }1 b7 M4 Q7 p- E- // Переход в агрессивную фазу
5 L" W- q. V; d - monster.setState(new AggressiveState());" S j" r4 i+ o! x
- monster.executeState();
8 I, [4 v4 m+ o' ~
+ F4 }" V; ~7 ?, x4 C5 C0 j$ z O- // Финальная фаза
; u9 e. p" P( L2 u1 z5 H, Z Y - monster.setState(new FinalState());5 l. F/ ?( a1 I" a: G" q. G
- monster.executeState();
* ~8 }6 |1 ~; Z( @ - }
( v" U$ g x: V( u4 W2 j' k - }
* Q4 z# s5 p l8 I
Скопировать код % I' x9 @& [# G p- h# z0 d
Комментарии по структуре пакетов и классов:
7 {, S, P2 {$ n I% Y* u- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.5 [: L) l, l1 }0 k5 z5 q
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
+ M6 U" B$ ?, c6 T F% MЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!% ~" f. e/ W. G! i
! Y( B R- q0 Z
: \% p# x# Y: G2 f
Q" L1 J4 ~9 o0 t2 `& D! T3 W
- Z3 e7 ~8 k1 B: E( Q* {, r! H! x' K+ U' _. Z7 x7 G
/ {8 Y, }! Z& z
* Z. t' ] Y7 P! j5 b# y. H! M! n8 j$ M# Z, W+ }3 P
% L: z8 l( Q( f% r7 F5 O
, r" u* }% D) X( I$ \9 U
* ]: M( u/ M g
2 l3 G6 Q# J7 _" R2 a5 c9 g( j$ v" \- J9 T
3 g9 d" d) l1 p, v3 }
|