Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). ) w3 _5 \+ X% ^; V7 f
! a6 d/ g+ s G- w3 F* p% Z
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
# t0 W6 U+ D. v# e8 R9 b' o' z' Q8 R( y+ D: l# J1 n
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
* ]3 K5 V3 Y5 \" ~% c: a8 F6 Y+ i8 [$ O% @8 X& B
- // Пакет для состояний монстра
& r s1 A. ~* R. l7 } - package org.l2jmobius.gameserver.model.actor.state;
5 N! z' @8 ~5 g, n3 x. C - ; H1 y5 D. K; U" n, [8 Q2 n
- // Интерфейс, представляющий состояния монстра
3 K" A) a" z5 i: I, n! c - public interface MonsterState {
9 l* C7 o) Q! E5 T% f - void handleState(Monster monster);9 t$ T% e0 U' ]% j8 N1 K, @
- }3 K) ]8 D+ ]6 ?$ ]' M3 ]
Скопировать код
1 V8 d2 K. Y0 ]% J4 ^" \. L. y1 wШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 2 ?4 u& X2 W2 D( p
( i" u+ [3 a; j3 U9 Z/ s5 E
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
- z5 @6 Y0 e( n$ f/ F7 a
5 c6 ]& q8 ?: _8 {6 O& JКласс для начального состояния монстра:
8 {2 T2 y/ x5 Q4 i2 K- // Пакет org.l2jmobius.gameserver.model.actor.state
0 o" r$ ~% N- u - package org.l2jmobius.gameserver.model.actor.state;3 g& R6 |' h ~6 T) ^8 o) n. m5 @
- 0 O# t6 g" Y8 t) B o! o
- import org.l2jmobius.gameserver.model.actor.Monster;7 C" @- Z8 X; Q
- 3 h3 N$ }: G) {9 f' l- i
- public class InitialState implements MonsterState {
) g$ w( B6 t: K - @Override- g% u& a1 E% _/ F
- public void handleState(Monster monster) {
. B4 p8 `" r7 {) r" A& p# f- K - // Начальная фаза боя7 g5 P% u- W' p f; U8 P1 X5 Q
- System.out.println(monster.getName() + " начинает бой с обычной атакой."); J+ Z6 H1 b' g7 r9 ~5 u
- }
3 T" b1 W, U0 V+ { - }* K7 F1 ^7 G/ l; e
Скопировать код Класс для агрессивного состояния монстра:
4 [3 V! C1 m5 Z8 T$ E# W( `8 @- // Пакет org.l2jmobius.gameserver.model.actor.state/ T( H) m6 ]' I: @" E* U
- package org.l2jmobius.gameserver.model.actor.state;. {( h% J; m+ N, S$ l$ }
& B- ~5 g8 o4 P: I# ]2 {- import org.l2jmobius.gameserver.model.actor.Monster;
! X/ o% C. g: Y
8 Z9 M% k2 I+ t" W- u6 K- public class AggressiveState implements MonsterState {6 h6 z- e+ M! \
- @Override
( r. f: {1 p9 w' r' r. a V. T - public void handleState(Monster monster) {
. W; u) J: I4 O Z0 C - // Агрессивная фаза боя
- ^, r2 \/ ?3 w( I$ Q, Q - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");2 h2 \+ C* }2 r5 x( \0 C }3 n
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки9 E) R' E/ I) i! {% o$ d' r4 x
- }
* t, S3 [& Q9 u4 R' M6 u - }
2 e: t7 G8 B. N. ?( y
Скопировать код Класс для финального состояния монстра:3 _1 R$ L1 L H2 }9 E
- // Пакет org.l2jmobius.gameserver.model.actor.state
5 G. O2 A9 U5 e& A2 `9 j: K5 O - package org.l2jmobius.gameserver.model.actor.state;( H$ D/ R$ z1 @8 v+ ]6 W* s; ~
- " R0 B& z8 l: p. p& t- Z+ ~
- import org.l2jmobius.gameserver.model.actor.Monster;- ]1 U$ N! h; `2 o8 m& `$ L# Q9 O) j
- 7 D% ~3 {3 U. r5 w( S
- public class FinalState implements MonsterState {
# ]2 W' }3 d, p. { - @Override; C& n f% R, a# v x8 T, h
- public void handleState(Monster monster) {
: v- y4 E' [3 x$ i3 X ^4 B - // Финальная фаза боя8 O; I, } r6 o; K
- System.out.println(monster.getName() + " готовится к финальной атаке!");
8 E9 K h) ^4 o4 q - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки. l" u) l; v# Y8 V0 k8 y. |
- }4 M0 \ l) z9 ?$ l* }
- }
5 p, G: k* \! g' |, b
Скопировать код ! b& V1 v$ M6 L) |9 i4 I
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
( z% r3 b3 j1 L! h3 u" [- // Пакет org.l2jmobius.gameserver.model.actor4 x3 F( v/ d. k% O/ }# W
- package org.l2jmobius.gameserver.model.actor;
2 S6 _+ ^ S' {1 o7 P - ) Q0 q: o& B4 y }3 k) f' e
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;* b% F7 H7 l6 s4 O0 J
- import org.l2jmobius.gameserver.model.actor.state.InitialState;1 y# b8 R" h9 e/ u# O+ i; T
- 7 t H% c5 E$ U# Y2 k
- public class Monster extends Creature {
- l t/ z0 B5 d9 V. C - private String name;0 V# N. g8 i O5 m \
- private double attackPower;& {. I3 M6 [: E
- private MonsterState state; // Текущее состояние монстра
% f3 u. J# a' N - 1 ?8 I& u4 R4 k% x
- // Конструктор монстра
* C' B: S. V7 R% G$ _/ r" }+ i - public Monster(String name, double attackPower) {
5 X1 q0 G9 M8 n4 D8 G" Z' _, n - this.name = name;- i& O& ~9 i3 ~( A4 `, |! [& z/ A
- this.attackPower = attackPower;
% l( ?1 u# b, m+ Y2 q# y- m* ^ - this.state = new InitialState(); // Устанавливаем начальное состояние
, G' R, Y/ R& O! S' m6 o% r$ M - }
! W; M. I1 I( o6 g - % Z4 [$ [* ]2 X) \! d2 F, P: g- J
- // Метод для смены состояния5 n" S' ?- T8 {( M' B4 a
- public void setState(MonsterState newState) {: ~0 R8 z1 a$ G) X8 _
- this.state = newState;; Z* e2 ?: Z+ i! D ^
- }4 |0 X8 p( n0 g: F) ^
- 3 }% b H; E7 p% t3 v! f
- // Выполнение действий на основе текущего состояния
, n1 \! _: b2 b3 f - public void executeState() {4 |( G$ I: b2 Q2 x& G6 W h' |+ G
- state.handleState(this);
4 a; s/ ]) n- M4 w - }
6 X* t1 b, v' c- d1 ]4 G# _6 C+ j - ; b& Z4 \) r1 B+ |' m, P Q) p
- // Геттеры и сеттеры
+ n4 M) Q' s* r9 G+ h, |: B - public String getName() {
) I5 S: h* S- H7 j+ }* c - return name;# r) f. q9 e; ?( ^
- }5 N$ O# Y1 D+ X
- % H+ O4 t' f P0 f
- public double getAttackPower() {" v( I ?& R$ C& r* I
- return attackPower;- Q, o; t' s( y2 u% ~
- }
7 \4 l0 U/ X6 G, g- z: T
0 w8 v4 E2 p& n- public void setAttackPower(double attackPower) {7 A) @5 X7 u; `( N7 X
- this.attackPower = attackPower;7 J$ Q" }5 L. F* |1 S
- }
7 G( j% i- F }# e" O" \; u - }
+ d& g; P; X1 u' \# Z# ^- I6 I H
Скопировать код
% f5 x; }) q6 D4 Z6 nШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
. p) p# b- O1 d: ]( k. o+ \, }4 k4 J9 _
- // Пакет org.l2jmobius.gameserver.model.battle
; W8 @. k( `4 u1 [" r5 H - package org.l2jmobius.gameserver.model.battle;/ j% X$ f8 {" V8 Q' z
- 0 r0 d. t B$ ^
- import org.l2jmobius.gameserver.model.actor.Monster;
, z' P* o; K8 V- J - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
( r# @+ _4 } |4 H+ I4 z9 ~% t6 B - import org.l2jmobius.gameserver.model.actor.state.FinalState; e/ E2 d1 K6 b" [5 r
- 2 R. X* ?- T) N6 @4 Q8 ]
- public class BattleSimulation {9 ^: b' K+ ]; Q! @% q0 Y0 U
- public static void main(String[] args) {
( W8 u" m* P1 z' Z+ l5 x6 ^1 D - // Создаем монстра с начальной атакой
O) [+ @- L9 R - Monster monster = new Monster("Дракон", 100);3 X- Z, W* f2 f
- * N/ S; K5 Z! H6 h2 {5 Y' `
- // Начальная фаза
' ~7 W+ s4 x/ y. e4 b - monster.executeState();
7 Y! H7 ?1 F9 P - 3 b) v r: U$ z) D
- // Переход в агрессивную фазу
5 F! Q& K- M( k! w5 _# c4 k$ k- k - monster.setState(new AggressiveState());
1 b1 E' T2 ~" U# \4 i - monster.executeState();- Q# D( C4 Q; `6 d6 P* `
5 @) \( J# d6 r) q2 X- // Финальная фаза% s6 g- {. t2 M1 I# }. g
- monster.setState(new FinalState());; t* D% a9 d# n" X
- monster.executeState();" o* z' Y3 L2 y7 v$ F2 k, a- O
- }
& }0 J4 J# }* D* U- G - }
+ S; L- ]- A" ~$ R- @2 L
Скопировать код
; C: R4 B9 |; G" R& @& lКомментарии по структуре пакетов и классов:0 f7 M$ h& G% r& Z. J' Q
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.0 H- P; s7 M! n; z) I
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.# n6 E' P6 t- w% ]
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!" J1 ?' M/ e0 V5 I8 A2 ~4 \8 }7 J$ G
: n& d& r b* ?9 f
" l( @" ^& h, [" B2 A+ t4 J f( g# q
1 T8 g" V' ~# i
# s$ i; o. O6 p
4 m) h* ~" S6 f
, m: s7 C( Y% Z# m3 k! n
( V. z E! }9 p4 U# q" @4 Q/ u
- p# x2 F8 B' K, t W% ~" _
8 s+ _! d3 [! g; o2 n
6 }5 z! F# ]# ]' n5 I: a J, p% g
' g6 u" C* G5 q9 {+ j8 s) q" x
% C' ~4 H* g( _7 Y6 s- }& [8 T1 S3 o
|