Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). @- x+ I- l' B* J% c/ C
" {9 Q) w2 k7 cЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
$ B6 \5 d' H! W
* w" V2 a1 {6 S$ k8 F3 ?. S# t2 RШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния., b7 w3 S& ]; d$ h
G% ~: |+ a5 t) `- // Пакет для состояний монстра
, ?, Q8 b% n9 X' Y0 R - package org.l2jmobius.gameserver.model.actor.state;0 |8 v" z/ j' A9 g3 Z0 R3 F
' f' |2 g( Y6 ^, T( o+ b- // Интерфейс, представляющий состояния монстра0 g/ C' c) B9 G/ s. V
- public interface MonsterState {
- I' Q q$ c3 G5 K - void handleState(Monster monster);/ {/ T: u0 n/ m7 i; r
- }
& Y% u9 |2 ~8 y6 L2 v! G
Скопировать код
+ e( r$ l( z5 `7 ?Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
z8 S4 |$ b- M: l. i
( d" c% G$ z; n" n# u8 c- V* QЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
; \) D/ m* V& Y1 u/ H- R' `3 z; z
0 O' F7 Q6 O- b- G+ }% D: u, M* M8 lКласс для начального состояния монстра:
3 }) u2 D6 G' J( E) B2 ^- // Пакет org.l2jmobius.gameserver.model.actor.state, ?9 p. k9 g* `( f6 u1 w
- package org.l2jmobius.gameserver.model.actor.state;" r" U6 e5 s% C4 B
/ h% f. \7 N- S" U- import org.l2jmobius.gameserver.model.actor.Monster;/ E* Q9 `6 @; Z ~, a6 z
- # M2 `; L3 |) K$ o* X& [
- public class InitialState implements MonsterState {
3 R: l" e6 k( |* b, u1 p - @Override
5 j5 P: T/ X2 `1 A4 t - public void handleState(Monster monster) {
9 p; g8 ]% Z( X( Q! p2 f - // Начальная фаза боя4 Y" F: @ l0 B) {% [! u
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");
" } T$ F9 C* [- C - }/ T% Y! K1 ?, k4 }! ^
- }/ ]2 O A9 S1 o0 f" S
Скопировать код Класс для агрессивного состояния монстра:
( i! x. F) V( X- // Пакет org.l2jmobius.gameserver.model.actor.state
6 u @" I/ z- z - package org.l2jmobius.gameserver.model.actor.state;# _5 m( V8 q8 e+ R
- ) u9 y: o. b" t" O
- import org.l2jmobius.gameserver.model.actor.Monster;8 U6 I: b y& B/ {
: [* |: ^" \8 u- public class AggressiveState implements MonsterState {
% `4 C$ {0 G% }' A( m9 J - @Override G* ]6 K. q5 G% ^; ]1 I9 x3 C
- public void handleState(Monster monster) {
F# i+ D! o4 q - // Агрессивная фаза боя# J. m6 b0 s$ p. q, U& j8 u" a
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
4 z3 D* z; H0 ^2 J - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки" s# K9 o2 U7 H) @: ~1 `$ B% ~6 v
- }: h2 ~: U6 } V7 ^3 @2 _5 W
- }
! i1 H k4 }9 l/ w2 `
Скопировать код Класс для финального состояния монстра:
) O3 h$ r3 [# Q- // Пакет org.l2jmobius.gameserver.model.actor.state
# u5 n; t* Z7 J; j! ` - package org.l2jmobius.gameserver.model.actor.state;/ b# F6 K& k9 V! G) b+ T# x
- 5 m" s% @) A C& h5 G' }: j
- import org.l2jmobius.gameserver.model.actor.Monster;" \+ T& A( ?9 H% ^" f* w
@* W" B$ }, Z$ L/ y- public class FinalState implements MonsterState {: I& |7 U, L' E3 K0 `8 @# `
- @Override$ f2 H d2 j9 |* b* K
- public void handleState(Monster monster) {& n9 J# R( \' r+ b4 x: r/ o
- // Финальная фаза боя" O( x* _# A* d% r+ m
- System.out.println(monster.getName() + " готовится к финальной атаке!");0 m- Q' `3 a9 y1 j
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
3 l& C/ u. P/ l: I1 g1 W8 W, v - }0 e$ X9 z) p0 z; a
- }" F7 V* S; @; z6 [5 L- q
Скопировать код ) x1 F- } z$ x: x) x
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.; P# u" c$ U" N+ g
- // Пакет org.l2jmobius.gameserver.model.actor
: m3 d+ {2 ?( B, p+ k, A7 e - package org.l2jmobius.gameserver.model.actor;8 W( J+ Z' k. n& r
/ m }7 @6 \4 n1 }+ r/ m+ z- import org.l2jmobius.gameserver.model.actor.state.MonsterState;( U# Q8 j. D5 K: x2 `# e$ y
- import org.l2jmobius.gameserver.model.actor.state.InitialState;
7 g1 @9 G4 w6 f$ h9 ~ - * }3 q( y4 \7 G6 t6 w- ]' Y8 _
- public class Monster extends Creature {
$ q8 ?7 C3 f. \$ r1 D% a - private String name;
. `& @4 z, s! V8 i - private double attackPower;
! M$ Z! q1 J3 B& v( `; d- @ - private MonsterState state; // Текущее состояние монстра" q4 C# L! S. Y7 K
; @0 S; ~; D& R9 ]+ Z- // Конструктор монстра
) G$ f) t+ t' V7 S' }/ _/ m - public Monster(String name, double attackPower) {0 r2 T% {7 I/ N0 `, I9 i
- this.name = name;
) ~' p( `* D. }) Y0 [ - this.attackPower = attackPower;( x" I) z: p @$ Z
- this.state = new InitialState(); // Устанавливаем начальное состояние
7 E; G/ a6 @9 L; D" P/ w - }8 o' ~) M1 Q }& ? @- b* w
- # O7 O& n# \% {4 U1 t
- // Метод для смены состояния0 n4 V) O$ C9 Z0 d' V
- public void setState(MonsterState newState) {$ l, f0 |8 _5 F- a$ J) q) _* Z
- this.state = newState;
! @7 n. i" s8 t+ C4 S - }/ l9 H6 i3 | g5 _7 w
- O4 Y( w% |/ c7 { q9 N- // Выполнение действий на основе текущего состояния1 i# w# ^* Z, s4 S, y
- public void executeState() {
& M; ^1 f5 A( ~' d - state.handleState(this);& `: d' W7 E1 A i
- }2 } p' d @& ?9 e( q. U
- + o3 G+ o) f( y! N; Z0 Z& O
- // Геттеры и сеттеры2 C) D) M. `# P5 h. n
- public String getName() {
" `' j% l" t0 w. Z7 r - return name;
2 t4 C! \. h- y2 q% \# T' n9 n0 j - }; [, F/ _" M+ f
/ t( a* ~) i! U; @; D- public double getAttackPower() {& H% z# L M7 Q0 c) x
- return attackPower;
- R- ]( Z5 |6 L0 D - }
5 K0 {; O4 ]/ F" y, Q7 o
" @" \. x8 Y, j: H( g/ q, L- public void setAttackPower(double attackPower) {
% ]3 I! a6 m6 n' G1 e - this.attackPower = attackPower;
5 L7 \4 r5 `3 s! d- q# f% r - }* C9 E5 |- q k, D, b: V2 V
- }
% K' A, W+ g. l* E$ G& G
Скопировать код " e; s: Q0 o$ n# e: [
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
, i, i4 C( K# N9 R) f4 h6 w
/ I+ p8 q: s q T" z" O- // Пакет org.l2jmobius.gameserver.model.battle& R# q: p) O! r: `
- package org.l2jmobius.gameserver.model.battle;1 |/ D% | w% L; m4 O, D3 [
% H& V* c2 j" {: {# ^% R- import org.l2jmobius.gameserver.model.actor.Monster;- M @. ~# g! _: r* b, c3 u t5 v
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;* ]2 d% {' i* c; X0 S
- import org.l2jmobius.gameserver.model.actor.state.FinalState;0 Q; ^1 Q3 g5 r ?* F
& k! d7 Z- |( c" Y7 w" n; f; }- public class BattleSimulation {9 ]: E) X& X, A
- public static void main(String[] args) {
1 t/ G9 b$ e2 R* d$ j - // Создаем монстра с начальной атакой* x" u2 d0 Z9 K/ Y, F" ^& d3 b
- Monster monster = new Monster("Дракон", 100);5 X% I/ y/ i* j3 E0 d2 N9 n* i) N0 w" x
- , r6 w! N5 W) L/ Q
- // Начальная фаза
N X2 j4 g9 [ - monster.executeState();; Z8 l2 v8 U Y2 n& j4 ?& E
' H3 f* V2 u. ]6 X6 c/ S% J- // Переход в агрессивную фазу* Z& `2 Y! _9 _+ r! ?" }
- monster.setState(new AggressiveState());
! _9 q+ t3 Q$ ~) ?( v4 X8 P+ p - monster.executeState();
' T* H5 \0 X3 u1 w - ) e& _; e0 [2 I
- // Финальная фаза
1 K7 `- r' H$ C! K0 V% h - monster.setState(new FinalState());
, ~# i2 b ?: m9 S8 d - monster.executeState();8 v3 @) O( }' B& O( i
- }1 K9 [ o3 Z, a& ?) ?& P+ I
- }% ?, x$ @( c' \/ ^- ?6 l, h
Скопировать код
8 J! v* F. x. v/ D, H' wКомментарии по структуре пакетов и классов:
# `& n" s2 ~4 L- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.' X) r8 z9 d; U0 ^
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.( T: l2 [ W" `. v: S
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
+ n, N, d7 L" J- Q; h( e+ ?. d
: I) Z4 g; n% O3 w5 F
8 K. e1 j& i/ }( K3 R+ M' r% Y0 G3 `; u' s6 R
/ n9 n* P/ r1 @7 n( ^1 s2 c% A. _
4 J. U P, M7 u: V, @* y
1 ] C% h/ n) A0 h5 h
$ I+ W! e3 ?9 N- z/ y
. q7 E( C0 x5 P; c
. I9 n# y6 _; A+ z6 {5 G! Q. Z5 ^3 Y) l; j ?! A/ J! W$ [
' L9 [6 i* o' u( Q& Z8 W# e4 Z2 g5 b3 u9 [0 K5 z
" Q) v" G5 n* v4 H
% M. E3 B* \* R' ~, H5 X* E, w$ w1 j |