Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). " Z- f' B6 X# Q2 n' m1 `
6 T* r$ j2 I. f! }Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.0 l0 F0 k! L* i2 S
1 ^. l) G& _$ }; Q0 X8 t9 O* l
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
3 g7 X$ g2 L# [/ C
3 S3 v( I4 F- @2 m0 d: X- // Пакет для состояний монстра
/ C2 Q4 w" l0 A* l - package org.l2jmobius.gameserver.model.actor.state;( c/ U7 S4 p) j2 t
- % y; S( b/ `$ v
- // Интерфейс, представляющий состояния монстра
6 ]9 v+ ^# b4 E) P: s }. h - public interface MonsterState {
2 M4 a' e, ?3 c - void handleState(Monster monster);
2 K8 g1 L) T1 [ - }& G. [ n4 e$ \9 M# _$ W/ x
Скопировать код 9 n. `9 K3 M) X5 m \
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
# {0 R5 h/ O' I& _5 A7 g
' R# `9 N0 \) T3 K9 S6 wЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
( ^& _3 f u+ u2 k8 s
$ E5 u8 b) P: W3 B/ k) g$ UКласс для начального состояния монстра:
0 u5 E! M$ h( U0 C( x: z- // Пакет org.l2jmobius.gameserver.model.actor.state
4 _. ^& B. M: ] - package org.l2jmobius.gameserver.model.actor.state;
% j* l4 w w' Z, Y. |, W
) F* P9 X3 A9 M! v: r' V' e- import org.l2jmobius.gameserver.model.actor.Monster;
9 V4 T* Y$ I' c f" T7 A - % I8 R( F3 w( A7 a5 S
- public class InitialState implements MonsterState {! X- r0 B. T' v& `( t S
- @Override% s5 B+ M, l, Z0 r
- public void handleState(Monster monster) {" Z$ b$ c1 R& t8 t
- // Начальная фаза боя
! j* e5 a* n7 s' ?" l) @, l2 G- g - System.out.println(monster.getName() + " начинает бой с обычной атакой.");9 G: ?4 T4 ?; }
- }
8 L& t2 x% e3 K4 {# Y2 E" l - }
( V. q6 _+ t0 x- ]' b
Скопировать код Класс для агрессивного состояния монстра:! T9 v: d& ]9 K4 j0 [
- // Пакет org.l2jmobius.gameserver.model.actor.state
7 n( g K! m3 \2 l8 i4 g/ z - package org.l2jmobius.gameserver.model.actor.state;
" X+ Z# W6 d; P! v/ I6 W - 5 \+ @0 a: r3 U3 I
- import org.l2jmobius.gameserver.model.actor.Monster;2 i" S7 N6 y" a# g1 T1 i
+ q7 l2 } g% o$ E8 r) ^2 O8 s- public class AggressiveState implements MonsterState {3 I: i" |( j! M" K9 L$ J) _
- @Override
# w3 a" B& o7 p: y: _) N/ N2 \ - public void handleState(Monster monster) {
% S/ r ~: h4 E. V+ z- H a. } - // Агрессивная фаза боя2 \& ^$ e6 U& W' o% y+ T
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");( P1 N4 |% D9 \' E( O$ s
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки. N: _5 C! @) @" Z v
- }
! ?6 X$ f1 @! `- D" t. N - }: V, Q0 l" b- z' i# D/ t* c
Скопировать код Класс для финального состояния монстра:
- E) y. l2 G. M/ k1 n5 z0 n: _- // Пакет org.l2jmobius.gameserver.model.actor.state9 J! C6 E. X% R$ N# w5 D' y) {
- package org.l2jmobius.gameserver.model.actor.state;
' `' n- H4 q8 M4 s7 A
3 H P, q5 h$ ?- import org.l2jmobius.gameserver.model.actor.Monster;- E- a2 a9 k, O
1 h @- y, t) F) U1 y! `1 i- public class FinalState implements MonsterState {( k2 a" v' a9 }2 F! A
- @Override" T4 k( R* R/ B7 k8 s, z5 ?
- public void handleState(Monster monster) {: ]: T9 L' E- d' ^% d
- // Финальная фаза боя
* j3 |9 S+ y! H6 L - System.out.println(monster.getName() + " готовится к финальной атаке!");
6 u+ y: A/ }5 x7 U$ V - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
+ \, `0 f) R1 l0 J r# N {- H/ ] - }2 J' m* s0 Y, l
- }" ]& t& a( @+ R2 ~
Скопировать код / ~ x- ]9 }1 C8 w; E$ R
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.4 ~0 t/ o! D6 w: A
- // Пакет org.l2jmobius.gameserver.model.actor
- l3 g" {" P; N, { - package org.l2jmobius.gameserver.model.actor;6 I3 }) V- ^, {% T Q7 t3 u
- h& o( M! ~$ T/ f- import org.l2jmobius.gameserver.model.actor.state.MonsterState;4 b9 D; J" K" r/ ]4 [7 \3 |- R
- import org.l2jmobius.gameserver.model.actor.state.InitialState;
& q' d2 [6 D. X9 R% h
7 N& Z2 K9 R6 d# }, B& J0 c- public class Monster extends Creature {
! S4 A+ s. c! |9 n; ^9 E0 j( T - private String name;
3 Y0 t2 D7 x& l5 c/ d* J6 L: n: ] - private double attackPower;- y5 h3 H3 z! D9 s' d" T# ~) I
- private MonsterState state; // Текущее состояние монстра
% T" z# q! W0 ^8 d5 V/ R( U/ z - 0 K: }# b1 E2 \/ t
- // Конструктор монстра
: P9 [# ?7 n: g* n. e" ? - public Monster(String name, double attackPower) {
$ Y' f: N1 r9 \1 ^ - this.name = name; P0 J) ^7 @# k6 V8 _+ t
- this.attackPower = attackPower;
& P8 p- \+ L- B$ y/ k - this.state = new InitialState(); // Устанавливаем начальное состояние
6 Z4 g4 G" l' w8 W6 g+ F - }
) Q! {+ x' w4 J' M l/ s4 y" q
+ ?& |* h# ~6 E- // Метод для смены состояния0 U0 x/ \3 W/ I, l- e( z
- public void setState(MonsterState newState) {3 _0 _- o. R& y' ~5 f* ?$ _
- this.state = newState;
% c7 C. h- m" \( w8 ` - }/ m2 J2 P7 c- t! }
# @1 a* {: i7 L% c' [. b! n; o/ V6 D- // Выполнение действий на основе текущего состояния
1 u+ d# x1 V2 Y, k/ n( m, A W - public void executeState() {
6 l+ I6 o. w0 J* ~& j; i! f* y - state.handleState(this);% N4 O3 V, e' G7 H1 j# D
- }$ v# c& Z; N3 K% ^2 T1 J8 m
/ m( ]9 q9 l; a- // Геттеры и сеттеры
* `1 U$ F3 f3 @1 e) \6 @ - public String getName() {" U) Z! k3 {6 u4 V' M
- return name;
: B9 Z- s9 S" i) w p& j - }8 T! p9 Q+ R, W: ? `) x
: i0 Z, M& Z& e: y% v" n- public double getAttackPower() {5 A9 q5 q% E. A9 r. G3 a
- return attackPower;! a" W- Q2 i3 L9 r* g! C; d
- } G6 E: [ b% `
- - D ^$ F0 H0 z, X
- public void setAttackPower(double attackPower) {5 L$ i1 z/ X! H
- this.attackPower = attackPower;
* ]" `3 u$ R6 W& `- M - }) l9 \& e1 f9 H
- }& O, e3 m% _% M( p- j. P
Скопировать код 3 d( `, ?5 A) v4 W4 Z! |
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.! ~+ j5 w% F6 Y1 _9 M0 T& W
# Q7 r2 t. V0 `2 m, x1 Z9 O9 v: F' N- // Пакет org.l2jmobius.gameserver.model.battle
; q3 G. C; Y2 Q9 |! J - package org.l2jmobius.gameserver.model.battle;! T# B2 \ y/ n3 R% l( ?2 h
5 O0 ^3 {2 N- w- u K6 f0 j! B5 f- import org.l2jmobius.gameserver.model.actor.Monster;# C1 Z! y' e8 m, S& ?- ~
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;! ~* _# W- O A! e* j
- import org.l2jmobius.gameserver.model.actor.state.FinalState;
7 W7 U1 e* e: C/ |! N - : J/ s8 i' J% B% G7 _5 H: I1 A# b, Z
- public class BattleSimulation {- w' U, w! @5 U3 g5 R. L
- public static void main(String[] args) {
( u }/ J$ V# O) {) o3 p! y - // Создаем монстра с начальной атакой2 ^8 \# u' J$ e+ w. o/ S
- Monster monster = new Monster("Дракон", 100);% N/ n9 X3 u4 E
- z* Y% E# \+ a. _7 O
- // Начальная фаза
% |) Z0 T2 Y, L- I! _ - monster.executeState();( K2 ]5 t# K$ V3 Y$ C! l
- ! z" d# S8 J$ S0 p) q* z4 j; P& I
- // Переход в агрессивную фазу
2 T9 L9 l$ [0 x) U% f$ x8 B - monster.setState(new AggressiveState());
9 p5 R9 ?9 _# }6 h2 u+ Y' ]( f' C - monster.executeState();& e+ e- X. ~/ O3 ~$ h
- 8 i% V# w0 t2 w% @5 u
- // Финальная фаза
( C& J0 U! g6 E8 r, w/ Q; A - monster.setState(new FinalState());* x' T; e6 a% \9 ^1 \4 S- u
- monster.executeState();6 i- c4 f$ ]3 x' l e2 l$ a
- }+ C& K0 u0 x# K7 {5 s% Q3 A- R* |
- }
' f1 w/ k5 U* X. A: Y$ z
Скопировать код
2 H8 p: m# t0 L9 M0 RКомментарии по структуре пакетов и классов:# V# M7 u( q4 H5 e% x: C
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.( _' ]/ \: A' _9 m4 \0 {
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
! {3 t. o% R/ t8 c) d1 k/ nЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
7 w0 r& M, d5 \- o( w( V' }/ F i/ m+ t& t. I
3 q- q0 J: S4 ^
7 ~4 Z% {! K6 L6 O/ G1 S
( I, K4 E/ E5 j) B
9 z. G7 w5 K" r* }
. a J6 |6 Y8 l9 q5 E: i: z4 l- r- G6 K
. K f8 n2 m# k1 |: z1 F1 |4 u
8 V6 B1 j& k" S' d
* N u: \& w' @" y$ n
2 t F+ d0 E9 N' u# H6 {" k/ n# I* n) C; Z* o; ~( x
9 r; b- h% \2 F+ P& ]3 m
# J" ?3 h1 S i$ R1 L+ ]
|