Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
6 a2 ^$ |( {2 j( Z q0 F, H- @7 z3 k% c
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.. [/ j$ f* @* R* T6 o& N
9 z L$ m9 D# O0 Y$ C' J8 v# s! Z
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
% a6 M/ f3 U V) d+ C5 g
% o2 ^2 B( `7 i) l+ N# a- // Пакет для состояний монстра
5 U# i0 V5 E$ | - package org.l2jmobius.gameserver.model.actor.state;
$ u3 v- U0 K9 i# | - ; E$ V3 `! c. e+ C
- // Интерфейс, представляющий состояния монстра1 ^1 [2 ~) W; R6 W2 `
- public interface MonsterState {2 c. z+ `1 y- {$ Z
- void handleState(Monster monster);4 M# w$ G9 c0 Q# ~' L, L: r. o
- }1 G7 _: z' _" W
Скопировать код * m8 O' ?1 \0 k ?& W, I1 Y1 M
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
- L+ w `( }! }* I/ P% G( p4 T2 E' ?* o
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
+ }" O- q$ f# f8 \
: g0 z- [, C1 L% M1 c3 [2 }: ZКласс для начального состояния монстра:
8 w1 s$ B( ^+ |& N7 U9 H5 V- // Пакет org.l2jmobius.gameserver.model.actor.state
. b0 m) x" I+ n - package org.l2jmobius.gameserver.model.actor.state;( f. F0 {5 T' G" T. m
- 9 q9 h& h3 V! N& U B K
- import org.l2jmobius.gameserver.model.actor.Monster;% I9 m# L/ N& u0 g! {
: S4 _. @6 @6 S' G" h- public class InitialState implements MonsterState {
( X- `8 A5 M6 i, m - @Override; }: E _0 q. F1 b
- public void handleState(Monster monster) {; ]/ e+ a% t! h$ v
- // Начальная фаза боя4 m; j: L- D) o3 z V2 l' f$ m4 _- [' U9 g
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");8 S# R) f& W2 T2 d7 M, C
- }" d0 g# t6 c5 M" r( M( C5 v# `- F
- }2 U' X# T2 J4 y, C) P' @
Скопировать код Класс для агрессивного состояния монстра:
8 L5 Z2 N( p9 ^8 v( C/ N- // Пакет org.l2jmobius.gameserver.model.actor.state
, I) N) o/ `* G. r% k- `( z; }6 ` - package org.l2jmobius.gameserver.model.actor.state;
" p0 j2 g6 {1 i1 a8 b
/ J7 E& g' n) ?0 F7 ]- import org.l2jmobius.gameserver.model.actor.Monster;+ x- v+ |# o' L1 w/ w q
- 4 o3 D2 Y( y4 C8 A% X' l" f
- public class AggressiveState implements MonsterState {4 r3 o; I% \) B9 S) M! f, r
- @Override
" E; b. z7 r0 X - public void handleState(Monster monster) {
& x) Z' Q4 s9 Z/ \% h f - // Агрессивная фаза боя4 [( L2 x* }. w! D
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
3 u: \2 l' c; h3 ^8 _ {2 w - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки5 v( e5 f$ K+ j4 v6 \7 L
- }! r. X2 Q1 U; w6 T1 ~
- }
4 a4 L6 Q z* o2 K0 {
Скопировать код Класс для финального состояния монстра:8 I% C; [( o# o7 |) u4 o
- // Пакет org.l2jmobius.gameserver.model.actor.state1 p# D& L' \( ]9 u5 D8 s3 \; I
- package org.l2jmobius.gameserver.model.actor.state;2 J# k) b8 ?, o. e1 ^4 f4 ^0 a
- 2 c& H. | m } T' X6 X
- import org.l2jmobius.gameserver.model.actor.Monster;
B) q) m- _/ s# Z+ k9 k) \
4 u* h8 _# O# z9 H f' p- public class FinalState implements MonsterState {
: |: J8 n; p8 A - @Override
/ h1 I8 x$ g8 l7 J4 A& C: t: ^ - public void handleState(Monster monster) {1 Y& F4 e% K$ I I" G6 Z2 J% n0 h
- // Финальная фаза боя* {* f+ t9 p# J3 C9 A- g
- System.out.println(monster.getName() + " готовится к финальной атаке!");; k7 {, q7 k4 J8 h) V8 M
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки. i0 Y* E& o+ @% V( X4 ~0 H
- }) y1 ?- b, l( [! B. w" f
- }
; ?- M0 d- B' v$ ^# O4 I
Скопировать код
. \$ K8 W f+ L/ SШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
7 g$ f+ Q- k) Y8 T2 M- // Пакет org.l2jmobius.gameserver.model.actor& h* ~6 h, y: M! o$ t% e
- package org.l2jmobius.gameserver.model.actor;
% L( y% G/ z8 t
6 S6 `3 P8 @3 Q/ {( ]5 }: |- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
5 K4 N& F+ x7 P6 p2 g1 ]& w7 i - import org.l2jmobius.gameserver.model.actor.state.InitialState;1 g- p' j6 n0 {4 t
- + G# K; @0 V- G; e: z
- public class Monster extends Creature {# I R; W0 `/ m! L5 h" C
- private String name;
& @6 _4 C/ M( s! Z& X - private double attackPower;
3 `$ {4 E3 z' J+ K4 ]0 p6 W( V - private MonsterState state; // Текущее состояние монстра
a1 `$ Q% t: N. B$ p+ ] - ) b9 R" O6 X9 V% _6 r0 u% I
- // Конструктор монстра
! N9 }3 U6 m7 s% v - public Monster(String name, double attackPower) {; I1 H1 a; Q ?* J$ w2 c" O
- this.name = name;3 `5 {& n9 I. w3 `
- this.attackPower = attackPower;8 D, A, P' z5 P: ?4 Q
- this.state = new InitialState(); // Устанавливаем начальное состояние, J3 s* g' Q+ u( _
- }+ N8 m, r" m+ M5 h0 ^% m; i: `& F2 g
6 g6 f2 r7 K# W! k- // Метод для смены состояния$ y% T* }4 Z; r! [
- public void setState(MonsterState newState) {! J( u. C, g, m9 X
- this.state = newState;
C3 F: C3 u& j, o5 R/ ^3 ^* i7 { - }
! M1 W* r/ ^! j) z2 `, `9 T3 O - / L) b9 j1 s: z1 J
- // Выполнение действий на основе текущего состояния9 @! V9 t4 r. V$ _
- public void executeState() {2 K: l' Z% I& d( X
- state.handleState(this);
3 j, s- K! @$ }9 w8 g - }
" M& e3 A' v ? i" a+ h) F1 K: `* x
8 L" w$ J1 r, B) ]- // Геттеры и сеттеры8 i* y; n8 J6 l* L. W5 N7 r
- public String getName() {* O/ T& s2 h, z {
- return name;5 ?; ]4 d- _; W$ T$ j
- }1 J1 W+ G( g; p: h
- 8 k0 a, b2 E8 K* v$ N7 M' z. {! j/ Z
- public double getAttackPower() {, n" {8 P2 k0 i
- return attackPower;
; f' r6 r+ d3 S& U2 C R9 E - }1 S }3 i' {- y0 t$ M$ G
- ) H& f2 D5 e+ P- k
- public void setAttackPower(double attackPower) {
( Y- B, |4 h6 a9 _: D- w$ E3 T - this.attackPower = attackPower;6 D. I8 K3 r C i+ L1 e
- }
# M) M% w* H8 I) O1 { - }! D4 ?# S, Y' ^6 r
Скопировать код
, }: p# i/ n- F6 d7 c. CШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.! a2 k4 Y/ P) }& Y& k9 {3 L
! I2 R2 K" g9 M' O4 {! y7 y. M- // Пакет org.l2jmobius.gameserver.model.battle Q1 G$ S9 H# i5 S- W
- package org.l2jmobius.gameserver.model.battle;* K- m ]* K2 d7 A( {. j; d' V
- 5 M7 K$ Z: {, X0 F9 q
- import org.l2jmobius.gameserver.model.actor.Monster;
4 p# l& G* d7 T+ f/ G/ W. Q r - import org.l2jmobius.gameserver.model.actor.state.AggressiveState; p9 ]$ Z+ j" i) @; Q r
- import org.l2jmobius.gameserver.model.actor.state.FinalState;
x, d) ~' C7 N* m* `
' |9 r0 _ v& K6 C, [- public class BattleSimulation {
3 { v }; u/ g4 w) U/ K+ Q5 l - public static void main(String[] args) {( H; a6 Y K1 Y7 W! y7 P; b: z( x
- // Создаем монстра с начальной атакой
& @5 I v' `8 s9 d- \* v - Monster monster = new Monster("Дракон", 100);: W- A9 F9 T! z' z+ K7 [* Z
0 T6 i8 p2 i0 S6 j, q- // Начальная фаза, T( j, q3 ^/ U% b
- monster.executeState();
) c( U ]0 u$ m# d3 u- W
" ], o( g. E A& e4 D! P- // Переход в агрессивную фазу
3 O0 }) ^8 H7 y" P# A - monster.setState(new AggressiveState());
4 D. c0 _! d- F" t" z2 G! t0 H/ [- A - monster.executeState();
, H/ L( n/ V5 i) q9 q5 y
. C) K" u! J) Y% {- // Финальная фаза1 P" K C3 r& B% p
- monster.setState(new FinalState());2 t7 q2 m1 M$ N+ L1 w
- monster.executeState();7 A( `! a. y, R" \
- }- [' F7 j/ Q, @- A. V
- }) Y3 J4 v6 e3 v' ]! D
Скопировать код ; z) b% L$ V8 v; E
Комментарии по структуре пакетов и классов:
) h; Z {6 W# Z7 f- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
. X3 L x+ n% e# a ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.) f' Q$ U; y/ R4 E
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!# Y" J3 ^8 _$ d! p' S
5 y y# P* e: ?0 w
9 Z* O1 ^5 s. m1 c1 M& T7 z
; A5 Q4 u: @( ~5 Y( C# ]- j! x) }# P; _7 n! p1 z$ w# _( _
0 m' I8 H, i* W* ^- x; j
- q' I! S- r3 G+ f A7 L \! b7 Z& h+ g! o
+ V! x, `% C& ^$ n9 j
1 |6 a6 t% c% N7 m" k
; P* E- c: w& b: E
& a( D$ k0 P9 j" ]: n- M( d# i5 P; [# b) E* ?: `/ O: C! o
3 n7 |, U4 O3 @0 c' \
+ }/ Q- `2 b( H9 `* ~ |