Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
9 C) H1 N6 T) w8 w7 ^. I5 a4 m+ R& ]; q9 X4 ~4 i7 `
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
; O0 A7 U7 l5 @% Q0 Q
- {8 W! m0 O) Q( O1 a! J0 lШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния./ E- L# _! ^8 v7 b6 y0 A* L
5 K: V7 l% e# H( y7 x9 M- \- // Пакет для состояний монстра
7 V& u# E9 h% y: p/ g Q% T$ p - package org.l2jmobius.gameserver.model.actor.state;
& v7 w9 V; w! l- U - * o3 R- T' O% y( Y) g& K
- // Интерфейс, представляющий состояния монстра
# V1 O, ?+ M) ~% s - public interface MonsterState {7 e- w9 L% f7 E. _4 C8 K& G9 F
- void handleState(Monster monster);. [- g$ f8 \, h2 u9 C" t
- }- j& T8 o( w$ W. E! H9 Y
Скопировать код , _$ T, ~: O' i* b
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
% T" X) p/ \3 l! D$ ^3 A2 A+ }# R3 M, A$ o& Q- G7 W7 i
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.; X" Q9 T9 a- F w0 d3 u8 ?
& ?2 H) |# K, |$ Y% eКласс для начального состояния монстра:8 q# w6 r Y, P+ M% p* M
- // Пакет org.l2jmobius.gameserver.model.actor.state
* b% K% ]) Z; ]% U* D" T - package org.l2jmobius.gameserver.model.actor.state;
) S' S1 Y: E! _ {
5 g3 u1 U: @# ^; z7 z- import org.l2jmobius.gameserver.model.actor.Monster;: M7 ^+ a* ?' @0 u
. o. L0 h. ^2 h$ m- public class InitialState implements MonsterState {
$ L* d5 w; {$ ?5 g% u" f* n7 B3 n. r; P - @Override* T% T s3 `0 l3 B% R
- public void handleState(Monster monster) {/ F- S7 T# Z7 n, h
- // Начальная фаза боя
7 [3 @ Z% N+ o; u* P' h# D - System.out.println(monster.getName() + " начинает бой с обычной атакой.");6 I p( r# e! x; F* i
- }: U2 i1 S4 l$ E1 ~; X5 g9 @
- }
/ j5 ]% y4 z9 `9 t/ h' Q4 ?
Скопировать код Класс для агрессивного состояния монстра:; n# y9 y; E6 @8 W8 Z
- // Пакет org.l2jmobius.gameserver.model.actor.state
; _4 ^/ E$ v' j. V - package org.l2jmobius.gameserver.model.actor.state;: d' l: g+ H# V( [3 z
- , V, L& l, Z) s% y0 p% p! S5 C
- import org.l2jmobius.gameserver.model.actor.Monster;3 i: B4 K- D, v) Z# _* {2 U2 p
3 @6 L( `; g, t! N- public class AggressiveState implements MonsterState {
( w1 I* t) Y+ W6 \ - @Override/ y5 [5 s$ m& l
- public void handleState(Monster monster) {
9 H# E \' d* g9 S% t4 C) f* C - // Агрессивная фаза боя
: |) p }2 ^" V ^( J( P! F0 O- B - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
" T# \ G, q8 l( [) N - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
' W1 C! H! [# u/ d A% J/ h - }
5 e* T8 I( m/ z7 \5 ^ - }
' i/ m) N( U3 b) D$ \5 Z! p; Y K
Скопировать код Класс для финального состояния монстра:4 G" w" K; K1 E2 z4 w2 [
- // Пакет org.l2jmobius.gameserver.model.actor.state8 `+ C3 l/ {! i" t f5 |
- package org.l2jmobius.gameserver.model.actor.state;1 i; H4 W1 R* c$ b' b
- ) V; ?. t$ G% A
- import org.l2jmobius.gameserver.model.actor.Monster;
9 g) O& v# i8 U1 M2 y% n- F
& G! H- W6 |7 o' J- public class FinalState implements MonsterState {! h* W8 A& X$ r: @; M
- @Override
3 G/ x# e2 \& G9 a! V/ h' r) Z- ? - public void handleState(Monster monster) {: ~& E# @2 n; S0 }, r7 {: n
- // Финальная фаза боя
, z" |% e' {0 y - System.out.println(monster.getName() + " готовится к финальной атаке!");
# K. N7 j( q# K! ]! N - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки2 m ?, p% O% {; Y N" u9 k
- }% {: b+ c' ? B, s3 P
- }( i* T% y0 I5 h0 |! }6 v# m' X& F
Скопировать код
- ]9 V% f! }& z2 D8 N, T0 iШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.! M4 B* X( r I1 c+ Y
- // Пакет org.l2jmobius.gameserver.model.actor5 u0 ^( Y8 O" ~* k
- package org.l2jmobius.gameserver.model.actor;- t% w( y- U( K3 j* B
2 U" K1 u" r" {- import org.l2jmobius.gameserver.model.actor.state.MonsterState;/ X9 `0 e6 L* S3 Q% g& t1 G# Q) G
- import org.l2jmobius.gameserver.model.actor.state.InitialState;
0 K5 T6 j, r4 D& {0 Z
1 |$ n# W6 o. f4 ] J- public class Monster extends Creature {
. i: q' _3 j3 s - private String name;
' h/ z' E6 G+ h( K0 e9 B - private double attackPower;
6 A# K r }7 j+ W2 j - private MonsterState state; // Текущее состояние монстра9 K& r% R9 {# W3 l# k+ M+ T
3 Y1 W' H+ b$ O& p: m) ^. ^- // Конструктор монстра1 I8 \, L* B7 D8 M4 K4 @5 x
- public Monster(String name, double attackPower) {* p, q( _6 v2 L( _$ `0 U# e3 r3 N! K
- this.name = name;
- X9 l) f6 y. x9 @; Y - this.attackPower = attackPower;) T# @1 F# i# \9 T% t
- this.state = new InitialState(); // Устанавливаем начальное состояние* K* u3 O1 U. H7 b a6 k$ q5 z
- }
, v1 {' ~# C# h: l2 Q! ^& X - & U( B7 \5 m k, a/ I3 v! q' _* B
- // Метод для смены состояния
0 ?: ^: t1 N* f' [/ V1 U - public void setState(MonsterState newState) {
1 c: W7 ]! P" M& G m" n4 X: Y - this.state = newState;
* Q9 ~" r$ T: S, X - }
6 [; D* c: b' i4 U, ~/ w V
- V- H1 M3 E6 P$ G5 d! S- // Выполнение действий на основе текущего состояния
1 N4 ], z" Y$ z/ _% v# v - public void executeState() {3 o+ p& f: q" ?+ y
- state.handleState(this);
9 O- A2 N+ K: g& k - }
1 B- x' K4 {8 Z @: z - - i4 c8 R! Z2 |9 |4 x$ Z
- // Геттеры и сеттеры( Q. z; R$ V2 r, s6 y5 L& t
- public String getName() {9 z# n! I* x/ q5 Z3 Z( i" T: ]7 ~
- return name;
4 W' V/ L9 [ B: O# A7 R/ `1 h% p9 { - }2 J- I7 _, B! M4 ~1 O, c
: m8 ]7 m6 @$ [5 U; K8 v- public double getAttackPower() { K" T4 v' X* R, ]! E( w, Q- u* t" F
- return attackPower;7 N5 \) A/ k' m0 F% e
- }. s, H+ s( l# y! i, t
6 R+ E% ]; h, ~7 R. F- public void setAttackPower(double attackPower) {* |5 i& y, |* l" C; h4 v
- this.attackPower = attackPower;/ P1 Z1 k4 N2 F& V
- }
; ^2 E# C1 y, p r4 ~$ J' J - }7 c( L! ^' A( o5 G4 {! H6 }+ `; w
Скопировать код
* U& M( z1 ?2 R6 V" z. a' vШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра." {; ] {1 W/ {& y) }( c
# @6 \* j+ p# R; X4 {) K% M
- // Пакет org.l2jmobius.gameserver.model.battle4 I* a1 ]0 Y. B3 R2 [. s7 N3 z
- package org.l2jmobius.gameserver.model.battle;
5 R6 ?% s/ q6 s+ t* t - & @# ~5 S6 i" d. f
- import org.l2jmobius.gameserver.model.actor.Monster;. M/ T* U3 t: @! B9 W/ v4 l
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState; ?" `$ Q: A6 K6 H2 q _: i
- import org.l2jmobius.gameserver.model.actor.state.FinalState;
. U S/ i# N8 D, P. x - & s; h' w* ^ H( R
- public class BattleSimulation { G. G6 b! P. f8 s5 }
- public static void main(String[] args) {
0 ]% M0 L9 e8 H9 ]9 w5 \ - // Создаем монстра с начальной атакой8 E% {0 Q$ x7 |$ h7 i& F
- Monster monster = new Monster("Дракон", 100);3 O& `- Z. @/ B* p* E. b# E5 o
- + p6 U1 S: ^2 O9 z/ t- r% ?
- // Начальная фаза
. i# m+ N: Z6 w! n. r - monster.executeState(); `- j) x5 F- l, O( l
+ R5 X0 c& `3 O/ _1 G7 N: K! [# X- // Переход в агрессивную фазу( A! I, s! T: t. P
- monster.setState(new AggressiveState());
" H3 e6 G) T; M) G- D: \ - monster.executeState();) }( w Y( x% n$ B1 x2 {
) n; _% C( \) v i' X* _: I- // Финальная фаза' w) E6 ~% t; g7 [; u" q- D
- monster.setState(new FinalState());
7 A* |; Y4 O. C- Y" S - monster.executeState();
6 m2 o r$ Z5 K k - }
Z+ q/ u2 z9 k: R$ D' I - }3 ?9 V7 z! P Q" w6 `
Скопировать код
7 H! _1 ?- f$ N( zКомментарии по структуре пакетов и классов:
: @+ S. r# A5 ^. @' g6 }- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.4 `" e+ H8 c7 I# r7 s. i& j8 a
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
. Y3 o- |0 [9 D) U9 QЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!3 W1 N3 M, o# }- h
- O3 \( f4 R9 ]
- A# j2 C# b' h
+ u8 v% n4 q/ L: A* ] r$ }1 y
* x- Z1 e) B7 h$ b" F5 v
/ ?5 p" M( q! }3 i% I& d
! k- n' ^% b6 |1 q! e' S6 H# e) m( o
* C; R" V% i% G$ ]7 a/ T& u: T7 K r
3 L5 O8 E$ G# J) x6 `0 T. x7 h& k( a, z/ ^$ S- e d
/ H- S5 E3 U# Q# L0 @1 g
2 `8 z" l; e$ a# y$ A6 U- l1 X6 j6 ~ D
|