Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 3 x+ N& ?% {2 \1 C9 ]; _5 V/ _, f8 Z
0 v5 C) Q9 J+ k, _
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
7 L) f7 a) W4 n: W: i; E" D7 M' W- Y! a5 u
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния., f2 o# l' U5 i* r& \* H
N5 C% c6 b+ ^ `' D
- // Пакет для состояний монстра
7 [& t& d1 |0 W0 X; x) e - package org.l2jmobius.gameserver.model.actor.state;6 \; f q8 L6 Z
5 u1 r' c" m- G! [+ e" Q- // Интерфейс, представляющий состояния монстра: a+ g" K. ]. J* A
- public interface MonsterState {. ]0 P9 D; ?$ |+ L+ Z. R; P
- void handleState(Monster monster);
a) y+ f/ ]/ K; t - }( m% E$ N% |* p m
Скопировать код . }$ J t" I/ @; C, Z3 _
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 7 D6 L) I" D0 n! P* d( I
; Q1 W! f! x5 d- Q ?0 E+ eЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.1 h7 a1 r! ?* P/ A
' B" v- I* ]" x% {7 DКласс для начального состояния монстра:
- @3 q/ |* R5 i' F" E. a& U- // Пакет org.l2jmobius.gameserver.model.actor.state7 O% o8 {4 W5 X4 I' u
- package org.l2jmobius.gameserver.model.actor.state;
( v& y/ |- G. ]3 A0 d" s9 x3 f6 [7 X - 0 Z% @, a3 F, @- r) P
- import org.l2jmobius.gameserver.model.actor.Monster;% M# o9 t& a# F1 u) H% X( D
0 B2 H4 h3 Y) M, f- public class InitialState implements MonsterState {
2 W; j7 g& C4 s& A; n1 B0 A - @Override
( u1 I; m8 u4 d d2 v1 p, ?8 J, M - public void handleState(Monster monster) { y) |( h9 Q9 q# l
- // Начальная фаза боя4 p, {0 E, m8 H' x5 }7 m6 \8 V+ `2 e; A
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");+ J* p: W+ p* N3 u( |$ m9 K9 g
- }
: @7 j% K- Q1 }; W. U - }
2 B% O" j5 _# Y# g2 l
Скопировать код Класс для агрессивного состояния монстра:& h& @# ~+ r4 I( t
- // Пакет org.l2jmobius.gameserver.model.actor.state
3 I2 {/ A1 n0 D2 y9 p9 h - package org.l2jmobius.gameserver.model.actor.state;. o$ a' I. B! Q. k9 e4 X& u4 t
- - d- C( c u9 p/ ^/ U' t& p
- import org.l2jmobius.gameserver.model.actor.Monster;
! ^# \/ V. a6 U* z4 m$ X/ |$ _8 F
4 H7 m- m3 n6 H; _, x: M j* t$ M: }3 R- public class AggressiveState implements MonsterState {& p* A2 a) x5 c
- @Override1 j' S5 R6 k2 E$ o6 g. @( }
- public void handleState(Monster monster) {' u' G; a" u5 A# ?" D. X
- // Агрессивная фаза боя
- a4 l5 S, A) G0 A/ a% { - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
' x, i0 @" I+ t% ~0 { - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки/ B3 f2 d, X" f: r8 ?, l
- }
" ?5 ]5 |% B' E* G6 c. ~) v - }# h; J, X5 ~; g& P# d
Скопировать код Класс для финального состояния монстра: z% s+ a4 z v0 N0 w' E: F
- // Пакет org.l2jmobius.gameserver.model.actor.state( i6 c6 x* h1 W0 J* \( ~2 t9 |
- package org.l2jmobius.gameserver.model.actor.state;
' A0 {; [& [' Z - % b" e2 l5 m) y; h
- import org.l2jmobius.gameserver.model.actor.Monster;
( @0 P4 N" _! p1 X6 n# n/ j5 t - - a9 Z7 P. H- o. Y
- public class FinalState implements MonsterState {% F5 |/ L, k+ N# x! ]; W$ Y: d
- @Override
2 S& t# r# P. @8 m/ l' n - public void handleState(Monster monster) {
( B) r' G _4 t& A$ d5 ^+ d - // Финальная фаза боя
$ S# M, }: g; d' v) R - System.out.println(monster.getName() + " готовится к финальной атаке!");* E4 t- j2 s5 l2 p+ n/ F
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки y$ T2 s7 g; B: D0 m
- }
, ~" V( o& _# E0 j' X/ t - }
h. }! D5 i. o3 z
Скопировать код
) w/ @5 m9 F" u- a jШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
' `( c. K( R X- // Пакет org.l2jmobius.gameserver.model.actor
3 m, U# L' |- j' ?8 Q' _ - package org.l2jmobius.gameserver.model.actor;) V# A* w8 X$ S! f$ b/ J
4 }% B& m- q' |# D% `) i- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
; }, k+ B. ~# E. `! L - import org.l2jmobius.gameserver.model.actor.state.InitialState;
, y- j9 W6 p* {) q4 p - ( n$ a# Z4 o- K5 ^' h
- public class Monster extends Creature {
5 V8 q+ T0 ?3 o - private String name;
2 ?7 u" J8 r8 d6 t8 W6 t4 e6 I7 V - private double attackPower;
/ }7 W4 J# H3 } r5 x - private MonsterState state; // Текущее состояние монстра4 k* |7 z9 [" h6 Y# {4 O# x
- ( [) |5 b y' ~; Y
- // Конструктор монстра
2 x7 X( ~& o' { - public Monster(String name, double attackPower) {+ r7 ]' c8 Z; l9 l
- this.name = name;
# S, o O/ S+ K9 X7 } - this.attackPower = attackPower;7 Y. n/ P! g0 P4 ^( T* o7 o; z' t
- this.state = new InitialState(); // Устанавливаем начальное состояние5 w% p1 U5 X2 u2 w3 k e4 g7 _
- }
6 S' O/ |( ]& q; R3 }% v - ! z) y x5 X1 ~
- // Метод для смены состояния- E5 a. n. q' E; Z
- public void setState(MonsterState newState) {: C Y; |5 T6 u. o* G
- this.state = newState;
# z5 ^$ M; ]8 x6 G% O/ c - }
5 | R- A' o. R* U3 g4 v
8 ~* p' B! g6 Y- S$ p- // Выполнение действий на основе текущего состояния
2 n+ j& c5 i! m& z$ c% Q - public void executeState() {3 Z4 e( I8 t2 j' z) T
- state.handleState(this);$ w( _* ]/ F- f2 y; r
- }; A" ^& i3 @: S0 c* Z# {
- & z' D9 h: x6 f9 A5 S* f
- // Геттеры и сеттеры, l# w, T. {- C' _1 v& S
- public String getName() {0 h* A9 ~, |9 q! H
- return name;
( m. n0 `& W; u) s( Y - }
% z8 T% n) {0 C! ` - . o3 |6 ], V. e# _1 H. j
- public double getAttackPower() {
& F2 P* B+ ^# g( t - return attackPower;
+ q8 @2 h$ a y! ?; m& { - }% b7 @) Q3 ]8 x9 p* ]
* q- O( V- R9 K' S* r- ]* x9 y- public void setAttackPower(double attackPower) {
" [. J M; x6 y3 X; I - this.attackPower = attackPower;
! y" `9 M% ^. s \, C0 h& P; N - }
- Z9 }- {- M/ x8 @ - }7 ^# @7 n$ l% \( X- H! S: n7 T. l' q r
Скопировать код ) k) X O8 I4 D
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
[8 A* [7 v* _5 o7 H
9 i3 q4 B! \' u* Q, s: s# c- // Пакет org.l2jmobius.gameserver.model.battle
1 d! w9 j: X+ w% b" q3 @ - package org.l2jmobius.gameserver.model.battle;0 g( H u9 m" ?% i; ^0 T( k
3 l2 m* q4 z/ |) j2 P- import org.l2jmobius.gameserver.model.actor.Monster;
/ }* A- T* n+ S - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
, H) k% k5 F: K% [# m* j - import org.l2jmobius.gameserver.model.actor.state.FinalState;
& R# Z" M" k ^3 z5 u/ m
& b" I# c/ `+ v6 b8 O; p- public class BattleSimulation {7 j6 A% W1 W2 h3 D! u
- public static void main(String[] args) {
. ?# `% g* g( P; N! p9 [ - // Создаем монстра с начальной атакой6 t# g% }$ [. f
- Monster monster = new Monster("Дракон", 100);
& c4 n) u; w+ I7 G - 1 V* }' r" z3 g& k
- // Начальная фаза; b0 [8 }( T3 o
- monster.executeState();0 N; C. f* r$ x C2 v
. W* {+ n: w( b+ g& e( t* y$ Q5 ~3 f- // Переход в агрессивную фазу
5 [) f4 r+ C" H# B - monster.setState(new AggressiveState());
) e6 {' @1 ?0 n. V) [ - monster.executeState();' `+ h& ]" y }, y1 t7 \
- 7 B4 `7 C4 L2 I# r3 L
- // Финальная фаза2 q# w# f) U3 f6 N% f0 j
- monster.setState(new FinalState());
: T. B3 w6 c% v3 L& R/ y; t0 O - monster.executeState();- I4 y1 F/ m. D1 C1 I/ @5 @; f
- }4 M8 q( y6 C9 F2 ^9 P
- }
! D; u! S2 [8 Z: m, Z( Z
Скопировать код
1 _) T) a! L& g9 _2 b7 I' k$ eКомментарии по структуре пакетов и классов:
2 X4 D& D6 Y& ?3 P" B- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.3 o+ u# ?! G1 \& @$ E5 C
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
8 Y9 B" Y9 o8 X% D9 ?Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
4 R; M, e$ F6 _
. [; H1 F5 J8 ^4 ?
" q0 k2 x$ _% u, r( p+ V2 G G1 F* {# u+ b9 W8 V) H
' j0 ~* \9 M% `, M: {# T
X* T8 M% s: s: r! y
2 x: a7 b3 D2 U7 b) E/ Z5 b
4 B* b/ {" l$ ]! P- m" y E
0 ?& s/ F6 l4 Y7 ~+ E# ^
" e; N' b7 J" O- z9 u- _% A. {1 j+ J0 w5 R
* t, W* L# _5 M. ]7 R9 B
, `+ A$ O' g9 k( u' c! }+ G) L" ~5 x) D' r$ N8 }& F
% c2 l R I2 F$ ^/ D- [& s
|