Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 5 t& @6 I5 P8 E) t! J
8 k1 a7 k0 J* r! ^. q
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
$ L! O% a: c8 J& O8 z9 `! a# s5 R8 w6 R& l- a- D
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
( w4 i( o9 \0 \7 P
7 H: H }+ ?3 v/ {- // Пакет для состояний монстра: U& b# H1 k; b! ~: A1 x
- package org.l2jmobius.gameserver.model.actor.state;
, z; {- ~. L6 ^0 F0 f - 2 ~# m: F6 u- R
- // Интерфейс, представляющий состояния монстра, K8 `$ o, B5 E' X1 B/ Z" t2 L
- public interface MonsterState {5 j* l4 T& _/ y0 O, R
- void handleState(Monster monster);
* |% h Z c2 @* N* l' T - }
) U2 R: T9 D% p! h
Скопировать код
9 t' W2 |' q# c3 ]% V7 BШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. : ~7 L4 k6 i. {& J2 O
. A! U9 ]2 k: G( \6 N5 d$ u/ VЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.8 t$ d1 B( J# ~/ A7 L7 ^
+ k. q5 W [; Y9 D2 FКласс для начального состояния монстра:
9 F0 e9 b5 }2 p3 R5 V- // Пакет org.l2jmobius.gameserver.model.actor.state" o7 q8 m6 F! o( Y7 F1 x0 g
- package org.l2jmobius.gameserver.model.actor.state;* i& X/ Y) S0 \8 M; Z* r% f! H" K
- - \$ S+ c8 [% w3 n9 Q3 f. g+ c
- import org.l2jmobius.gameserver.model.actor.Monster;
8 n& `( |; Q! G( G
7 Q) s, r0 P/ O# N4 }1 I, t4 Q- public class InitialState implements MonsterState {; L; t: a8 m- O6 j- j4 z9 z0 c
- @Override, y1 v7 M: j( Q5 `, o
- public void handleState(Monster monster) {
( d% s; A& L3 n# F% R3 {, a - // Начальная фаза боя( j/ m4 x/ G1 [4 d5 M* Y
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");
! P; `. q7 E, J6 Z& t+ _4 J" U3 G - }
3 I0 O5 x7 j, q& ]# ]0 u9 f! m - }
. j* h0 x% v" T* F! W8 J& O
Скопировать код Класс для агрессивного состояния монстра:
/ _6 z; h$ D J( b: Q v* f; `- // Пакет org.l2jmobius.gameserver.model.actor.state
\" e2 k7 d0 i9 ^ - package org.l2jmobius.gameserver.model.actor.state;
/ U* E9 i! J/ W& ] - . k4 Q" c% v6 T" q3 q/ ^& B# N
- import org.l2jmobius.gameserver.model.actor.Monster;: n6 r/ B. X+ n% Q3 \
- 7 M* X. l, V) y
- public class AggressiveState implements MonsterState {
8 E7 F9 M! @$ h. l+ w) {4 O - @Override P5 K |- x: e+ ~3 y/ R
- public void handleState(Monster monster) {
[2 k. d0 M: S% g - // Агрессивная фаза боя% L. O9 E8 ?1 ]8 c+ H
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
) x2 g0 \+ {$ V - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки9 \ i0 I4 m5 z0 S& e! {# ]7 u Y
- }
% j6 A" p" Z9 c- Z - }0 a% u( A& e- Q" [' }
Скопировать код Класс для финального состояния монстра:1 V1 l$ \4 m0 h2 s; S$ M# S
- // Пакет org.l2jmobius.gameserver.model.actor.state! o; w5 V; |) b
- package org.l2jmobius.gameserver.model.actor.state;
, w. I( ]& {3 o# e' x+ i: u - / {3 ]: [4 |* j- W
- import org.l2jmobius.gameserver.model.actor.Monster;
: O- U+ g2 { X2 B/ R1 ?! j X - * r0 u( O- p1 B, d- S0 Y
- public class FinalState implements MonsterState {
( A6 Q0 s- d7 M! J+ c( e - @Override
6 ^# a8 A9 [* N0 N, H - public void handleState(Monster monster) {$ S1 v+ i! T0 f1 s" q
- // Финальная фаза боя5 f/ J9 z0 u! V# H5 L
- System.out.println(monster.getName() + " готовится к финальной атаке!");
+ i. a3 `/ U0 P6 `' o6 ~ - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
5 _+ M! H* B, ~ z; ~; a - }
# @4 T, m$ V/ r9 X7 r7 b - }+ G# u. c- x/ D* B
Скопировать код ; r/ r/ s# H/ x6 C$ | {# \
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
) I7 u! q& R' |/ i- // Пакет org.l2jmobius.gameserver.model.actor0 F0 x& e3 ?7 {
- package org.l2jmobius.gameserver.model.actor;# N) d: U$ y" S6 j. P D# ~/ Z3 o
- ( p; S# M: U5 j( K0 |7 y
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;+ q3 L4 k$ u+ l5 h9 X% T5 G, B1 Z
- import org.l2jmobius.gameserver.model.actor.state.InitialState;
; P* {) L& U4 `% W
4 d( j/ S3 Y. y. o1 h- public class Monster extends Creature {
' l4 U6 H' ]2 P/ M/ j1 }& \- H$ t - private String name;" F" D! r' K7 w1 }3 y
- private double attackPower;
{* K, t8 W h# ^9 V - private MonsterState state; // Текущее состояние монстра+ u* d' y7 o& b
- / u/ m/ P @$ W, R! ]# \
- // Конструктор монстра9 P" @0 G* O; l3 \7 J: E% {
- public Monster(String name, double attackPower) {4 ?, f1 I- m1 L7 n+ Z: i$ V
- this.name = name;
2 h8 f1 n R. j: a; \ - this.attackPower = attackPower;
+ c, l* r0 V( t- y1 G - this.state = new InitialState(); // Устанавливаем начальное состояние' M1 [: E6 k1 r6 g$ N8 t1 n
- }
, U+ `1 l: a. B7 g' l/ _/ a
" N8 s7 w) Q! h9 c0 s- // Метод для смены состояния
! T7 x/ l& c; n" }. @/ \ - public void setState(MonsterState newState) {
! b6 w7 d! [ ]# {* q2 `" U! S - this.state = newState;
# h& @: h' B( ~' K7 O) N5 G - }
* m1 I+ m& c: P/ f, b5 K
* N7 i' k# X9 u. N+ r: W: ?- // Выполнение действий на основе текущего состояния
, R2 }; u+ ^* p7 R& P - public void executeState() {
1 m4 X) j) L& S5 C5 b: o( c - state.handleState(this);6 ~$ b$ l7 E4 l0 |
- }
% c/ A, a0 u" O# l2 l8 f7 H - 6 e/ D" I3 P0 K
- // Геттеры и сеттеры
+ z6 ]$ N' i5 R2 ?* i2 {% n - public String getName() {( H8 R4 v& Y! O4 T5 c
- return name; U9 v$ L: @8 m. N
- }; V0 V: d" f$ ^8 R6 k4 @& j
0 w$ {* q6 @/ h: F- public double getAttackPower() {
9 y9 c- Q# z/ `! D g2 L - return attackPower;
1 Q* B. `' s6 W - }
' r7 B4 f0 e# p - % @ b4 M; V0 W# S0 n" s7 }5 O
- public void setAttackPower(double attackPower) {
. B; v$ l7 ]+ G- X - this.attackPower = attackPower;
7 M) m3 k: J5 G5 d( ?" A - }3 `/ q6 [' U7 L- l2 R \
- }
7 L7 H: u5 x4 H0 ~- @0 a$ K
Скопировать код 7 H* S" a2 P( m4 K& ^1 D
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.0 A# ~" u2 O1 l# j; {$ @9 l& y0 a
8 q" C2 f; {* e- \) @1 b* i) w- // Пакет org.l2jmobius.gameserver.model.battle
0 o0 v" x; N; x: | z5 j$ o - package org.l2jmobius.gameserver.model.battle;2 P7 Y! L, A" {- [( z' V0 L
- 5 s6 O N0 ]2 {$ L0 D8 L
- import org.l2jmobius.gameserver.model.actor.Monster;
* @/ q5 a5 M4 |+ p - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;! i# \, d$ k8 t& b7 l! O
- import org.l2jmobius.gameserver.model.actor.state.FinalState;
: @8 d0 y! e) e& h1 S3 f& O; Z
$ v' u& l" }, P- g% f- m( d- public class BattleSimulation {
* ~$ Y. O% X4 w1 p* H$ A - public static void main(String[] args) {- ?* e0 k+ Q& K) r, v Z( V+ x
- // Создаем монстра с начальной атакой2 o, p! I0 v8 c% V+ O& w e7 H
- Monster monster = new Monster("Дракон", 100);. v+ k* B; B) M* C
6 Y' i h8 B1 x+ X: X s4 k. _- // Начальная фаза
% [0 [, ^# T6 Y5 `) ~ - monster.executeState();9 M3 s" M5 N; R2 ]5 d1 k7 Z
" k- r3 @* `/ S, ? F3 L% l# F- // Переход в агрессивную фазу J' s$ R( \; X0 G& P: w9 L, b7 l
- monster.setState(new AggressiveState());
7 O) z- |4 @* G9 j0 v - monster.executeState();
( w' o/ D h7 [" N
0 v( X, k; P2 {" `* g$ D$ v- Y& e- // Финальная фаза7 ?- [4 o% a5 [5 [
- monster.setState(new FinalState());' {9 W9 q$ V: o7 J
- monster.executeState();
4 _/ _, G1 l8 d" h* q) r, j - }1 ^' P9 X5 o1 o
- }
2 {7 n1 n9 N+ x+ y4 B* H5 T
Скопировать код 2 F7 ]' v. u9 S0 q$ Q* {
Комментарии по структуре пакетов и классов:- g8 O+ t$ v3 U
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
4 g4 N# `5 n8 A; X$ {: ]5 L ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
4 z2 d/ w& n' L4 NЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!+ U. k. b. [- T( x
% I4 k0 n+ g0 d' d0 H
* \) i6 r& v+ w! c: s6 N
' p4 N5 u# D V+ b% d: E; {; p& j
% O7 _; [. [% o8 i9 I3 d B" @! ~6 ^: ~
! W- T o( a5 s+ c0 ~/ C
# C2 F, K( o/ f" v7 l: s- L/ [
* H0 d( Z: w( z' a' P; q
2 I" q6 e0 [- E0 x" ^
9 _* H! c h7 Y7 x- ?: |$ [0 ^0 y, i0 c( C" E0 h3 ^
! q+ s+ U3 D$ Q; W' j
0 H; O, S5 G9 C! |
: A! M, Y8 H: Q% u |