Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
8 ^0 D9 Y/ Y' I- O' N, s. j- n9 c7 x0 w
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
9 t3 n- Z) A) v
( n9 g" h$ C- p+ |5 FШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
0 W$ s/ @0 R2 E9 C$ A; @
8 ]2 U( F* I8 A* d4 M- // Пакет для состояний монстра1 ~- w T8 H# L" l# b3 E* k; R
- package org.l2jmobius.gameserver.model.actor.state;# S+ g W" o; i9 V X* h2 `+ a
- 4 f: e/ R* L8 V6 K7 c! W% a; `
- // Интерфейс, представляющий состояния монстра2 P ?. G- D) v$ D7 ~
- public interface MonsterState {/ w3 l) O0 o# u
- void handleState(Monster monster);- e& R& w) H: Q5 ?. n) i& ]1 U
- }
) \! B6 T! N- E$ h2 ?8 {
Скопировать код ! X6 F( x) N' O1 [- }# [
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
* {; `7 g' _. T' B! y* l3 t' P% y. V( A% P- t5 q7 o
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
" u8 h# G% Q- v/ F' k( ]. a( a
, ]' n/ c t' N& N% DКласс для начального состояния монстра:
! e! j* x8 A: @# T- // Пакет org.l2jmobius.gameserver.model.actor.state w# Q: n) g+ c- M0 o$ }; [
- package org.l2jmobius.gameserver.model.actor.state;1 C1 K' G" l' X W7 C# H6 w
' c) s' t1 Y: \/ Z- import org.l2jmobius.gameserver.model.actor.Monster;0 ?" V7 H: d# j/ q" Y
) v& v2 _9 M% V6 A* ~5 X$ m- public class InitialState implements MonsterState {
& |, s5 h( W- b2 L. M2 D - @Override9 b/ F9 z( C+ s0 t
- public void handleState(Monster monster) {4 {( u% q: c3 S4 r; m" ?& C0 c* G
- // Начальная фаза боя5 V4 V6 O; \% Q! X0 Q5 I
- System.out.println(monster.getName() + " начинает бой с обычной атакой."); R' Y, k; p5 w; b( L1 ]& R
- }" g/ F5 J8 s2 U: I
- }
3 d6 P m5 g+ f' r5 |- g
Скопировать код Класс для агрессивного состояния монстра:; V% \ ] h Y) z W
- // Пакет org.l2jmobius.gameserver.model.actor.state/ z; L3 {% o( X2 C, f3 \, Z
- package org.l2jmobius.gameserver.model.actor.state;
B( R2 i& ^; V) E, q. f4 [
n( i% l4 T0 s/ I6 m- import org.l2jmobius.gameserver.model.actor.Monster;0 U. n8 B) s& U/ e! g( s
) _, h+ p7 g- t# Y$ J. X% A" V- public class AggressiveState implements MonsterState {4 X) G, d3 e% Q; Y/ g
- @Override
% Z/ J0 t8 E7 A* P - public void handleState(Monster monster) {) H4 t# l( h" x# L& j; l9 ]
- // Агрессивная фаза боя
7 p* p% B: N+ @; V - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");5 b1 {3 i+ ~) K. `9 {, u9 `
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
z2 ]( D- `$ z7 a - }
/ _. j- U" L3 Q# j$ e" T7 M0 S0 V - }7 I5 u; Y: B8 _" u; l
Скопировать код Класс для финального состояния монстра:
" D- O1 D+ Z! e( I( q- // Пакет org.l2jmobius.gameserver.model.actor.state
, ?5 r1 R( o9 O, H - package org.l2jmobius.gameserver.model.actor.state;# Q+ k1 c" o2 b: I8 P
- H* C' m/ F3 `- import org.l2jmobius.gameserver.model.actor.Monster;2 V, N2 n- m; Y, j# {# ~3 o0 H
8 f% {, \9 x" e$ K: V& w' R- public class FinalState implements MonsterState {; G& _6 p' ^, u8 ?
- @Override- `% y) V: i% x, u
- public void handleState(Monster monster) {
' L: c* J" Y; Z$ h! ~ - // Финальная фаза боя
* [- X5 L/ w& s - System.out.println(monster.getName() + " готовится к финальной атаке!");
; R& w s9 e: k; c+ I' G8 m" { - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки5 U# A/ W4 a1 h7 L. J
- }# c. p$ k4 O" X" m* Z5 W9 r& t: C& @0 T
- }5 m" ]- K h. ?1 R1 ^1 d
Скопировать код
* s- Z* Q+ i4 x9 v8 s1 KШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
: @8 }3 n6 f* Y3 v, T$ ^* T$ y) W; q- // Пакет org.l2jmobius.gameserver.model.actor/ [& B1 z0 X& `0 O6 ~% w# \1 G% j
- package org.l2jmobius.gameserver.model.actor;
9 C% l5 r! m# F4 x T
! I d, ~1 U8 j$ ]- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
5 R4 o: N6 P8 E _& a- X' m3 d5 l - import org.l2jmobius.gameserver.model.actor.state.InitialState;
1 X1 h5 n+ g6 S$ {: Q - / W3 p1 L" R: R: H
- public class Monster extends Creature {
" t6 B6 c, }- T$ \ - private String name; M9 Q2 }% z2 p) p
- private double attackPower;! W) O# x8 E! K; O. L* ~' b. x
- private MonsterState state; // Текущее состояние монстра' t* `# z+ F( ~4 o
. T' P" |: a5 Z3 ]0 r! Y0 B- // Конструктор монстра
8 T3 V* r3 e$ F2 q8 ?, p r- } - public Monster(String name, double attackPower) {
+ k* q2 [& R# S: M1 J4 G, z - this.name = name;
7 q4 T; `; J/ Z2 f, I# d - this.attackPower = attackPower;& Y2 a' x6 J2 m0 J/ u% s
- this.state = new InitialState(); // Устанавливаем начальное состояние, m7 n$ ~5 e1 A% b- u
- }
9 [7 V: u$ ?" X% @$ k* _ - ! y5 V8 {: S. v- g# ~# t
- // Метод для смены состояния
, _3 ]; w1 z/ K - public void setState(MonsterState newState) {4 M8 e9 P' A4 N& Q. B5 t2 A7 A Y
- this.state = newState;7 I9 w; M' T6 @! C) u0 k3 D( W' W" e
- }
$ ~: r# m9 v, ^' X& b - 9 f( n8 D8 z9 P; t: S T1 Y
- // Выполнение действий на основе текущего состояния
\% `5 w6 J6 o' e2 g8 X - public void executeState() {
! j: D) K6 {* y/ t6 }3 G - state.handleState(this);
3 F* W0 d: _: c( _* L& R - }. x/ A' q8 r/ q2 w5 T
- " a+ E5 z% I0 h& F# _$ Z
- // Геттеры и сеттеры
& D. r$ R/ q1 X. T8 D' k - public String getName() {
6 K N+ K2 [* l3 K1 c, ] - return name;
3 h. k, q' x" ?' V5 n# M - }6 l V# x9 i! j/ g( k0 r Y( d
- " ]$ i' M% R2 Q1 j8 O
- public double getAttackPower() {5 s7 ?/ s! G- e( |8 @# T- F7 v0 S
- return attackPower;
4 E1 s" N n/ K0 M4 R/ ] [( U) ^ - }
$ e/ Q& `7 b5 h5 E. O8 ~' z
3 `' |" I# ]" g; ] S- public void setAttackPower(double attackPower) {9 N9 k* e. r( D. h
- this.attackPower = attackPower;
( ?2 c) t0 J. h1 R7 [ - }
/ Z1 @0 K* p2 t0 `, H - }
7 X- a" M$ B' N) B% G9 \9 d
Скопировать код / B* {7 `& k# e% D1 N& t+ `2 q' ^
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
) C' i# u- _/ r/ U! Y7 X3 ^
9 ]) ?, M& I n2 u! E5 b- // Пакет org.l2jmobius.gameserver.model.battle
' w% c* T( x% w3 Y! G# v3 x& w. I - package org.l2jmobius.gameserver.model.battle;3 S' \9 m' I2 g4 f) ^* {5 g
- : W! \' }" w6 |* ]5 G
- import org.l2jmobius.gameserver.model.actor.Monster;- J; {$ i) b3 y7 B
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState; w. v4 a' R7 \8 ]- r
- import org.l2jmobius.gameserver.model.actor.state.FinalState;
8 v. P9 t: @! q - # q1 ^: x; t8 v( N I, @3 l
- public class BattleSimulation {: r+ [+ P8 e( B3 R0 o
- public static void main(String[] args) {5 K% P+ k5 f9 }9 N1 c
- // Создаем монстра с начальной атакой
. b- K* l1 Z. d - Monster monster = new Monster("Дракон", 100);
7 b/ H4 c" h t9 p5 |/ k - , w; m7 m% f" E. \( c [4 l( V
- // Начальная фаза
1 V/ T+ q. Y- C8 m - monster.executeState();
. x: Q0 B7 d" k* X: W7 @. p
- W5 b: L! \& k: @: z- // Переход в агрессивную фазу& T! X2 r" O- H7 }0 f; X$ K
- monster.setState(new AggressiveState());
- j( m- S, g% r1 h - monster.executeState();" I0 f8 A0 _8 [" a% B6 |
1 [5 R+ h/ Q5 _# @7 Z- // Финальная фаза5 h! L/ _" C6 E, R! T! E
- monster.setState(new FinalState());
+ B. L$ ^4 F9 J - monster.executeState();$ y0 X' ^ L; g0 A% M# x
- }
! ]+ R1 C& v, c: o* I- c' J - }
: g; O+ g4 _8 t, ^' M, u/ K: c
Скопировать код
. a8 X7 j7 x7 G' K; ^Комментарии по структуре пакетов и классов:
2 S( E* n9 q$ D2 d- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.' c2 c: u9 w) C q4 e' H
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.$ P/ k7 a, L+ S
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
2 C' v+ Y3 C* F
9 @- _ y. o0 v" H* o# B1 w
: g$ [! ?3 |9 p( k% M7 y% W7 q7 V! c- s3 s! o3 H
2 o- O+ D# R( ]" X1 _3 P
& u4 ~8 u- u* x/ b5 ]9 V+ ?
# W& i4 S/ @% l! S, ~7 ~8 r8 Q' c8 a, q9 H
- A) D3 a( f; M& w- I1 b
# R; q5 f: I" y) ~
: e- z8 i, w! a. s1 `
& W7 `- F6 Z! k2 x: M" P& x
( a9 X/ [; ^$ N$ N
! N* v1 Y3 A. V- A& I: i/ j v8 w) A6 ^9 O7 [+ z4 V9 G& Z! D
|