Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
9 Z$ `5 E4 M& b7 z7 ]; \ W* T1 c# E
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.1 k$ X1 ~) c/ h# V5 a1 B4 E& f2 m) o
. e- z, ]6 a+ j ^; e% ^4 jШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.$ @- p$ g# Q+ n
7 V1 ]6 R0 [$ `
- // Пакет для состояний монстра) {* t$ T+ _0 A' ^1 }; x7 w3 ?4 P. ^) b
- package org.l2jmobius.gameserver.model.actor.state;
% c9 l) J& b; ^5 {8 h - * c8 N9 W( x. h3 P+ m0 H6 S u7 k
- // Интерфейс, представляющий состояния монстра
b0 L* K# i& c' l - public interface MonsterState {; R* H- ]& ~" B, D! Z
- void handleState(Monster monster);
1 g" {+ D; a! I! @6 J - }+ f& E& k9 N3 B6 Q
Скопировать код ; h0 T! G- P6 |, L" m0 U) V, h* R
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. ' t- T2 b" a, m0 G; Z) r8 H Q
% c8 U/ K, `5 D* [8 I3 }Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.* o9 F0 i5 ]* v- n/ }& i( H
: m! a u" Z. s. |; e1 J" y, z
Класс для начального состояния монстра:
7 ]/ d2 k# v% X0 ?- x4 D- // Пакет org.l2jmobius.gameserver.model.actor.state$ v; |, m) d! x' `$ Q0 o+ ~8 K
- package org.l2jmobius.gameserver.model.actor.state;
' A9 i- t3 _4 d( X- X
, N' C+ _3 E; l+ x- import org.l2jmobius.gameserver.model.actor.Monster;2 T& F* v* ]( U F5 [
9 C" _% f- t/ c" @ ~2 i- E- public class InitialState implements MonsterState {
% B) A2 A$ {* q - @Override
- p1 ^( t: v' k9 ?, w8 `+ g - public void handleState(Monster monster) {
8 b7 L1 e; k( p/ f) z5 f# A3 R3 E - // Начальная фаза боя8 \7 m6 r6 p: \: G
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");9 k$ Y3 i: t0 k, r; o
- }
) V. P& `0 I; |( i - }
3 z3 W" O+ x+ Q& k- _5 d& P
Скопировать код Класс для агрессивного состояния монстра:
9 `* H6 d- \* { l- // Пакет org.l2jmobius.gameserver.model.actor.state
; ^! X b6 w3 s: a, S - package org.l2jmobius.gameserver.model.actor.state;
( P8 K( {9 v4 B
. u7 ^2 f4 m. {) a' u9 n9 e3 L- import org.l2jmobius.gameserver.model.actor.Monster;/ z/ J% q9 z9 Q% y: k5 y7 T
+ |, d( P) V" o5 N; t$ ^9 x- public class AggressiveState implements MonsterState {4 e" V! e7 T5 z, ~) R+ R* y' i
- @Override
3 x+ T) d* [, o8 u0 c2 U - public void handleState(Monster monster) {+ H9 ^- O# W- ^& x6 [, @8 y
- // Агрессивная фаза боя& |8 {! u$ d! Y& `& O
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
# ?8 [! R9 ]. K- Q8 z# y+ C5 [/ _5 a5 r - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
" ?/ ]; }# V A, S6 F - }0 i7 `+ j8 Y/ R, a" g
- }
. D$ y# U! V! Y3 e5 ]
Скопировать код Класс для финального состояния монстра:
$ k4 @3 S6 R* i/ e- // Пакет org.l2jmobius.gameserver.model.actor.state3 u3 N+ M+ t# @* v
- package org.l2jmobius.gameserver.model.actor.state;5 _8 b$ _# e1 m! v. c4 t
: C5 n6 I$ Z, E4 ^1 w1 y- import org.l2jmobius.gameserver.model.actor.Monster;8 Z: J) |8 U2 [. M9 T2 A n
- 8 d- O+ \; U! ~3 o b
- public class FinalState implements MonsterState {: e( I# I; ~+ O5 J x" p
- @Override
$ h" t7 N0 O i' z$ I+ E6 Q7 [% e - public void handleState(Monster monster) {8 I# P4 H& k4 ^6 j" w% S/ u% v
- // Финальная фаза боя8 i1 {" z( _7 t7 z( W% x3 K
- System.out.println(monster.getName() + " готовится к финальной атаке!");
/ N, `% X- `) a - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
# o/ L, q6 {4 \# P" E# J: P8 r - }
+ c% Y1 Y! Z2 b1 @ - }7 c) E- G, b7 ~5 Y, X1 a
Скопировать код ) H4 G: J; r: a3 E9 t& z2 y0 D5 X
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
% {, m' V9 D& k! M# o- // Пакет org.l2jmobius.gameserver.model.actor( s, b5 A' X1 D6 k/ ]
- package org.l2jmobius.gameserver.model.actor;' Z0 I2 x0 j/ Y0 W
! j9 \) D9 }) n- import org.l2jmobius.gameserver.model.actor.state.MonsterState;& q- {9 W$ R2 ~" F
- import org.l2jmobius.gameserver.model.actor.state.InitialState;- ]% C% z Q) t, Y- T. w% @
- 4 V9 D; x* ~7 y d
- public class Monster extends Creature {
$ b1 }' S3 u, U! d - private String name;) ]2 C8 x" c% f6 C+ r; G
- private double attackPower;
9 s- \5 p; w% [7 q; t( s" R - private MonsterState state; // Текущее состояние монстра
3 r/ Y! {- p+ ~9 z" w+ d - / N# c7 r' v9 T
- // Конструктор монстра
, @: x! t# R0 p3 c9 q9 O4 D - public Monster(String name, double attackPower) {
6 S) J Q$ }! U ` - this.name = name;
- V. e9 o2 q, Q- X - this.attackPower = attackPower;! d4 ^/ {7 t% C
- this.state = new InitialState(); // Устанавливаем начальное состояние
0 C1 D' ~+ f) ?# ]7 F& Q- N5 |# v - }
+ n: u- j8 r" I% A1 h! L, p - 5 C) t. ^% p" \0 G/ r
- // Метод для смены состояния
, S* @) F6 G; `7 n* f - public void setState(MonsterState newState) {; B, N8 E! A$ [6 ^7 h1 C' h
- this.state = newState;
6 N0 E: a: Q5 x9 S d" ~. A - }
# X' {, K# p; r, h* e0 ?* e, K - . b* a5 m# J9 L3 {# a
- // Выполнение действий на основе текущего состояния
- {% p2 D- x' t3 u6 w$ f, T - public void executeState() {
, C0 x' J5 v3 d - state.handleState(this);
% j/ G: t8 E( i# ^% s! h* _3 j0 T - }
. r5 t% p, r9 d) g9 w/ _" H6 c/ C2 d
$ ^, Z* A0 S# ~" E4 N1 Q- // Геттеры и сеттеры
; ~: D' e+ w* u) c+ S& G9 r' E4 ? - public String getName() {& {) M+ ?$ j/ d! ^) C+ @3 ]
- return name;
& y- L# z' _9 W( o5 r+ f' D - }# o! c2 o$ T$ G8 ~
- ) e8 y- m3 v2 d3 W
- public double getAttackPower() {* ?. o1 {! ^ T5 W- B
- return attackPower;. b# l" x0 h& H2 N0 @$ o% a$ H
- }: H: H& K5 z5 J1 s( P
- ' R/ j& c2 ~9 K1 R- @
- public void setAttackPower(double attackPower) {; Q+ }& C1 `/ @7 J
- this.attackPower = attackPower;0 K; W% G0 k- @4 i! G% m
- }
" v N( J O3 f - }7 Y' W/ F3 h& N# D) u6 S+ }5 Q7 C
Скопировать код
# L; ^! q4 e T& `7 |Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.9 j* T6 H" i7 ]+ s+ c3 o4 B
1 U, l4 U1 f! k7 K" B% N6 }- // Пакет org.l2jmobius.gameserver.model.battle
+ H- G* C% q$ H& p - package org.l2jmobius.gameserver.model.battle;
0 f( q4 t6 i$ y1 X) z, v' Y
# D9 s; ^! |* @- v- m# w5 V* n w# k- import org.l2jmobius.gameserver.model.actor.Monster;4 p( X: N# J: e; S* n8 f6 Z- m. z& F
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
4 c& j/ M. v& b6 o! j - import org.l2jmobius.gameserver.model.actor.state.FinalState;* x' C' F/ |% R7 Q" D2 u
" |7 q5 U% V* N" |- public class BattleSimulation {
$ P' \3 w6 w* p6 s# l1 b - public static void main(String[] args) {( F$ k/ _$ k/ N/ @
- // Создаем монстра с начальной атакой
5 w4 n0 J$ P2 T0 ~2 |: g2 C - Monster monster = new Monster("Дракон", 100);
0 c# e/ I. E- \7 ~8 l- R2 _ - 1 u& z8 P9 r- w' M: w
- // Начальная фаза
1 U8 h, Q1 X; _ - monster.executeState();
4 \. `; l# Q( z9 _3 ~ j, C# G - 7 z2 m g$ {* j0 D6 t* s, R3 c
- // Переход в агрессивную фазу
7 ?4 a. I# S, ?$ ?2 Z+ P2 @0 g - monster.setState(new AggressiveState());
+ N3 L& B% P/ _. N# _ - monster.executeState();5 D) m3 _9 B7 H
0 y/ b1 Y* R# T8 d- // Финальная фаза" t3 I& O! ^# _2 X: z
- monster.setState(new FinalState());
' m, _5 a3 Y) P- \% ~+ r+ a, _ - monster.executeState();# Q, M$ V" Y2 Z% e% S+ F; X
- }
% R0 v4 y" p0 g2 [0 u - }7 ~* ]& }& N" ~
Скопировать код
+ G* a+ l& N3 W7 l* e& yКомментарии по структуре пакетов и классов:
+ Q9 [: _7 c% H) o- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
$ w) ?; m8 L) } q( _ ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
% J: X0 I# i7 {3 i' TЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!: [9 m P' O' F
) O1 y) B* Q a$ d5 C
" [# u6 j1 C6 Q+ C$ d6 ]( w; A
4 T% i- K j9 ^$ {( z. f$ h7 q
W- z* t+ q$ z* W# g S0 n+ @2 }: Z# E# T& M6 Z3 w
4 `3 Z) _2 Z$ O9 J$ [/ x& Z6 m
1 `. l O* b. U1 ^
/ Q( }# q; A* ?. b3 Y% Z7 l3 K$ W5 m% _+ ]* {
. M( ^$ |2 T' {/ o# K( }' K/ p8 `3 o2 E& _) f
7 ~+ b8 n. y; s) F3 G
0 w! g9 [/ q* @2 j' W4 C) Z& A, f
7 r7 }1 z6 e n0 Z& ~; E |