Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
$ j4 @: ]0 N% u1 i
* r8 s! f& L l4 l9 O5 Q8 S- o& U* RЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.2 i% N# D# R0 n: }
* y7 u V0 c+ M7 b0 h( ?4 d
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.' L* W0 a8 h0 X9 W4 S2 X
, u/ A4 x. [$ _- // Пакет для состояний монстра- q Z+ H0 }/ Z
- package org.l2jmobius.gameserver.model.actor.state;
) y3 q" }' }$ J) A3 t+ x0 M* \% |5 y( j - 2 q5 X) X" z+ l; q9 s4 F
- // Интерфейс, представляющий состояния монстра
. u+ Q" L: k b2 h0 t - public interface MonsterState {
* U1 q( O r, O" e( s - void handleState(Monster monster);
" t- e, Q7 f1 P8 ]; b - }* O/ W- y$ |9 v- Q0 J
Скопировать код
+ A9 ~& K! n& m9 N% }9 tШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
4 K2 D; ~8 M2 o* |9 J6 W6 p/ T& Z( w& h
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.! M6 I u* [ P \3 q
, e3 F( [# G* D+ b+ P0 p+ d, {& OКласс для начального состояния монстра:
- [/ B0 L2 F4 U: ~- D- // Пакет org.l2jmobius.gameserver.model.actor.state& U# f, |5 A5 H- n4 ~/ I$ ]
- package org.l2jmobius.gameserver.model.actor.state;" I( w4 ?+ j5 X5 w0 l
- % P% s3 ?* j/ d3 r* Q+ Y( J
- import org.l2jmobius.gameserver.model.actor.Monster;
4 H0 W5 k# V* x2 Q$ X7 L# s# Z - - M/ @ [/ b, X2 v) i
- public class InitialState implements MonsterState {
1 X$ V& L) U, x, g - @Override
4 [7 K) l; F! q I5 _ - public void handleState(Monster monster) {
9 L* Q$ P* H" l, y - // Начальная фаза боя1 a5 U! |+ E- r2 _, x$ I( f; g
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");
- D* m3 \9 @! D3 M% Y - }, ]4 d+ V7 w2 f- z. U
- }& [: h+ x& T0 l
Скопировать код Класс для агрессивного состояния монстра:
3 [+ n: ~3 z( v6 O- O! t. L- // Пакет org.l2jmobius.gameserver.model.actor.state- f! w) i7 I9 F
- package org.l2jmobius.gameserver.model.actor.state;
0 H( t! h4 _8 V1 b$ _" b - 1 `! F9 l# A% y9 J; F7 P
- import org.l2jmobius.gameserver.model.actor.Monster;6 e# Q2 V& H9 _8 F- Z1 x. O+ q
4 j9 U" c, J7 I0 \- public class AggressiveState implements MonsterState {$ L. R8 I+ k4 u8 M! N# Q
- @Override
! h; K- E% V0 p# w7 x3 O, T7 p0 o7 n - public void handleState(Monster monster) {
: |. D E% U+ A: M( { - // Агрессивная фаза боя- U* h& ?: @+ R' }+ H6 X! {
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");/ {/ Y. z( K1 ^3 z
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
; F& {+ [: C6 q! w, [; n8 { - }
8 W- d# r) T8 h2 C7 ~/ J+ b7 ~: g - }* u3 r3 P: ], s, s. d8 z
Скопировать код Класс для финального состояния монстра:
% u/ H$ R- [% c* s0 T- // Пакет org.l2jmobius.gameserver.model.actor.state
: O5 r/ a- @; u; u0 e - package org.l2jmobius.gameserver.model.actor.state;
( k3 ?- L, b' h3 l0 O - & ^( G* z, S+ C# f# H
- import org.l2jmobius.gameserver.model.actor.Monster;4 q0 V2 j2 E- T7 e9 |7 v) H6 Z
% ~% S' i& @5 T9 I- public class FinalState implements MonsterState {, n7 u; T5 v8 {1 G
- @Override* L2 O9 _5 d4 F! K+ \$ Z, B B9 |9 B
- public void handleState(Monster monster) {" g, W8 [. h& k) j: l" G) K
- // Финальная фаза боя
a. t& E' I% Y( Q/ r& P8 m! o4 g- d - System.out.println(monster.getName() + " готовится к финальной атаке!");3 x- P) |% A: r
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки# Y5 @8 u1 y6 D# n4 X6 r
- }
# v! ? z( F+ ?& P - }7 b! d) H# t, l
Скопировать код
* l) K4 p2 K: \4 I* {) K, w6 d: XШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
* `1 G4 y, y4 G! @: r- // Пакет org.l2jmobius.gameserver.model.actor8 D# P- B7 N# M( h
- package org.l2jmobius.gameserver.model.actor;
# G6 K* a$ K' o6 L- W
. ?+ ~) h2 y8 |0 f: q- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
$ P: ]& Z6 t; p8 H& \7 n - import org.l2jmobius.gameserver.model.actor.state.InitialState;) M9 ], H5 f# l; {4 P
! [9 b& S7 _& u$ `: G6 v- public class Monster extends Creature {% N1 w* k" O$ G2 E
- private String name;
2 \' `) _; t; i5 E) {% q6 B3 k( W8 \ - private double attackPower;
" J- E7 k2 `/ Q! n! E. s. F - private MonsterState state; // Текущее состояние монстра
' U. d8 d/ Q8 z `; o: i
; u6 ?4 K4 b% n) C Y. o! ^- // Конструктор монстра/ k) @: @* Y7 O' s
- public Monster(String name, double attackPower) {
2 x4 S: i8 Y9 O1 z, Z - this.name = name;6 e' d9 ~% f2 Z6 W' V. U" O
- this.attackPower = attackPower;$ }/ O, ^- Q8 C" u) ~
- this.state = new InitialState(); // Устанавливаем начальное состояние4 Y9 F3 O. s% Z7 j2 \' L5 c1 z
- }
V2 Y, T! G$ X. r' t5 R1 G
* J% P1 E$ c* c4 t4 A- // Метод для смены состояния& h1 q: ~) ?; ]: s8 }
- public void setState(MonsterState newState) {* y4 x) O5 F* f* H
- this.state = newState;
( {( B* w- C' i - }$ u; X2 |6 S( p6 \! y
- |" e, S4 H) u& s U! C- // Выполнение действий на основе текущего состояния
0 g7 S* v: B) n9 z - public void executeState() {
4 {9 `2 q6 l, Q, a$ q9 f- p/ M* C - state.handleState(this);
5 Z" }9 S- G6 Y. `% t. h - }; Y3 }2 @' O& n
+ j, v; J7 a! v4 C2 c- // Геттеры и сеттеры
, ^6 e" y, O. {. i# ?; k- `/ p- J" H - public String getName() {! y6 O9 q. [, z% x+ j6 I
- return name;) ] r% f) `; B% D8 ]! |! y$ e& e
- }4 I. V* v& b8 N3 d5 D
6 W! d8 n" F9 \- public double getAttackPower() {% O9 r( l ]/ O, P$ z; B
- return attackPower;5 h' t* i ?& v* k0 L: D1 @
- }: z# ~* p3 M$ J2 q8 j' d4 K
. u9 ~8 w5 T& q# h5 d- public void setAttackPower(double attackPower) {( O6 r3 N6 W' T6 n
- this.attackPower = attackPower;+ l9 }0 w( y, `' [; q5 A2 V
- }
' e2 U4 @5 n8 J, [ - }
0 P7 y) z( U. G) T0 J3 L8 v
Скопировать код G; r* }9 ^2 F9 C
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
' Q8 d' a0 Y3 d8 F# C7 E% l+ V1 M* @2 J
- // Пакет org.l2jmobius.gameserver.model.battle/ }0 P: n: O% u% b
- package org.l2jmobius.gameserver.model.battle;
# p8 v- L7 {1 ?8 O7 K, R
7 c- e6 L7 x$ `( l' I5 C( }: {: u- import org.l2jmobius.gameserver.model.actor.Monster;
+ i: }! s( Z! G0 P0 J - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
$ w' Q4 t% L8 c" L+ Z" @) K - import org.l2jmobius.gameserver.model.actor.state.FinalState;
2 W# q, _0 l7 K0 ]9 Y - # o O, t) I9 f3 V: c2 U
- public class BattleSimulation {9 X5 b# H0 v8 i7 \
- public static void main(String[] args) {! B% V5 r' J. N& U
- // Создаем монстра с начальной атакой3 h. W: l$ j1 S3 K1 s, ^* x6 k
- Monster monster = new Monster("Дракон", 100);
0 M: s( _% r4 y0 ~0 d7 ? s - - {, a, P* G' l2 Z2 I3 g% w
- // Начальная фаза; a% B: C8 l+ v, R# C; X
- monster.executeState();
* W) j k; a+ X" p' h3 {) S
0 r- K& R2 x E- q% E7 ]. H! n- // Переход в агрессивную фазу
8 A/ h; u. G' r& r" j - monster.setState(new AggressiveState());
2 H, ]- m% g5 g6 G1 E/ \% @0 |4 R8 G - monster.executeState();( t6 ?6 x, t8 R u7 `( x6 o% a4 R: s
! t" h- R5 j" o( x- // Финальная фаза& o- [9 V/ f3 k' I
- monster.setState(new FinalState());- I, U/ A" O, C
- monster.executeState();! g2 d+ \0 }' w, v
- }/ V2 x2 [& U: P7 y0 o c
- }
1 C( A& J9 m% s: f7 r+ ?- n
Скопировать код
4 `! M, ]2 v& q& k( U) Q9 `' ZКомментарии по структуре пакетов и классов:
2 }+ S% g; c& q# _0 @- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
3 L. u' F" T+ [ ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
% v0 A- T- h/ _0 ]0 M0 u/ EЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!$ B$ J4 z( B" J- n
, }! E: ?3 E+ r; | x* z; }! \3 ~* y5 T6 U# D$ Y' ]; m6 d4 }4 P: D G
# |& d" A. y8 K& S
! X/ o8 n/ j$ i+ M5 o: k
$ ], w- p6 K+ J8 o. R
1 {2 O7 }8 ]" V4 K1 B3 F# V( C9 I
4 Z' _, s" `3 x% a @! q$ q1 F+ E, y8 X$ X3 H9 C0 W% y
; h( P+ I5 |" m% w
2 |/ M' Q$ Z& N* k
4 d) M; w F' j2 |3 q
8 p& B; |- d/ I: O c' j: W
% q) J; Z! ~! s7 H: a. b. g8 I' E- h- Y
|