Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
8 R. O6 a( J1 {7 D0 i @
( f+ j0 u# R5 S/ r8 l: w6 S- rЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
2 s+ C1 \6 a! t& G: B) y. @5 ?
8 n1 O# G( ~( ^4 B( B5 i4 o& CШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
, O7 i0 ^' r. O1 J) L0 @% h" H" C1 J7 l7 L" k7 C
- // Пакет для состояний монстра
" W3 ?+ w. A \: y# X, j S) H$ l - package org.l2jmobius.gameserver.model.actor.state;
- m4 M) z0 g. Q" q2 x
( l" b) g* G j# a# S- // Интерфейс, представляющий состояния монстра
. k7 D: G7 ]7 e r - public interface MonsterState {
: B k$ s, `! S6 v" p& e8 r - void handleState(Monster monster);1 z. Z4 m( I3 `0 v a) | x$ v
- }
/ S1 n1 Q- _% ~% W5 S1 @
Скопировать код # [, N$ C. `$ m4 p" Z
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
! p& q3 ~: V- y" E3 C
" x. P: P: f3 w' }2 ~ xЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
/ U1 O( w9 Q( _$ O2 q6 e; o
: M3 A/ ]* j- |* J5 R, n2 iКласс для начального состояния монстра:* v1 \. {$ F, Z6 ]5 Q% D
- // Пакет org.l2jmobius.gameserver.model.actor.state; s: i$ ?9 W. p1 ?% r1 ?8 E: R
- package org.l2jmobius.gameserver.model.actor.state;( x" }7 C$ R y. R( ?
I) }/ l( b8 Y$ i- import org.l2jmobius.gameserver.model.actor.Monster;
$ Y. i# ^8 V; M5 q4 ^1 k& V. \ - $ S( A! j$ p/ d* w1 v0 D8 Z: t. C
- public class InitialState implements MonsterState {- V1 j7 L6 j. y! n' Z5 e: g6 l
- @Override; c8 o4 U$ J: B* E+ G' h3 f" |
- public void handleState(Monster monster) {
+ g, T- Q/ A' K: n7 M A - // Начальная фаза боя
$ A: Y! t' @( K* E- f5 G) R - System.out.println(monster.getName() + " начинает бой с обычной атакой.");& U8 S% z0 t4 d
- }+ ~. r8 r( n: j' q' n
- }* F# Q2 @" B5 N; r `
Скопировать код Класс для агрессивного состояния монстра:; P- M, U7 `; M# ~
- // Пакет org.l2jmobius.gameserver.model.actor.state
* G; {$ V9 j; F. u6 Y - package org.l2jmobius.gameserver.model.actor.state;3 g$ ]0 X8 G. j. N5 Z( Q- p1 [
- 5 W# i; w) E" Q" [4 ^) K0 ~! ^; y
- import org.l2jmobius.gameserver.model.actor.Monster;
, V2 A ~( S& I6 _% P' L. X
( r& T. f9 ]. }; W! s/ j- public class AggressiveState implements MonsterState {
7 P/ n3 ] o( U% M0 l* n! f - @Override
" A2 {/ m: L. }3 f" g - public void handleState(Monster monster) {, r0 |" k& r) f
- // Агрессивная фаза боя4 E5 d/ k6 {; H
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
/ a w% l/ `3 }5 m - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
5 T$ }4 {$ v& V/ e8 r) B. T2 N - } [" A& V0 s$ ?# V
- }6 X, `/ {0 Q1 O6 l' ?$ O
Скопировать код Класс для финального состояния монстра:* |$ i# U# j) z% Z- O
- // Пакет org.l2jmobius.gameserver.model.actor.state
' F2 t+ A$ w4 v, P, S" v - package org.l2jmobius.gameserver.model.actor.state;2 k. o0 J. f+ N- _
& T9 ?7 I M; b9 V( R# g3 u l- import org.l2jmobius.gameserver.model.actor.Monster;
7 B3 C/ c, H6 O5 Z& X2 G" T
0 o4 _9 ]+ W* y$ I( i- public class FinalState implements MonsterState {
+ C& F- B+ O* Q - @Override' P# _, v m# L" }6 u S. `! {# [
- public void handleState(Monster monster) {
% s6 i9 p5 O; l" f' i - // Финальная фаза боя: S, f% Q# l) M4 i6 t% `- }( ^
- System.out.println(monster.getName() + " готовится к финальной атаке!");
/ v2 M2 d( [0 L9 v, [ - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
. C) R. A; s) A$ U+ S& L( }2 Y - }2 u# Y! I2 u) j8 p
- }% U) L9 ]! V7 j- J
Скопировать код
- S- A; L( n, j' AШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
& F6 Q8 [: A: h- // Пакет org.l2jmobius.gameserver.model.actor* @# t( ^, i& R0 f# g: C7 V- N# Q
- package org.l2jmobius.gameserver.model.actor;
! ~+ ?: K- x+ o1 |- c6 |7 J - 6 N. d% P4 f# C y
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;2 ]8 H* s2 o& B) ^0 n' B
- import org.l2jmobius.gameserver.model.actor.state.InitialState;
1 Y* X- ~% q$ D+ S0 G6 ~+ G7 C5 Q - / a! ?2 i# O$ B& {/ G
- public class Monster extends Creature {
+ |( D& d8 l% \ a4 d% u; d' w - private String name;+ q+ E6 b$ V- C) D# ]& n8 T
- private double attackPower;
, T- O) f& L' d2 T. p - private MonsterState state; // Текущее состояние монстра; a2 L; ]$ I0 Y" h" K/ \( z7 l( p
- $ ?% H H3 I1 g* v- p3 g) f
- // Конструктор монстра* |* J* s, u: `
- public Monster(String name, double attackPower) {2 r& T: V7 y, D3 @; s/ _2 n R% m
- this.name = name;7 t1 l9 }$ Z! a2 q a3 J2 i" P5 Y2 D
- this.attackPower = attackPower;% Y* o+ `5 H3 w
- this.state = new InitialState(); // Устанавливаем начальное состояние8 {1 I( a! S _
- }
9 Q, c2 l- Y- z6 ` - - m5 \. v. X* q) J+ @
- // Метод для смены состояния
$ m/ O9 F/ |+ } C/ | - public void setState(MonsterState newState) {& U! Z' U( n( k5 s
- this.state = newState;
" k" _& D0 D; T! T( [9 w. B a - }$ G' k- h2 Y; Z1 l9 f0 r5 u% b
- 1 r0 q: z- Y5 E# M
- // Выполнение действий на основе текущего состояния# e/ r( M, Y7 M) W6 d
- public void executeState() {" X; D5 L8 k) a* d) S! g
- state.handleState(this);
! A$ L) V/ `2 L9 s' C - }, J- |+ L3 g8 o2 l3 O8 _) \3 w
- ' l6 N8 Q7 U8 E7 e0 y# e0 v3 n' ~
- // Геттеры и сеттеры
0 X$ c) `9 R$ n - public String getName() {
: h- p7 I& y8 p) i; l t1 O- C$ _- ?2 E - return name;# d& A( ]& |& { k
- }
" ]1 F) M3 N4 \3 H, ~) d
. I6 g) |) b* u6 U$ |& T3 d- public double getAttackPower() {. Z! o0 }3 x/ g; x9 ?
- return attackPower;
4 d( \; Z" T6 Q- T$ S5 P - }
# K3 o0 H! o) i) n+ F5 Q
& }: K; w! U7 i3 [: t3 t3 P' _- public void setAttackPower(double attackPower) {
5 c1 K' L, R8 q' V7 c' N# S - this.attackPower = attackPower;+ L+ x o, e0 `0 @" U; j
- }- U8 c; y3 q, P. G
- }* N9 g4 ?6 l6 B: ?( P" r: E
Скопировать код
3 ]5 {/ o% W7 Z3 m# @# [1 AШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.) C0 g! J& a X" n
$ z9 U2 ~8 _: k" R$ Q, l7 s- // Пакет org.l2jmobius.gameserver.model.battle
& m, }) i1 x3 t; h: X/ ~2 O - package org.l2jmobius.gameserver.model.battle;- A; I% _& c3 ]* f5 d' F
- ( _1 F& c( O* ?' z4 c' [* F
- import org.l2jmobius.gameserver.model.actor.Monster;
2 k/ A Q T. @! `1 p2 X) S - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;( \/ |: {. v; _; ?- z4 j. m% k
- import org.l2jmobius.gameserver.model.actor.state.FinalState;
* d, X3 T9 z; A e. Y+ s
7 j8 c2 k6 h3 f( d2 ]! f4 u- public class BattleSimulation {
8 ?8 e2 R4 k, b5 _0 n - public static void main(String[] args) {
5 c; z: I) r; c2 E4 O4 V$ r - // Создаем монстра с начальной атакой9 O+ q/ k. Z% |+ \
- Monster monster = new Monster("Дракон", 100);" @4 y$ O% J4 H V. i
" a8 X5 o3 |5 Z+ r) ?7 w3 O4 ?% B- // Начальная фаза
! o. A- A5 @6 e# M1 f4 E0 S; {, q4 t - monster.executeState();
( K0 u5 Y( w& ] P
* ^3 b7 J1 y0 v) a# S- // Переход в агрессивную фазу) X+ a- s9 Z' L e& ], C
- monster.setState(new AggressiveState());, A$ Q8 Y4 {& g5 J
- monster.executeState();
4 g: Z/ q5 x; [# S# h, V1 ]
( I5 j# h( ?, @( I) G- // Финальная фаза
' l$ G% J3 L2 Z - monster.setState(new FinalState());
) K+ k- K* L. O( F" m; x: k1 B5 ?! m9 N - monster.executeState();: d1 t1 Q# I- k, \. G/ c! I4 K
- }
, L- ^9 ?4 x8 Y$ P3 w& N - }
3 u! J$ W% X2 {& ?* V/ F
Скопировать код
; V, C/ W, Q! d5 S- IКомментарии по структуре пакетов и классов:
6 Y: z9 C ^' b/ u5 h7 a1 ~; X- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.+ }" [+ n" u0 ^
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.6 x2 @) J1 t( w, I* |! \2 F L5 g0 z
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
8 s& C5 X7 ?, M$ W5 b' Q7 E0 s2 N6 w2 i$ E) W
" f& ~0 F" y9 y* i, A: S2 E t8 T8 p* w! z1 R
U$ a! y0 T, Y3 u% z' y( A
5 f1 Z% _7 E3 T3 O. m4 F% P3 H% R$ z
3 Y: |- K% q" S5 l; k( y% L2 M9 W& z7 m# y8 L
/ ^" `1 P& _& ~$ ~
8 N5 j8 n- U" Y1 l: X/ C/ Q2 t
: F! X! R7 ~1 o! o$ `2 m9 H" C+ ?
9 j+ } t0 P0 a9 N8 ^0 K' k1 e& z
6 [4 y( H( i: @3 U6 P1 t1 t9 |- R7 W* c+ m% T! N& F2 S) Z
|