Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
* ]5 K. d/ U+ e) l6 K }9 ~- n2 z+ ^
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.) a3 J1 l. d7 a: \) I. u
$ s5 O$ E4 O6 k. b3 B, x
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.5 w3 @% J; n8 d. P
# ~$ p" o6 {; C& f$ e, ]- // Пакет для состояний монстра, J/ c, V3 H( d6 v- A& p
- package org.l2jmobius.gameserver.model.actor.state;; i( o1 s i0 P9 o- a# B$ B
1 m" f% |" r3 B' a- // Интерфейс, представляющий состояния монстра
' M2 J$ s( }+ n - public interface MonsterState {
: `2 C I, Q. N9 Z - void handleState(Monster monster);
2 Z/ A7 B. R! p! q+ z6 S" C - }5 R; {* x: r: X; l4 G; ?7 R
Скопировать код
2 [" x* ]9 L4 t- IШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 9 V' R8 y s) \, }
) U9 ^3 k) e$ l+ U5 Z" s& RЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.2 u% t* t& Y( m
9 [% _9 \- ?# j/ O: ?
Класс для начального состояния монстра:
6 c( m, q% h: p1 I+ u) V! d. g% p- // Пакет org.l2jmobius.gameserver.model.actor.state8 ?; C- b0 w- }+ x. t
- package org.l2jmobius.gameserver.model.actor.state;
3 v# ~) q5 \, S+ c2 _" n
" F) g$ d% D; J. D7 f3 q. Q: v- import org.l2jmobius.gameserver.model.actor.Monster;
: d% r: V7 K L; R& m4 i
( d# }& ?' ^6 Y2 k, }/ x- public class InitialState implements MonsterState {0 y* |; J; m3 Q5 @5 l" m* T
- @Override
# C5 B) X" d& Y - public void handleState(Monster monster) {7 X2 R- z: W( S$ W
- // Начальная фаза боя! U# q" |$ I+ Q8 J9 t5 L
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");
/ f5 N* x: Z6 W0 K - }
/ A0 e1 i0 H& q/ z - }9 B9 s8 B' e$ U) u% R; p: h! _& Y
Скопировать код Класс для агрессивного состояния монстра:
; y6 u1 e/ @% m% {8 B- // Пакет org.l2jmobius.gameserver.model.actor.state8 z ]6 ^+ {2 k
- package org.l2jmobius.gameserver.model.actor.state;( J$ E- B0 K+ s+ x3 K$ V
# e& p" b7 P* Z2 V- O- import org.l2jmobius.gameserver.model.actor.Monster;/ Z. Z: O2 c6 I) M
- 0 ]* _4 X; m; y9 M! s; h! A
- public class AggressiveState implements MonsterState {; z2 ~7 y( g5 k7 s6 I9 \
- @Override
: c1 `9 X0 ?& Y5 O- E6 C+ V+ a* ^ - public void handleState(Monster monster) {
7 Z( V3 F2 |1 p _1 L - // Агрессивная фаза боя' y: @# l$ e0 y8 H' t9 p+ ]9 B! j
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");8 f5 Q6 @# R, C& S
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки; [# L8 l) i, _; ^
- }
& C8 A( p% [- c" H9 u - }
. H: M4 b" W1 K( n* G
Скопировать код Класс для финального состояния монстра: H% }% R0 }0 |( o# O) |
- // Пакет org.l2jmobius.gameserver.model.actor.state
! n: I; N$ @' Z0 o: q! j6 h - package org.l2jmobius.gameserver.model.actor.state;- p8 N# p6 ~8 J! C
6 V5 m2 H# B) p6 E$ Q; f- import org.l2jmobius.gameserver.model.actor.Monster;
f+ V/ O x+ @! _7 J
& D* N+ V; M2 _4 k, n) }2 p- public class FinalState implements MonsterState {
# W2 B& v, k- K% e0 \ - @Override
3 @) I9 ~+ h/ V0 n - public void handleState(Monster monster) {
) }" q, f4 N# h" `9 `( q, N - // Финальная фаза боя6 g! H9 v, F1 j+ H/ ^
- System.out.println(monster.getName() + " готовится к финальной атаке!");9 \0 c+ ^; G, p* Z" x$ u( [
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки6 C3 f2 M* c3 m7 T) @9 m8 S0 S
- }2 v# r# F: g5 ~: p. i! T3 D4 z
- }5 U% z" {' E( b0 U1 [- s/ S+ t
Скопировать код
0 ?- W0 j3 a3 m4 F0 hШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.4 i& P1 m# a; n& ~
- // Пакет org.l2jmobius.gameserver.model.actor3 d' D( k) R: a/ n
- package org.l2jmobius.gameserver.model.actor;
V; {5 P6 p8 F3 `$ T- b( K - ~! @; } J1 c& S% N3 L& L
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;, L$ {/ x* C) c* P# ~$ }+ Z h4 n( n
- import org.l2jmobius.gameserver.model.actor.state.InitialState;
' }: F$ e1 \1 ?8 @! U - 0 a! I5 W H+ z! r& W5 |2 C
- public class Monster extends Creature {. O$ V1 k, @9 f9 d# I
- private String name;5 \: c2 B v$ S( H$ ?! m4 i; H
- private double attackPower;- X8 h+ ?; \/ S9 @4 c+ E k
- private MonsterState state; // Текущее состояние монстра& y4 y* W* ]3 j# g
- ; p: E+ @+ X" E% P& w7 |
- // Конструктор монстра( ]5 J. U4 J7 [+ C, c$ \" [$ g
- public Monster(String name, double attackPower) {
* t) I( a, H7 z" N2 B. q - this.name = name;# W2 g1 @0 A& l! ~
- this.attackPower = attackPower;
7 ]5 d# _# I/ @7 I- R) Z, m - this.state = new InitialState(); // Устанавливаем начальное состояние
% v" K* a+ j9 n& a* P - }# m) M! A; Z0 v+ z Z4 w6 V! z
- + A- ]! m* S$ N$ s* s
- // Метод для смены состояния, O& s. i0 e( W7 C% T( r
- public void setState(MonsterState newState) {& Q/ |" ?/ k# E% U
- this.state = newState;
+ Z0 i! U) k% N$ f: F$ a0 K - }
9 i+ F2 w% y/ M3 ~. L- X
( c) {: ]7 o2 l( X" `4 h- // Выполнение действий на основе текущего состояния
% Q2 A& c: `/ s) B: f, S! T5 T& d - public void executeState() {
1 ?" o3 ?8 g& ]5 q" F; e - state.handleState(this);5 O* r6 z# V/ V' x; `5 @5 Y2 z+ m
- }5 y+ j; @$ H/ {# l e' x9 q# N
+ w& d# O8 S) E. {- // Геттеры и сеттеры% l: \& L6 H1 H! h( k' ? j
- public String getName() {
, D0 b0 I+ F# s) T2 T- Y! ~ - return name;
) I. Q+ r) }! A3 ^6 n- b! h - }
7 Y; t. m4 h) t( v' B - 6 r2 Y9 l( Y2 g. \0 l
- public double getAttackPower() {+ w& x0 r8 B+ ?- F. e$ E4 f. j
- return attackPower;# Z5 s) P0 t: c" H! G, i
- }
( V0 O/ ^! _) L$ D
: v( \: ]( E8 @1 o5 y0 I- public void setAttackPower(double attackPower) {
) |) N4 d- K3 B1 { D - this.attackPower = attackPower;1 L1 p- u5 s1 W2 H( y4 l4 O
- }
1 }. c! T' O" l - }$ Y4 R d) v7 `/ _5 A
Скопировать код 9 x0 ]* W. O A6 X3 t4 F: T. [
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.- ^# c3 V5 Z4 r8 w0 t& y
2 P3 e6 L# ]. k0 B0 P
- // Пакет org.l2jmobius.gameserver.model.battle" o, e$ }* t( }# _& n
- package org.l2jmobius.gameserver.model.battle;! |" L3 L$ f: M( M7 g j
3 R& V1 |7 W1 H' ?6 ?- import org.l2jmobius.gameserver.model.actor.Monster;# U! {& U/ e% ?$ b. X
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;4 d1 b+ Y2 ]& ~
- import org.l2jmobius.gameserver.model.actor.state.FinalState;
; g+ i9 B, R$ L% v, m
- ^7 y; I U' T: }3 Y" i- public class BattleSimulation {* ^+ M" y |9 S1 P9 r# N9 T
- public static void main(String[] args) {: s. T4 B$ @/ m& Z9 U
- // Создаем монстра с начальной атакой
/ v7 X3 ~( @; a/ Z2 d: O1 \+ B - Monster monster = new Monster("Дракон", 100);1 j$ @! f) e. A( _. @4 B
- & M* M4 H3 g7 E& C+ P
- // Начальная фаза
* J7 B" L9 y7 S) F6 s2 u' U - monster.executeState();
q( Q( c$ i- q5 M; _! B5 z - $ ~: \; k" j4 u; X, E8 {; d
- // Переход в агрессивную фазу
( l3 t4 g6 \. p* m, ]: x/ M0 i - monster.setState(new AggressiveState());
; i: ~% r& h; X" |7 z5 {/ m) X - monster.executeState();
7 K, X- D n1 r - : w/ r$ ~# i- M2 @1 h" @9 |9 x
- // Финальная фаза
! A5 A( U0 V. `+ y& A$ ] - monster.setState(new FinalState());
) T7 V5 ^5 u# R& M3 C - monster.executeState();
0 ^$ [# P# ?1 H* Y5 Z - }
- w& C+ m5 M0 }/ q( N7 R h - }
; N$ [# S! r; C$ R& J$ f0 P
Скопировать код
1 b- {0 M: X( u2 S4 P2 BКомментарии по структуре пакетов и классов:
! y* c$ B( K3 K; `: o# M W- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.7 }+ `2 X7 I5 H! k0 ?" P
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
+ e( h7 q) ?% |1 KЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!' L7 a2 @6 c( R
K+ Z% q& a0 z' n
/ S" m6 b! Z; f/ |# n9 f
+ X' H, T: n: C4 G, s7 x
' N5 A$ ]% N9 u& j1 q% |
$ P: M2 M+ Q+ L9 G& G
- ^3 W0 ?' v0 e6 T9 T* z5 [$ a. q( \# }) {
! c( B5 d1 U n0 I9 [' M& v
7 T' D x( q% `( F
6 D# }' r; L+ L. w; z. M& \0 w! y/ A# ?1 s8 x0 l
# V+ d$ s% ~$ R9 h2 C- E6 [9 T2 e
: R S. O4 R& U; ]8 f/ E" e; U7 R# J$ v9 o- h5 V5 ?
|