Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 2 f( [% v6 S3 [" ?5 m B2 @) E
! v' O, q0 [* Q4 m# Z7 e B
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
4 G. L2 b1 p4 I, T! @* p2 b0 `( i6 v2 ]& x! Y. ?) W& [" c
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния./ q) ~6 D! T/ `3 S5 T3 o- P
( T7 D9 W, K+ K! @5 C+ g1 S0 t7 n
- // Пакет для состояний монстра1 F' I+ o, ?9 \; y- `( D8 b
- package org.l2jmobius.gameserver.model.actor.state;0 g: `4 Z4 E$ @- x" h2 D
- 9 |3 O# r: |1 M; |( Q
- // Интерфейс, представляющий состояния монстра! y; O$ M# j: b1 ]& j
- public interface MonsterState {( H+ D d3 I/ A! F4 R. Q; J& F
- void handleState(Monster monster);
% l% j9 u" L) K6 ^8 u% _ - }
1 W! r4 V9 V `) {2 Q1 E
Скопировать код
6 m: L" Q) t( q) f& q _Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. + ?! f9 k2 n, ~; u- B# y
/ s- |- k! o9 ^8 L6 k NЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
k9 _! R, g6 c3 F2 X( a* c
( _; t4 n9 E* y- }+ Z. h) l/ X) P' KКласс для начального состояния монстра:/ N& J7 P# b1 }2 @3 K/ B
- // Пакет org.l2jmobius.gameserver.model.actor.state
6 ]+ k5 V/ n x! R# E - package org.l2jmobius.gameserver.model.actor.state;
! N Z; T& h. F8 ]1 f+ ~ - 5 l+ q" I0 X2 @7 S! n# p; X8 D
- import org.l2jmobius.gameserver.model.actor.Monster;. p$ u d* S& s2 C0 O
- % a( b4 G& h% v% Z5 R% o8 q$ b
- public class InitialState implements MonsterState {
0 Q1 q% f, Z5 \- |9 V. R$ J, a" Y - @Override9 s$ o1 i, s" \* @
- public void handleState(Monster monster) {7 H1 Y% M, k6 R( |
- // Начальная фаза боя
6 @. ^9 U L3 b. ?" @ i - System.out.println(monster.getName() + " начинает бой с обычной атакой.");' M( v; Y5 Z4 K
- }
: m$ w9 j9 t. |/ G - } t1 m% v9 U# ~7 H L3 c
Скопировать код Класс для агрессивного состояния монстра:9 \: l1 m1 z9 w* g5 R. b5 a2 d. ~
- // Пакет org.l2jmobius.gameserver.model.actor.state
8 m. @4 K6 _& V - package org.l2jmobius.gameserver.model.actor.state;7 f' [& T% K u, t# c& b7 \; d
- " T" W9 k' f; a6 b: p# h1 i) A
- import org.l2jmobius.gameserver.model.actor.Monster;
+ h$ g" P: q5 Y& u3 |- }
% S, R0 q8 y6 J, ?2 g/ ]- public class AggressiveState implements MonsterState {4 ~( N- Q' ]5 `& Y* a3 U6 _
- @Override# X9 C* m- z( R" p! F6 n
- public void handleState(Monster monster) {8 T' Z" ^# v! h( q! j, {: H+ d
- // Агрессивная фаза боя) _5 M: N w2 M# F# x' b3 H
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
3 u' E/ l5 g# ~0 N% d; \+ g* c" U5 @ - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
. N! B& \3 `7 b - }
: _2 e @$ x1 N$ M - }
! d/ C2 a0 T* o; c4 ^8 m Y) q" d
Скопировать код Класс для финального состояния монстра: i! j9 V1 b$ ^
- // Пакет org.l2jmobius.gameserver.model.actor.state5 [# P6 R9 s) E/ ?! o! d
- package org.l2jmobius.gameserver.model.actor.state;
8 \9 i' E& m% ?* L3 a: u
0 R- N) _+ C. k" t" h2 A1 n# J0 U- import org.l2jmobius.gameserver.model.actor.Monster;$ y% l0 H0 z/ z% S) l
- ) ?% v& V% O* O. ~" S4 y
- public class FinalState implements MonsterState {
+ `! s8 q; ?" f: z; n - @Override
! ~. v# r+ f. f - public void handleState(Monster monster) {
0 e7 j1 q! e& _6 A - // Финальная фаза боя
: D: u e: t" u/ ?/ J' G - System.out.println(monster.getName() + " готовится к финальной атаке!");) r& Y2 N1 v( |' g% M
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки* a; x, u$ x1 u, _/ @6 w o
- }
4 J" A# X! k7 Y - }
- ^0 }8 b- Q0 h
Скопировать код 6 J- `) r0 P, i( U/ u& E' e
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
6 a) J' S p r- // Пакет org.l2jmobius.gameserver.model.actor7 A; R. c6 e) k( |4 w, Z" F
- package org.l2jmobius.gameserver.model.actor;5 _, i& A0 u' c F5 ?) P
- 4 f6 f" t$ I% [7 {
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;1 {" Q2 w2 v9 f% }! n1 {
- import org.l2jmobius.gameserver.model.actor.state.InitialState;
* v7 d0 P4 `+ n' {4 i - ( b# ^; b6 h) ?- w
- public class Monster extends Creature {. H8 e2 P+ l5 H1 L4 R
- private String name;
/ R+ |6 g W9 K# R5 n( L; }& S - private double attackPower;
7 W0 L0 R- o+ V+ ? - private MonsterState state; // Текущее состояние монстра
; G1 t+ p+ _1 ^6 E' M/ I7 g: A, R - # F; H7 u" f8 E. P$ r" t
- // Конструктор монстра( V h7 O7 [& H* s) d
- public Monster(String name, double attackPower) {
) A7 e/ y( M& k - this.name = name;* i! d$ q. l& _! V, e7 g( e1 ^) ^
- this.attackPower = attackPower;. n+ R3 j. R0 y+ T9 R" o4 A
- this.state = new InitialState(); // Устанавливаем начальное состояние3 F8 B! R- a( j
- }4 @+ U$ _. u5 z' D. Y
) l& H+ u& n" }$ R9 c. i: @- // Метод для смены состояния" n* \ g" i( }6 q% q7 d1 g) q
- public void setState(MonsterState newState) {% f1 H% T4 ]6 C3 f
- this.state = newState;
" {! i/ R' v9 H1 x( g. `% w! Q5 F - }
! G6 S9 [1 U1 r4 ~' U7 S
4 }% q) g' H$ A$ T5 V [ ~ E- // Выполнение действий на основе текущего состояния
2 n# k. I [$ H k6 o9 q/ J, N- @3 n - public void executeState() {& _" O' G8 d0 b, M+ q$ B
- state.handleState(this);
* }4 p" A" m: M - }
$ Z- |6 [. X% b5 s. V - $ J% T5 m* S3 r
- // Геттеры и сеттеры
2 B# p) X' C( {% }! s - public String getName() {4 _, k5 V! `" b0 x! z f3 _2 u
- return name;
* k- O+ \ o+ }) L: } - }
! V) {/ ~+ q6 ~& r) t
, j. ?* g' `- j& ?- public double getAttackPower() {; o; x8 D, D: y) `! w
- return attackPower;
1 {* I7 x+ S# x" f3 \ - }
; e) ~* j: }& r+ }/ S" b: U9 ]* G: @9 o- O
) ?* Y( t' I; f, E2 l- public void setAttackPower(double attackPower) {) h: [, ^9 {8 w6 r7 w, h- _9 n
- this.attackPower = attackPower;! ^) s, [* q7 v" R3 ]; H6 ]; ~& B1 {
- }. e4 j1 D" H: N6 y' w: K1 ~$ t+ ]
- }1 {6 u4 _" R) ^0 f0 ~: F: ^, A
Скопировать код ; b) U ~) r. f3 k* l3 g
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
( A8 _5 C! L7 r6 |$ z9 A* M
0 n* R/ Y5 f4 j# m- w3 R- // Пакет org.l2jmobius.gameserver.model.battle
P3 T8 [7 v/ n, B! z - package org.l2jmobius.gameserver.model.battle; U) x) c# q+ _; y+ o
- " k9 V( J& M6 }2 k& a
- import org.l2jmobius.gameserver.model.actor.Monster;* y+ B2 H* i' z. z& h% q$ @. X0 g
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
' D, C+ A6 k5 C R: v - import org.l2jmobius.gameserver.model.actor.state.FinalState; _ `+ U6 P# H$ q# k- ^
- % ^0 N( d5 B! z) K9 z/ o9 |$ t
- public class BattleSimulation {/ w$ R& R4 M- I! p+ ^
- public static void main(String[] args) {9 G' `1 |0 J6 T6 B% H- t7 w
- // Создаем монстра с начальной атакой
( B/ V4 K; L! C+ O, K - Monster monster = new Monster("Дракон", 100);+ W; b3 ~$ j/ C* M {
- 6 W# `$ _; B! V9 ^% z7 N
- // Начальная фаза
/ F, p: S* c6 y9 ] m9 g/ Q( i - monster.executeState();- c7 K7 X' z: }9 u$ D
6 v! i7 j6 w0 \6 J6 A; N- // Переход в агрессивную фазу. l1 |- D6 y) ^7 ]) H \
- monster.setState(new AggressiveState());2 p; X. S( H- J Z* ^
- monster.executeState();
3 W$ h6 y; g. b0 k
- b% U! `8 P7 N- // Финальная фаза
/ f2 n0 T7 h; P9 D - monster.setState(new FinalState());
' v' d3 ~6 ~+ j' \/ { - monster.executeState();9 r% S4 D% G& d% Y
- }. [6 a2 j I+ Y0 o; c! w) Y3 C+ V+ F
- }) p$ L% E( D& X& u. l. U
Скопировать код
, X3 l8 L5 ^; L, b, R% _9 C& qКомментарии по структуре пакетов и классов:
2 u, K( e5 @" K+ Y0 d! e4 G9 d" G: G- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.: x4 F) R& D* C) e. f r
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
3 ]: D! a" ~$ P. j# CЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
- c+ X6 G9 a9 m5 O" @ O8 U/ C7 N) h9 u, |- j' g
: ]% F9 @5 F3 { M( \# {0 G. j
) M3 N2 k# R2 y" i+ F7 c( L0 W- x, z! v/ K$ @5 v
' e- G* a$ O1 R, a; Q. ~: W8 k1 F
1 X! U, T; n0 G1 O- i' D9 ~3 W$ L7 S% | z% E( r) |
) k3 ~+ Q' K% U; Q4 P. M: o% u
6 e" k& r& {( p; N
a3 |4 Q1 d! Z* z M
) m0 @. W l4 F R( R* S5 r* h. X+ p# ^0 z/ q! E6 ]/ T d
% @1 Q" o. u8 a& k' f |