Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 9 ]$ j4 c) M5 N) k+ d
0 D& t4 I' r! E6 k* T. H
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
) `6 [8 H8 f6 H+ N/ y+ U( b
7 P, K2 Z& W% A, oШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
( Q; F8 x$ d+ i( N, a: K. F- j; F4 K! _7 E6 f s8 O1 ^" z
- // Пакет для состояний монстра
# `; p! x# \4 [; E! j3 k! v- t - package org.l2jmobius.gameserver.model.actor.state;# ~0 i, G: [3 b# b% h! ^; o# u. `
4 A3 x+ R6 }9 l* x- // Интерфейс, представляющий состояния монстра* X9 P, e, E, b- `
- public interface MonsterState {
! i1 k) |8 |+ ~! C0 N - void handleState(Monster monster);
! X4 D5 f3 f0 N* ~4 o# X' r, i* S. @. v - }
1 @* C* u r u+ _0 K ?5 s
Скопировать код
8 j4 N+ _3 |+ D$ n( Z$ T4 @3 c* QШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. ! x. F Z% k! b4 c# b( e
+ Q" h' D& ]5 [ p. ~# R3 F" OЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.6 z; }8 G3 f- e& C+ ?( ^( Q0 ?# ~6 B7 c
4 D# _& r5 t. mКласс для начального состояния монстра:
- U, }7 u2 W" H1 K5 w- // Пакет org.l2jmobius.gameserver.model.actor.state
4 n! U; g1 W% K* H - package org.l2jmobius.gameserver.model.actor.state;
% n* X i* H$ n( d9 O7 e - 6 m3 b/ ?/ g8 N7 \1 o
- import org.l2jmobius.gameserver.model.actor.Monster;1 ^7 D \! U) D
- : y2 B- `2 p# W- J! I J
- public class InitialState implements MonsterState {
4 W0 O4 A% _) x/ T1 n+ U - @Override* T6 E1 F( g# c5 R8 m0 S/ E3 d
- public void handleState(Monster monster) {- X. K5 x+ G. M1 \. |
- // Начальная фаза боя C! w5 V* {% h) q: J2 _4 i' u
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");, R% ^( r( {6 r1 n) a8 x, e% q* T
- }& a( O. M% v8 e8 ?
- }
/ q% ]" R5 A% P, o$ ]
Скопировать код Класс для агрессивного состояния монстра:
5 y5 C3 H; S" M: y8 m, w8 |, k- // Пакет org.l2jmobius.gameserver.model.actor.state+ J, u; y2 _5 D5 q
- package org.l2jmobius.gameserver.model.actor.state;
+ e- y. V( U$ E
7 U* G! `, c1 o9 e; O# Q) n- import org.l2jmobius.gameserver.model.actor.Monster;
. l; m3 R6 H' [& i
/ h1 }9 b2 c2 G* U$ K- public class AggressiveState implements MonsterState {: u: W0 K1 |' F* S! P G
- @Override9 A( ?( D9 `& [1 V+ g6 s# }
- public void handleState(Monster monster) {
* [5 `+ m y+ { B' ~+ D0 p - // Агрессивная фаза боя, [8 o9 V( B8 I
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");2 Q5 F! X8 R6 @7 q/ @1 @
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
5 l( y: @* F7 | - }
: [ }! [& a) r/ ]$ X" A( B - }$ \5 W0 R5 }& T$ ^/ f9 r1 B
Скопировать код Класс для финального состояния монстра:- V' U: q$ J/ _2 l2 s' X8 \' |: D, j
- // Пакет org.l2jmobius.gameserver.model.actor.state2 N# l5 ~, a- V! q- i% y4 I4 C
- package org.l2jmobius.gameserver.model.actor.state;/ m0 p) j4 v* U/ w- Q
- ' P7 H; k! ]5 z+ u. J
- import org.l2jmobius.gameserver.model.actor.Monster;
. F7 Q( `: Y$ L" d | - , ~6 Q P$ x7 |8 w' K. T
- public class FinalState implements MonsterState {& q5 O2 ^: Z- D# Z; o
- @Override+ @: ]: B/ y/ I
- public void handleState(Monster monster) {" r7 f! p7 M- T! e0 X! p7 s# v9 H m
- // Финальная фаза боя
4 J( d# t1 ?) R8 r/ U: F& v - System.out.println(monster.getName() + " готовится к финальной атаке!");
( i4 _4 F) }2 [ - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки7 Y6 J5 d( Z/ n" o# H( j
- }
& X- P+ h7 d. w# T, H8 B - }
: M0 {6 R' x) H ^7 E
Скопировать код
' E$ K7 b8 {8 k" s {, qШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.; Q, X# t9 o+ q3 y
- // Пакет org.l2jmobius.gameserver.model.actor
8 }7 Z1 [$ L6 b2 E: m$ y/ J - package org.l2jmobius.gameserver.model.actor;' H. m$ b$ P3 @9 {: t: B
- 4 Q9 C8 k- m9 E. q0 v: p6 k/ k
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;) W2 f5 i( H3 V2 y/ y) | t
- import org.l2jmobius.gameserver.model.actor.state.InitialState;& Z: K" K/ J/ N3 p }6 ]
4 ~% |) C+ {2 X4 Y) s" x, M8 b; n- public class Monster extends Creature {
! J$ }$ U/ }) e8 i( j - private String name;2 Z; Y$ ]8 V! }" y+ ]
- private double attackPower;5 C( P# P% e4 V
- private MonsterState state; // Текущее состояние монстра
. f; C; T: V5 A" X3 r+ |! T
9 A4 L$ u2 a0 B7 v' x2 }- // Конструктор монстра$ F6 G7 K. }& I# W! V7 L2 z
- public Monster(String name, double attackPower) {' B- d& w% t8 K( \
- this.name = name;3 k, o7 K0 W! N- I5 O% Y4 A: z
- this.attackPower = attackPower;8 A' ` u( g' M$ O5 d
- this.state = new InitialState(); // Устанавливаем начальное состояние8 S! Y& F( t2 [" {/ x
- }9 F3 g- \6 y& ~& Z; P
) Y/ x6 b0 ] q- // Метод для смены состояния
& D6 _6 \2 g, {3 C4 n( i1 p - public void setState(MonsterState newState) {) ?3 `+ g) X0 ]0 }* A3 n
- this.state = newState;. d o* P; n; j
- }* A) O% K7 e0 i$ _% F
- 2 y6 ~5 [1 L) K- S
- // Выполнение действий на основе текущего состояния
3 a1 M3 J* _ x) E; P* N9 { - public void executeState() {3 K$ [/ V# f2 J
- state.handleState(this);
6 l* N; K% k6 D- x - }0 g3 Z' k9 @' t& G) `: |8 ^
6 h# N- q4 z6 c. |) j8 d- // Геттеры и сеттеры* S0 d5 `* A# D. T5 I5 j- t' L& R
- public String getName() {
) s/ b5 S9 N1 s6 G. n y - return name;
8 x. L* @6 ]0 d4 P+ h - }$ }6 g) ]- n9 C2 u: ?4 L
- 5 ?2 _, [$ A$ p+ E7 u' w
- public double getAttackPower() {
' T" Z% [. H" b* U l } - return attackPower;
2 F9 x- q1 L3 m; z# O - }
/ o/ u) Q0 w+ T8 d. Y$ q8 Q$ Q& S
$ \" D0 H+ w4 x- public void setAttackPower(double attackPower) {# `! S6 G6 z$ L1 w |
- this.attackPower = attackPower;7 @6 x6 U1 n6 b1 ]: i+ l
- }
6 }3 K. W6 l, f# N - }
, o0 @+ y& Z, p0 c- S
Скопировать код 6 M2 }: O3 m/ m2 O- q
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
. u+ i! Y" F f
/ o0 N' {- A: l4 d- // Пакет org.l2jmobius.gameserver.model.battle
- B3 r. `! `, V* n) \2 u! j - package org.l2jmobius.gameserver.model.battle;
$ @% q( q7 B4 {: i! }" a
1 v* @/ T9 W# H( z- import org.l2jmobius.gameserver.model.actor.Monster;
& Y6 G! _# a) r s: i - import org.l2jmobius.gameserver.model.actor.state.AggressiveState; \& \, ]$ }: _- P
- import org.l2jmobius.gameserver.model.actor.state.FinalState;
5 m3 s3 ^* ^* g) I* ? - 5 n, w; E" ~/ p, F/ j% Y6 L
- public class BattleSimulation {
- B" Y2 {$ `/ o; Q1 y$ L4 H - public static void main(String[] args) {
( `) Z+ c8 \9 J2 ]7 X, k - // Создаем монстра с начальной атакой, G0 W/ U% P3 z
- Monster monster = new Monster("Дракон", 100);0 ~ ]& D: d" U, y+ k' o& d0 u
& G* u$ j7 E; P1 }: a; D1 _- // Начальная фаза/ Q( F; _+ u2 z+ t
- monster.executeState();
% M8 V* f3 J- T( ~( A& w! }9 _4 \, W
( d0 x. `. c! ^7 m' |- // Переход в агрессивную фазу
) A ` I# ^* e4 a - monster.setState(new AggressiveState());6 }2 M" C( C. f4 p' I1 o8 {( Y4 B) h; i
- monster.executeState();
! u3 p$ \1 T, ]4 X
5 h; s- }3 b8 H" W1 D& ` [- // Финальная фаза
% i$ D8 T! ^ B2 {( y - monster.setState(new FinalState());
/ a1 j, Z- Z* X5 F8 @1 I - monster.executeState();
9 E x1 Y6 j( ^3 ] - }
) J8 b9 K( c) [3 T! P4 Q% a( K - }* z4 b* [& z' ?: s0 o. n" M" h
Скопировать код
1 P9 c& H, @! ^: N) Y" pКомментарии по структуре пакетов и классов:
0 R, h8 K/ A, L1 L. ?- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
( H/ G5 E4 I @% Y: g ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
! p8 f" M* i& rЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
/ ^" e y% H% t' L% j+ @! I# a) r3 c, g1 P! Y6 o
6 r9 S: o* W+ G' D! Q. t: m2 _/ o! M$ `2 ?( }
) Q2 g: A, |, e. c4 b5 v* T* p, w
x% Z+ W9 m* Q' N& x; I
. B+ B/ C- J/ c; W7 s
8 K4 C/ h8 N$ V$ U$ i
A& u4 u$ N& ~. T1 E) Q% n* \; b6 E
7 F) T: K/ z& t1 o# o' z
: n* A f* X* ^1 D9 ^. S9 R1 c, G1 R2 _$ J2 z- S, |1 [, z. N$ A
- _! `+ f6 f: I$ C8 f1 A) w
; X, _; p4 f2 V0 x; L3 N) J |