Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). % y) g* ^( w7 i5 }: r
0 r6 ?' u" I$ b$ W5 M" ?4 F0 j$ fЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
5 y- X% k: @4 x0 g" {; u4 o3 g; S+ U4 {
0 {$ }6 c; t) r1 C1 gШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.2 B; K! B% T4 E: o! [! H+ t* S
7 A7 K: p7 {, a. c k" J* k- // Пакет для состояний монстра
# x% X6 Y/ Z+ D7 `5 n - package org.l2jmobius.gameserver.model.actor.state;
9 @; ^" U1 K3 E* {: W; V1 N% | - 2 n! j* i/ ^) N0 h F+ I
- // Интерфейс, представляющий состояния монстра6 }- X& i+ K- v( B7 f/ y
- public interface MonsterState {% e! \3 ]$ r/ C; p
- void handleState(Monster monster);
h& D2 P# [; Z9 J8 F - }
- l; l; x& I9 ]# [/ p1 J4 l
Скопировать код 0 m6 r( W: I: W4 X
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. # D. o- ]9 ]( L4 h. Q" S8 }
7 Y4 t: o1 Y, x& a9 d fЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
) ^; u$ r8 H4 x% W! M/ A+ a
* G& J! R. r/ Q& v9 [Класс для начального состояния монстра:
$ d# [$ Y3 x# W2 o- // Пакет org.l2jmobius.gameserver.model.actor.state
/ U" M0 V- X) l6 Y# d2 Q - package org.l2jmobius.gameserver.model.actor.state;: c% {* v! p' |( K- g0 K
6 s) O/ ^. ~3 m# Y- import org.l2jmobius.gameserver.model.actor.Monster;% e a5 R# T0 n- g$ v. H4 \! [6 ?
3 ~, M( Q, R; z- n- public class InitialState implements MonsterState {' L( i$ N/ _" ?9 R# v" G
- @Override/ F% m5 n4 } b2 f3 m, [% k
- public void handleState(Monster monster) {6 \* O( M! L6 ~* n. B4 a; Y
- // Начальная фаза боя5 A* `+ Z: C) L& v# G7 F
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");3 f# m& j" T. X, r
- }0 m) K# k k9 |7 Q
- }
$ f- @3 H' I" v
Скопировать код Класс для агрессивного состояния монстра:2 A& X# B, M6 l8 Z1 T! i0 ?5 n. h
- // Пакет org.l2jmobius.gameserver.model.actor.state0 m" W6 I. ]9 b, ~7 T
- package org.l2jmobius.gameserver.model.actor.state;) Z* |5 Y. k. v/ m5 P2 z
- ; h7 g! Y: K% ~ g3 }8 ?* R
- import org.l2jmobius.gameserver.model.actor.Monster;! A% M8 M$ F. n5 T0 j8 y7 O
& H5 L; c. L. b2 w- public class AggressiveState implements MonsterState {5 J) N) _/ o; i/ z+ @0 }% O
- @Override
+ S& d) y+ ~% D) `6 N+ K# Y+ U0 r' T - public void handleState(Monster monster) {
+ `9 W1 S1 C% v1 D* R. H2 m - // Агрессивная фаза боя5 R$ w& a0 c, O1 ^" s* B+ V
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
3 r' f1 w \ _% u4 t5 \ - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки" B% O" P3 K( `2 j4 V2 w
- }
' I+ p) @/ a" L5 M+ _' { - }
- z+ F5 p" I; r% c0 g% N) V. c9 F
Скопировать код Класс для финального состояния монстра:# x5 p$ L8 P; Z5 I
- // Пакет org.l2jmobius.gameserver.model.actor.state4 U8 O7 M6 j8 R0 i! O. A
- package org.l2jmobius.gameserver.model.actor.state;
- ^$ X% @ X, r8 ^" s - 8 ], R7 b+ T* L, S1 O# h
- import org.l2jmobius.gameserver.model.actor.Monster;
% _3 y* P& A* n2 U$ G1 S+ [3 g - ! e& |' M0 E, }, c" H5 J1 `, d
- public class FinalState implements MonsterState {
2 }4 ^4 _4 G z/ W - @Override& k, {2 x# N4 b' ]4 H
- public void handleState(Monster monster) {
* g; C t5 N8 k+ S( s - // Финальная фаза боя7 n: r: \3 `. ?9 k/ \$ P1 P
- System.out.println(monster.getName() + " готовится к финальной атаке!");
5 [, t* }6 N p/ N* a! c$ l - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
; O8 ~1 p5 v5 k - }: w: ` `7 M3 u# H! W
- }. _5 ?* Y2 b g1 q% P
Скопировать код
* I/ \1 E T$ I/ Y4 {Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
7 {5 j6 a) s" ]5 S$ s/ n- // Пакет org.l2jmobius.gameserver.model.actor
4 c/ o* _2 Q; l( g$ e* {; Q& `0 V7 h - package org.l2jmobius.gameserver.model.actor;
/ V/ A9 s( n- E. t& w
6 |3 N% c) p3 n$ r- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
9 k8 r, _1 R1 y - import org.l2jmobius.gameserver.model.actor.state.InitialState;
! |/ u* z) x2 q( v7 g - , o0 _1 t1 \- L% [8 |
- public class Monster extends Creature {4 u: Q* p2 Y# |
- private String name;
- X) p/ z. U+ o1 s) J# h6 ^9 [* x8 s - private double attackPower;1 l4 q; O# `- l- Z2 q# S8 N
- private MonsterState state; // Текущее состояние монстра7 h+ h! @7 `! x& `+ h1 ^) K
S0 Q; l3 b/ e6 |; S- // Конструктор монстра' x( i' q2 Y% t; K* w
- public Monster(String name, double attackPower) {: N S1 l. P- I8 h$ [+ y! V: O
- this.name = name;. ~7 X, W0 T# v
- this.attackPower = attackPower;# x$ ]' R' \3 W& W6 i1 F5 p6 [
- this.state = new InitialState(); // Устанавливаем начальное состояние
) P( b2 J3 M1 q - }
$ s: n4 [; k/ q M# y - H/ H; Z* V1 t9 ^9 i+ J8 m
- // Метод для смены состояния+ K" Q7 |; N( F* p) E
- public void setState(MonsterState newState) {
\9 Z5 a9 m/ X% z( _0 u2 C - this.state = newState;
8 v, }. R4 b! t' C - }/ x' }; A9 e+ n! o8 I5 `
- 2 e1 N# L$ Q6 b" P" z. F. `( g
- // Выполнение действий на основе текущего состояния! q9 X+ i3 i) S$ V
- public void executeState() {
& C9 s0 x+ D2 e, ? - state.handleState(this);
]( r3 }8 i( B! A) r/ J - }. g6 R. G2 p$ j6 D4 b4 Q9 M
5 s) \. x: m2 I4 L" W- // Геттеры и сеттеры) Z. c! c0 Y$ j
- public String getName() {
1 C* I6 q D* N. q. I( B% T& \' V - return name;
* p1 p8 w+ ?" f - }
; r( x8 x( B% Z1 s4 I T1 }: ^. \ - & | i( F; g9 K" I) H+ q
- public double getAttackPower() {
) z, c, J9 w$ J5 H' D' g - return attackPower;
$ z5 `1 C. t7 T2 T2 O5 p7 o+ m - }7 I6 r' t* j; [
, R( G( l4 K$ o- U+ b ^, }4 `6 e- public void setAttackPower(double attackPower) {0 p- \3 y. h0 b8 M$ w
- this.attackPower = attackPower;$ N b8 X, M+ U5 l
- }) U; v/ E) ~" e& b7 [$ }
- }
- b8 Y6 l1 o! V
Скопировать код
' z& D! I; ~3 P6 q5 E* D+ O; B" aШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра. C6 p1 z1 ?) l x: \# k7 d
; p! e# e% P/ n! P! ]$ a- // Пакет org.l2jmobius.gameserver.model.battle
2 X9 Q9 f0 M* _ - package org.l2jmobius.gameserver.model.battle;
1 K0 S; [3 u5 } y- x6 O/ a - 7 B( ]% F9 H3 _4 a5 q6 ~9 q
- import org.l2jmobius.gameserver.model.actor.Monster;
( \; F" E; Z7 x. X5 Y - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
% W( R% H8 o% N) M - import org.l2jmobius.gameserver.model.actor.state.FinalState;, ?7 s; a3 G2 H9 U) S3 [
- / E& S; m# y9 o9 P+ e: E* N3 d, o
- public class BattleSimulation {
. ~& ^$ M! e4 D3 { - public static void main(String[] args) {
4 B4 b; _* Q) @6 \/ S - // Создаем монстра с начальной атакой& F- E8 @' @8 B8 u: T- J% l0 Q7 }# r9 ?
- Monster monster = new Monster("Дракон", 100);
4 ]0 ~) H! m' r" ]" d' O- @ - 0 M7 W! n' {/ \) n& T7 Z
- // Начальная фаза
! z5 ~) h' }( d4 ^! E: l" W - monster.executeState();
+ |/ C7 f: d0 Q$ n2 t, i( v! q# i2 ~$ o+ Z# g
8 g; @+ n/ X: b+ r- // Переход в агрессивную фазу
; k1 a, m0 ?7 T9 E - monster.setState(new AggressiveState());
( j) D- ~+ ^- i - monster.executeState();6 y5 H* B6 W3 D8 S! h
- 4 Z0 M$ }' ]; {2 ~9 x
- // Финальная фаза
) I) Q4 h+ n3 a; ?9 Q; G' n7 ^ - monster.setState(new FinalState());
! h2 x- A9 r0 x- O K/ ^ v D' t - monster.executeState();3 s3 S0 R. ?- w! D# f$ O, T3 q0 Y
- }* t p0 o3 ~. D' c% k( e+ H# e: y
- }
: Y1 g. W9 B' J
Скопировать код 5 y0 S! V- X8 O& o
Комментарии по структуре пакетов и классов:
1 W. P7 a T7 o- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
% T' y" I4 x; F% b6 v* A ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.; a; l: S8 b2 l% D* V5 [, U$ Y
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
+ F/ j4 z: B* [) f6 U7 B8 }8 x" O( }" M( T3 }/ _, ^3 |
5 E- m9 p: ? K- f2 j- e2 g
& j3 g2 U M n/ n- i
" b4 e6 m9 q* m/ b" F+ t0 r4 l t
% y. v+ P/ H7 s* R! o( ]# J1 S1 {
9 g& a# _7 r+ n! p; [
9 V' G7 G8 I) i4 w. U. L3 Y
/ W1 h* U o4 s8 U4 p" c) r
$ R+ C# y' |$ w& K1 v* I
: I; p7 t& y& H( M; |+ d# f7 U3 v3 i$ i
# M+ l2 I5 \6 c/ W% m& e/ L
" Z3 ]4 @$ o: X7 |1 N$ E1 x |