Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
( P, a; I2 U7 S" ?4 T; @- _$ O* j2 B; i! @" Y8 C
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
! y# o" n7 I R( O$ {
* C. ?! W; k+ ~2 GШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.' W) e' }% W/ P, d2 A
( I& U, P* x7 n1 c
- // Пакет для состояний монстра8 x. @6 }" ?' u, O- J' c
- package org.l2jmobius.gameserver.model.actor.state;
/ J: S8 X1 W5 L - ) v) w4 m( ?! N( f/ w. G
- // Интерфейс, представляющий состояния монстра
c. d4 S3 L1 q. F3 \ H* d' Z - public interface MonsterState {1 ?3 ^( U2 C* x3 d# h4 {5 B* a
- void handleState(Monster monster);
; j7 Y; b2 ^" n8 s, h" }8 b - }/ b! p$ m8 D3 O( j7 y- a' Q8 N5 }
Скопировать код : P: R* a0 ?" _) x' | t; r6 C
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. - [- ?* w% H: o8 |+ Q# {5 a$ M, l( F
% c/ E% |: [ `4 ~0 D& ^' T
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
- q) @6 n M, z1 I+ G% }
7 H6 _* Z) D/ [3 ]- M; G; vКласс для начального состояния монстра:
9 T' P# ]* `7 \3 M- // Пакет org.l2jmobius.gameserver.model.actor.state3 L) u$ }$ O+ w; j2 ^1 f: A! `
- package org.l2jmobius.gameserver.model.actor.state;
, [2 F8 G U$ }/ R7 x
5 x0 {& L }! h5 G: a( P* i6 Y- import org.l2jmobius.gameserver.model.actor.Monster;
" {3 Q! V) N' R% S% x/ S; x0 ~ - F, j- H7 A$ i) |/ l- G/ P6 b, q" O8 h
- public class InitialState implements MonsterState {2 R" f1 ? u6 O1 l5 b+ U% \
- @Override
3 `% w; v% Y' p6 G% g2 x - public void handleState(Monster monster) {
# i q5 l8 p. y - // Начальная фаза боя
. Z& t2 U; K3 O; \- W - System.out.println(monster.getName() + " начинает бой с обычной атакой.");8 O5 Y- T, H3 W* u/ J, _
- }
8 t# t" P8 b4 K+ H6 d - }
0 `2 I. n( x Q/ C
Скопировать код Класс для агрессивного состояния монстра:4 a% I0 w" G2 S0 d) U
- // Пакет org.l2jmobius.gameserver.model.actor.state
K! H ?+ @. J- |- p S& U: x - package org.l2jmobius.gameserver.model.actor.state;
% B8 Y9 J9 H& I5 p& e1 d* \ - 7 D, K% i* \4 p4 |
- import org.l2jmobius.gameserver.model.actor.Monster;7 s) D' r0 j1 ~4 Y; z
# J; e# ?, G1 n1 S+ G8 {- public class AggressiveState implements MonsterState {
5 C5 z/ L* t( K" d- f - @Override
" V5 G& L' n) L5 [" W5 j- F - public void handleState(Monster monster) {
4 v7 } m+ U! h1 }; m) N! d$ ~9 N% q - // Агрессивная фаза боя
% [( U- Z. `8 L8 ?9 z+ [ - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");* \$ d8 a; R4 ?+ c* O
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
7 ] N8 ]: O1 y; R - }
7 i: l3 T/ D9 W0 t% e; ` - }
/ V1 G1 q, d. B
Скопировать код Класс для финального состояния монстра:
' d+ c( _# d& Z9 x. w( K- // Пакет org.l2jmobius.gameserver.model.actor.state
, Y" i$ a4 y& e6 `2 u. h - package org.l2jmobius.gameserver.model.actor.state;
& ?7 e+ S. X! S - 7 \/ d: _3 {9 t q& u
- import org.l2jmobius.gameserver.model.actor.Monster;" b9 S w( r* R% C' {/ l
; @: m6 g0 l! I7 v- public class FinalState implements MonsterState {% Q5 [# a% e! [" \1 M
- @Override, g2 q' l' w1 [: N" N3 v1 Q
- public void handleState(Monster monster) {
0 o. K8 m& q' @ - // Финальная фаза боя
$ l& P8 }! P1 _ - System.out.println(monster.getName() + " готовится к финальной атаке!");
; q. q$ V4 ^5 S8 j* U7 n# b - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки; t5 _( k$ J V! J2 K* e
- }, b' I. g z2 L L6 _) m
- }
8 D7 O$ t2 F9 G; {/ v
Скопировать код
; ^/ v% T [, Q, a0 S$ _Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.) b8 ]# W' o3 H# X. A' I* H& E6 \
- // Пакет org.l2jmobius.gameserver.model.actor" z8 O! e. T+ w: N* F- B( h
- package org.l2jmobius.gameserver.model.actor;
k/ @2 w1 p9 y, ? - ) j' x7 \. g+ k4 c7 r
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
, A d! h) E4 Y - import org.l2jmobius.gameserver.model.actor.state.InitialState;$ }( z9 R7 Z3 l
- 3 v% o0 w' E& ]5 D/ b9 }
- public class Monster extends Creature {' e7 F# G& |, @+ j
- private String name;
1 Y! s- | ]5 @ { - private double attackPower;
) w" ~, ?, [4 P. V0 \2 e - private MonsterState state; // Текущее состояние монстра4 n! w, {4 E% Z3 f8 k# }, r4 {0 @1 f
9 o5 w, ~ m) ?% B& p" }- P* {- // Конструктор монстра
. q, s5 W4 A( \ N! Z - public Monster(String name, double attackPower) {; t0 H) _& C5 g: d: _
- this.name = name; ^/ \# }0 _- Y7 ~! E" U
- this.attackPower = attackPower;
4 R9 A/ g; g7 g, M. h% e R' Z4 _0 w - this.state = new InitialState(); // Устанавливаем начальное состояние
1 h( K3 Q1 X# W - }! k) D' E$ Z2 N6 z# X- M; I7 a- I, z
- / v- P3 H' O9 ?# k, v" q' u
- // Метод для смены состояния" J6 ^' F) A' o1 C" {4 _
- public void setState(MonsterState newState) {5 O- ~2 Q, A4 [) r) R& k* e7 [
- this.state = newState;1 x: e8 B# i# ^( B8 ^2 W3 q
- }' j" s7 E. E/ ]4 @$ T& D3 P7 Z* Y
/ m- n. `0 c# F @# p- // Выполнение действий на основе текущего состояния+ M; ^: _4 \5 u1 U/ e
- public void executeState() {
0 A4 ?6 e5 `* }1 z$ ^ t5 }- t - state.handleState(this);
! T, ~; m" K& @3 t; ] - }
& s8 L: r( {! d/ |
' N; ^6 z4 v) s! R- // Геттеры и сеттеры+ X2 A/ u3 m% N5 ?% w
- public String getName() {
9 M- c, d1 y2 V: t' U/ T - return name;% |; E, \0 P0 {5 E) j& ]: B
- }8 n* e0 R! e3 F% s1 g8 b$ ~
- ; {/ k6 k# w, k1 Y6 y" _: |
- public double getAttackPower() {
3 V- z7 V" {( {9 C; D" E - return attackPower;8 |# f6 m7 s# a- q: \
- }
* E. L7 ]$ l& E4 \
# z: W& ?& G0 ]+ P- B$ d- public void setAttackPower(double attackPower) { e/ E x4 u9 S( Y
- this.attackPower = attackPower;+ d5 x8 o0 Q6 Z) X$ K7 _
- }1 }0 m1 h+ w$ E
- }0 r B X" c! q, h# s( w
Скопировать код ( D1 O( B' g7 n7 a2 Z- `# ~
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.5 m% e5 J6 {& d& ?% N1 u. e H
/ Y _! C5 e& ], ` Y: o- j& {
- // Пакет org.l2jmobius.gameserver.model.battle* W6 F9 O6 k3 k( w! ^& q1 a4 P
- package org.l2jmobius.gameserver.model.battle;
! [" B) m$ R2 O) D, [6 z# f ~6 p( o - 6 }. D7 o+ Q: e7 \+ X2 T
- import org.l2jmobius.gameserver.model.actor.Monster;% |! o+ ^' ?% g) n5 A; X# C: @
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
' k5 i, ?4 S5 B. B* T4 b3 q4 w6 @ - import org.l2jmobius.gameserver.model.actor.state.FinalState;1 E# E6 d, T! m: {8 f9 v
- . Z1 @1 h" D1 l/ r" z+ A
- public class BattleSimulation {5 V# {' r, I. t. Z f
- public static void main(String[] args) { k G8 e# Y4 X2 f4 n h
- // Создаем монстра с начальной атакой; ]+ V) h! H! {2 Y
- Monster monster = new Monster("Дракон", 100);
! G ]% w; a. O% O! _ b6 Z: U" R& o
. Z( x ?% n$ M( ~4 w7 ^- // Начальная фаза& b2 o" L0 g$ e' x& }, G
- monster.executeState();. H8 K5 n5 m, I3 T9 c
. }7 V/ X0 @. ~3 W6 R3 M, P- // Переход в агрессивную фазу- q' U9 C8 Y# x( S) {2 f
- monster.setState(new AggressiveState());6 s+ [9 v2 ^% K( @" q
- monster.executeState();& A' U! m1 h' o! b9 f7 V# H0 _
& O5 S4 K5 ?% |8 S- // Финальная фаза
: s: P& P" b5 K0 Z - monster.setState(new FinalState());
0 a l6 V/ h3 c/ ^4 ?5 Q( x - monster.executeState();
. d0 {3 e& k) e. O. ~ - }5 F$ d4 S# d' A: R5 d$ L
- }! |! E6 E5 ~ m* \7 j! C
Скопировать код / @9 t: t& G# J- i* `3 s
Комментарии по структуре пакетов и классов:4 c; [, I6 k$ Q) x5 C
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.- r+ O% Y" p" J% r; S
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.0 j+ d- P( ?! A) d$ q! q
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!% D3 V/ ?& x. o2 r* D
/ m/ I8 R) H% z5 @
$ n4 m" A( l3 y
# q% {# \8 A) ]& a9 M' _
7 T3 x2 \% T' G; X" F& d) Q& f; i: a N$ P$ z/ L" o' ~6 a, L: }( _2 v
$ h3 j/ f+ ]+ Q \+ z3 E5 }: o5 Y. C1 I1 z8 g; O! U
& _' g+ g* I' a" T# o) l9 A% C
: q. b9 M- x/ K, J
" s( Z! n/ T9 V; r- \2 Z8 L" L3 @: _* U5 ~: T
; _+ i2 p8 L$ a h3 q. F
4 W: E" \; a& f- c' n2 q+ Q. U- s* a' I/ ~
|