Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
5 l/ `3 d# T! n$ ^
. k6 k5 x) B, T8 v$ Q6 IЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра." o9 h) ~( W# `2 E2 T: M+ k
4 C. k# L( Y1 W" Z' y3 o1 J2 PШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
* M) q+ r s: s) C& p" X2 V# |' H/ l7 j/ e. g, _
- // Пакет для состояний монстра
7 B; d" D2 F+ ^2 U - package org.l2jmobius.gameserver.model.actor.state;
0 X2 R" D3 D2 g! W3 z - ( n0 k5 K1 o a& E G8 Z1 t
- // Интерфейс, представляющий состояния монстра
4 K. _. C2 \% P; v8 A - public interface MonsterState {
. m* j- w2 ]' A% }1 X! p - void handleState(Monster monster);
! c d" @* t/ ?9 Q - }; F" X( R6 R. z4 p
Скопировать код
/ V; L1 |6 Q# o7 K# gШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. % }" t5 l- }3 H5 w, o2 i
" C! D7 o: }% h
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
' G3 O" k7 k& a
$ m% a6 s. {6 u% M* l' A9 A# X- }Класс для начального состояния монстра:
& J% U! a7 U d( P W5 M s6 o# G1 O* u1 Z- // Пакет org.l2jmobius.gameserver.model.actor.state
# Y4 G/ f' B3 P8 q) m# M: | - package org.l2jmobius.gameserver.model.actor.state;
% k; z1 |" _: `$ M$ V& q - 6 i9 B2 _2 x m! ~) Q0 _
- import org.l2jmobius.gameserver.model.actor.Monster;5 `, k0 c' \% P6 {$ z) s
- . x2 \2 W. j2 x0 j$ Q0 l
- public class InitialState implements MonsterState {! |8 k& a& m( J- `! i
- @Override
% {/ t4 z, z+ r5 l. z) M- G - public void handleState(Monster monster) {) R0 i8 |. I5 I% Y7 |0 ~( A$ p
- // Начальная фаза боя
- ]" }5 }; m% g0 V) M - System.out.println(monster.getName() + " начинает бой с обычной атакой.");
/ {' |7 `+ {' [/ u+ | - }& P" ]+ w7 \6 S
- }
: X5 e& [2 J. \4 V0 [3 W2 w5 B
Скопировать код Класс для агрессивного состояния монстра:9 R; T6 J7 [ q9 V7 L ?
- // Пакет org.l2jmobius.gameserver.model.actor.state
# M/ x! |6 C. Z+ W- B3 } - package org.l2jmobius.gameserver.model.actor.state;' n* _9 W5 d- N( B
- " v+ L$ c& E* A: B ]
- import org.l2jmobius.gameserver.model.actor.Monster;4 e& T2 o- @5 S! m
- 7 q& G4 B" w% V, V% D
- public class AggressiveState implements MonsterState {. K/ | z9 Y% u+ F1 A3 O( ~
- @Override$ e9 `$ W" g1 k- c5 ~
- public void handleState(Monster monster) {
: }, _. S6 d# Z( `2 }0 R! V - // Агрессивная фаза боя
7 m; I0 ^4 D' L - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
/ o% j" J9 F k - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
/ P D% M9 P( M4 h - }
% U6 p1 N; C9 S b - }
" \- b8 g( K. M( P+ N" X
Скопировать код Класс для финального состояния монстра:0 l9 t7 ^. y8 q m G# x3 h
- // Пакет org.l2jmobius.gameserver.model.actor.state
! B5 K1 Y, M0 h( y - package org.l2jmobius.gameserver.model.actor.state;
0 U/ T& N1 U4 U2 [7 R- _9 P
, O# V/ l0 |8 s3 e' O. E6 ~+ Y- import org.l2jmobius.gameserver.model.actor.Monster;
% A1 e% Y$ \" J! R$ }1 n, b5 ?& ^
1 B* Y; k/ J6 J1 X1 a6 z! B: j- public class FinalState implements MonsterState {. g: e8 t5 E4 ^2 b
- @Override
% R0 }5 j: N; E/ \) | - public void handleState(Monster monster) {
4 Y& [- [: ~! \# f - // Финальная фаза боя, [( r1 ]/ b4 f$ p5 T4 [* Y/ k: S
- System.out.println(monster.getName() + " готовится к финальной атаке!");4 {6 s4 {( V+ ~' k
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки* t$ H& d. C1 [2 o$ I5 A; k; R9 E
- }
C; m: _) w2 j - }3 y R( u. G C) W8 b& f7 H7 O0 P! L
Скопировать код
$ Q. T. t7 Y! M: E+ gШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
5 } B( Q/ h1 e4 \- // Пакет org.l2jmobius.gameserver.model.actor
6 s+ x0 ]* |/ a5 j! I7 U - package org.l2jmobius.gameserver.model.actor;/ b% [' n0 l1 E: Z2 R
" [ s& _3 R1 y4 |2 N- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
4 D1 R! ]) c$ C3 Z& o M - import org.l2jmobius.gameserver.model.actor.state.InitialState;! U. u: [/ g; g C1 N. l
6 E6 C. C. G) ?3 w( B$ C2 _- public class Monster extends Creature {0 {6 t& T! c! L2 K- e1 `
- private String name;
; e; U4 X( F+ Z - private double attackPower;: \2 x3 `( h M9 y6 n3 y) ~
- private MonsterState state; // Текущее состояние монстра7 @" {) x O6 D5 A1 k! a% x* n
- 6 t0 L$ X6 p6 f5 l7 b
- // Конструктор монстра
6 w8 W) V% P: Q6 c5 x$ q - public Monster(String name, double attackPower) {
$ ]# L, T. f3 f8 W+ s3 w3 f - this.name = name;7 R+ S/ j0 c" P3 R' f f6 {
- this.attackPower = attackPower;
# m: m) {$ _6 z7 e1 ^( }) s - this.state = new InitialState(); // Устанавливаем начальное состояние) } P8 w# @: U7 x* c! t- z" i. j
- }
- m/ y$ \/ }7 a+ r" m+ e P) c
$ }# r1 E0 m3 u( `2 Z% {; {" ?- // Метод для смены состояния+ f; v# W- ?, K( [; o! f
- public void setState(MonsterState newState) {
4 L( j* F( z" Q: S' u t: x' U - this.state = newState;4 _! h# ^+ I5 a5 L, e
- }
/ ~9 Z8 u- X7 T4 l
1 _" {1 I, ?' I) @7 ?+ H- // Выполнение действий на основе текущего состояния$ a. {* p9 t( v- O$ Q
- public void executeState() {9 k; F* J& t# V' f. o
- state.handleState(this);$ } l5 v$ l5 j8 Y
- }
, q- R4 D; h( i, Y
9 ?+ m' w8 q0 C" Q- // Геттеры и сеттеры1 m* ], v) {+ g t# N2 V7 v
- public String getName() {
+ W/ E; \# S* A# G - return name;
" g3 Z8 v3 I( ` r - }: ^- A: {/ n; R
) @6 L- Q8 a P0 }# n2 k1 v4 r3 b- public double getAttackPower() {
# Q8 a1 J% w9 [6 D- ?/ m* D3 J - return attackPower;. z. c6 l# Y2 o# Z( ]
- }
, I) ~. o M2 G' H% a& N% h. w* n; k - $ i" v1 F% U8 o9 {
- public void setAttackPower(double attackPower) {$ o: Y1 [' O4 b0 k) d
- this.attackPower = attackPower;
* e4 X8 I/ e* v8 h. N* p, F - }
( M/ y5 k6 y! I0 p - }% X) [" t7 W( a1 e
Скопировать код + p9 Y$ P! I w/ S% E1 n0 D
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.: q, [/ O% O6 {; ?, U, o4 ^
9 M' F* P6 t( t9 f( m- // Пакет org.l2jmobius.gameserver.model.battle
5 C- f6 ~- H0 L4 U - package org.l2jmobius.gameserver.model.battle;5 V& _1 e6 Y! l) T# b0 S1 q
g/ Q; G, l# M9 A0 Z u V2 h- import org.l2jmobius.gameserver.model.actor.Monster;
4 l' J, n; _/ S - import org.l2jmobius.gameserver.model.actor.state.AggressiveState; P1 z& J* t7 n3 B* j
- import org.l2jmobius.gameserver.model.actor.state.FinalState;
5 W6 Y, h& s; P( }& D, B: @! i - * B& g! F- d. _: P4 @
- public class BattleSimulation {* u3 S! f8 i9 x7 S! ^3 d
- public static void main(String[] args) {
; _) w# b3 w/ _3 ]+ d: B - // Создаем монстра с начальной атакой& B! ?0 G5 X" O
- Monster monster = new Monster("Дракон", 100);6 [* w/ b( f8 x
- $ a0 F$ H2 {2 e. i+ g) M0 q
- // Начальная фаза2 U5 Q( l' |+ h. I( q
- monster.executeState();& w; H( @# J3 t$ H* _) Y4 y
x( J; V- `& ?# F. R2 y ?1 F! {- // Переход в агрессивную фазу
+ ^" v2 t, J+ t, h. I T' J& g - monster.setState(new AggressiveState());( u" S7 w$ X% b# B' ?8 a
- monster.executeState();
( L" Z3 U( f) N! c3 b
! F- Q5 v( h9 [& S& q- t- l' `- // Финальная фаза$ @8 M, q- _; ?, I1 ?: l
- monster.setState(new FinalState());
* w: s4 k5 S+ A2 v8 C* m$ X7 ~ - monster.executeState();
+ s& ^' s. E; C5 h7 L0 Z - }
( {9 R, [* q1 V* A7 E# t+ A - }; T) B5 l) R. u- L8 K; U) B; R' @& Q' |
Скопировать код
4 f7 c- A# h% u7 y# y* \Комментарии по структуре пакетов и классов:/ ^2 u* ?% b; i4 l2 s
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
9 M _0 M8 _7 {+ J ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код." j7 H- I2 A) h- e
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!6 N1 `+ [' e) K, ~0 W
# [% n1 M9 f1 I! {& c2 ^" Q4 o" H5 \# i% {0 G0 v
: F# ~3 S( A, _* u. }
. d. J- y8 H0 q+ B+ ^8 M( F) `5 h( T+ v0 P% |! _
: Z. N: o; H" M9 x$ a( k/ v# n
/ H6 [. e+ h" \/ L; a1 \& ?1 g* G& ?. ^
5 U9 D, f0 C, E5 w3 h9 ~# x0 q* p$ Y* T0 \
; R6 u- X) C9 U- B% ]9 E4 o7 [( r6 c" Y' N; y; x* _% M
6 ?) I4 l/ e3 N" A! S- G e
+ a, M- e6 Y: E w
|