Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). " N4 ~% n5 o1 |- ~; ?7 W$ |
/ a' B! W9 T. K6 GЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.% X! |. z% q; P* C# b6 O" D
. P; d# L5 W: o j5 \+ z$ YШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.7 y0 g. s4 T! `
/ U4 Y6 D: S9 [+ R- // Пакет для состояний монстра
) q$ C5 }4 m( V9 _" j' _ - package org.l2jmobius.gameserver.model.actor.state;3 E, q) X2 A- R* v O& R1 w! L
$ y0 e4 S0 p& n: F8 ~- // Интерфейс, представляющий состояния монстра# T5 C. {7 H. \$ d6 ^) z7 v& S+ D
- public interface MonsterState {# G1 w) X( ~) a# S$ K1 B8 j) E4 j
- void handleState(Monster monster);
+ i/ \' s# _. |* W$ Q) ?9 _ - }4 |* i- N; R u
Скопировать код
1 t4 r, N& C% R! b K& ]% WШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. / a J1 m9 f6 w( `$ O
4 Y% Q/ t) Q$ v% ^; Z7 QЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
1 ?& U; a9 ^' u+ P* W5 x0 i4 y+ n6 v& I! J5 @
Класс для начального состояния монстра:) \7 Q) }+ t1 }4 R) Z; L% ^ t) B3 ^
- // Пакет org.l2jmobius.gameserver.model.actor.state1 Q% F: }% `7 c
- package org.l2jmobius.gameserver.model.actor.state;
7 F) z$ V" r1 W) r2 B1 q - 3 I( j6 O; V- w1 e) y) A% S W0 @/ J
- import org.l2jmobius.gameserver.model.actor.Monster;' m! S! G( Y+ D; g$ j+ H: k4 D& l
- 4 q+ H! `; Z5 g% R. j
- public class InitialState implements MonsterState {7 _# e; c' K) L3 T5 B% A0 H
- @Override1 z: K4 F; O7 B1 r
- public void handleState(Monster monster) {# Y2 G0 R9 a0 j8 P2 i' f9 N* c# \
- // Начальная фаза боя( p/ a: t0 B/ y. J
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");
0 i! p9 ]3 v& t2 @. d" y - }, @: W2 U6 x- e) t: k8 G" p8 x
- }
7 M2 r# b% d% Z; M- @: }( x
Скопировать код Класс для агрессивного состояния монстра:
" ^8 J K( F6 `" f L! O- // Пакет org.l2jmobius.gameserver.model.actor.state
+ W0 {! q( Q7 n* S3 c! L - package org.l2jmobius.gameserver.model.actor.state;
; h1 L* x/ S# j; p U
. y3 x/ Q% M: O+ k' c' m- import org.l2jmobius.gameserver.model.actor.Monster;# e% `! F/ G7 J( B$ z6 f
- H. }4 Q ~# B, R- L- J; F- public class AggressiveState implements MonsterState {
7 O7 w) F" H3 E- T# y0 ~: J2 [8 m( P - @Override
0 C# i4 ?+ n- N" ]+ n - public void handleState(Monster monster) {
8 k4 T, L- _0 C, e - // Агрессивная фаза боя8 n) [" O/ _+ T7 n4 c3 ~8 \
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");" p* B6 k6 G! r
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
! w7 w/ ~# n) b* H - }2 s) _( L. @ o, e$ ]3 O
- }- M( V" P9 R3 p# c' d
Скопировать код Класс для финального состояния монстра:% t/ N1 \" G4 V: f" p! |3 g" t
- // Пакет org.l2jmobius.gameserver.model.actor.state
! x, P. D/ s- C3 d - package org.l2jmobius.gameserver.model.actor.state;
5 c% _9 x6 T" P% `
0 M1 d Y9 h" K3 a; X9 W: Z- import org.l2jmobius.gameserver.model.actor.Monster;9 ` t3 W# `) E5 d5 ~
- m' O( X7 `5 q3 `+ W5 C l# m- public class FinalState implements MonsterState {
9 @9 a9 A3 @" a+ \! e. u - @Override% S$ `/ n% `( r/ I2 ?5 @0 G
- public void handleState(Monster monster) {
' O+ R1 }; H. O6 W! _ - // Финальная фаза боя
$ m P+ e0 n8 X' S/ {4 o4 i - System.out.println(monster.getName() + " готовится к финальной атаке!");9 W: R: |# v0 w- g ]$ q3 i, F
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
9 t1 H% f3 C Z7 u; C+ J- Q - }
, ^% a4 e3 x2 h* c& @# d - }
7 d( Z( h' A+ U2 y( g, [7 a" h4 W) _
Скопировать код
n1 `6 x' o- X: @% [1 z# C/ pШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
) ^& G$ ]6 k0 M" {& C" t- // Пакет org.l2jmobius.gameserver.model.actor( N' M6 r) n# S7 [' E: ?0 C. U) s
- package org.l2jmobius.gameserver.model.actor;
$ W8 ]& r1 {( ]. S - ; t$ y5 a0 q9 f( \
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;# K; s: c! V8 B3 V7 i' |$ i
- import org.l2jmobius.gameserver.model.actor.state.InitialState;$ W* r+ x# Z9 R; m3 Z& h5 `
- ) b- e( F6 q4 J8 A
- public class Monster extends Creature {
C4 z! c& C: |1 W( ?1 u; p - private String name;
, P; Y: J+ F5 q. X+ w: n; s$ ? - private double attackPower;
' n/ ]. |5 {( i ~: t. s - private MonsterState state; // Текущее состояние монстра
8 ~4 `1 b% O: J* _6 H6 Z - 8 ]7 V0 |* B' C5 D8 `- ]; p5 m
- // Конструктор монстра* _" Q9 o3 s9 t7 C; J' L2 a
- public Monster(String name, double attackPower) {
8 p% _& w4 l- B3 ` - this.name = name;
, Z; z9 A c* M - this.attackPower = attackPower;
5 n, f+ ^6 P( f' E) I3 o - this.state = new InitialState(); // Устанавливаем начальное состояние* ~! h9 m( b$ Z$ E
- }
# u/ H/ [7 {7 @( |0 ?' J4 b/ A" M
4 y+ C( U/ ^+ M. b- // Метод для смены состояния K& v/ B. C, a" B$ A
- public void setState(MonsterState newState) {
3 d5 w% c8 M- |* k - this.state = newState;3 m: L1 s% w" J; H, d* W3 v
- }
Q+ l v* M' {. a4 ]9 d- P
1 g1 D' U) |; l2 r" t- f5 E- // Выполнение действий на основе текущего состояния# a% Q" ~( Z4 K- x8 P$ C, U* R
- public void executeState() {
+ ]1 e* t G# h1 h4 j! a* K: ?- ? - state.handleState(this);
+ P2 R+ j' O, j. }4 u( Z3 S2 }$ y - }
# X1 c: j) D9 Z5 |4 g" c - 7 {( L0 d5 z* q9 M
- // Геттеры и сеттеры6 a+ h! ]$ [3 Y ^
- public String getName() {
2 J. a1 U% p+ F9 |: T9 p* a - return name; V0 w! q& Y0 X# h+ d
- }
; n, e/ q- s! e - * [# Y8 h/ n3 S6 _
- public double getAttackPower() {- x: w2 o' o( _7 V4 m4 ^8 ~, z
- return attackPower;
' b3 p6 F+ v o% P) y( X# H - }& e6 t7 D8 G5 p7 u) K0 {2 U; ]4 ~9 K
; t; z- f3 M, X6 t- public void setAttackPower(double attackPower) {# e$ e S: H/ g5 X+ J5 d
- this.attackPower = attackPower;
4 T% u' P! V }+ Z7 d1 C - }9 ]- A+ m# Y0 t" h8 @- \$ `
- }
/ L; @9 M" L o3 c+ u1 _; g/ w5 B8 _
Скопировать код 2 P! O2 A4 x& n+ j+ Q1 Z
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
* S- e1 P5 u, c
9 a0 m3 e( g6 w0 k* b- // Пакет org.l2jmobius.gameserver.model.battle1 ]) Y$ s, o# Y+ s( b' h1 W( S, a
- package org.l2jmobius.gameserver.model.battle;# ?9 c. ~: }! i, ~# U
- - _) z2 U! q2 C! {8 l& y
- import org.l2jmobius.gameserver.model.actor.Monster;; ?3 s( g6 \$ D, o% V2 J' ^
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
! i% ~/ W% X: b% P/ T# x - import org.l2jmobius.gameserver.model.actor.state.FinalState;
% ]. @+ ~) L& m& f- }2 F; A: B' I - ; H$ v5 L4 d9 y- O8 X+ n( E
- public class BattleSimulation {
3 {/ M; e- d8 ^) @9 K7 _8 p - public static void main(String[] args) { s- w- D) Z3 o Q4 ?$ j" L
- // Создаем монстра с начальной атакой
, p, \9 u; r1 D( Y - Monster monster = new Monster("Дракон", 100);
# b) W* y! n4 l- B' V% | - 6 s" C1 w1 o, Y8 X( H% P+ M+ B n
- // Начальная фаза
5 _, I- {# |' G/ {3 w - monster.executeState();
6 C: q( L( a( @0 A3 D- e A - - ~7 Q* [- i! o4 v& O8 \
- // Переход в агрессивную фазу; A: c5 g$ x7 m" Z+ u! C3 f
- monster.setState(new AggressiveState());
1 o& ^1 d6 Y9 S' R - monster.executeState();7 _! z5 F6 r1 `$ j$ E# Q' O
- ) x$ b, c5 n; W+ j3 l' N' R
- // Финальная фаза5 d, ?4 O5 T) \8 X+ ^& x
- monster.setState(new FinalState());
( G; d; I. U/ K4 m: H - monster.executeState();
! b- M1 b1 \9 I, ` - }
7 M0 n/ d/ r$ s- v" y5 X/ q - }2 Y! r$ w' H# ?0 K0 O7 {( p$ e) [
Скопировать код
) q- V/ }: N" a% b6 uКомментарии по структуре пакетов и классов:8 B `2 ]$ q$ |5 V
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
# z3 t; b2 C# {$ r5 d1 n0 ?4 ?; k ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
# e8 m0 Q0 P% k3 V9 t# Y- f$ AЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
$ C+ F' G1 P8 X% i0 z; y3 p9 r# @4 B2 q5 g: F0 l
' I) i- {( ~! Y. v1 i- F. O* k+ e2 |, ~2 Z) C3 c
8 R" o5 t4 E0 A6 l, j3 s
q" L! k% W; J9 e: L& W' E( _- I; f9 W/ F. _
% h$ T1 I+ O6 C, O
# P4 J/ W# _7 ^- q7 j
/ v0 ~8 e' Q3 E! k4 D. G2 h
; B3 h3 [% ]3 D# X
' k0 ~) R D6 d& R0 h: G3 Y
; [4 G$ l1 S5 n2 h0 t! g: \, J
; N! g/ }4 C; a( X& G
9 y* E; i/ @' K |