Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). * l6 B+ p; {2 |, F6 R
2 l% [& h/ i% b/ _Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
, b. k9 u9 M% {; Z" v+ v. d" m, S' A `$ X+ N5 M+ g
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.0 U( I; ?) i/ X2 Y5 Q# v
4 U, u9 W9 \0 U
- // Пакет для состояний монстра; j4 T) c$ `0 A8 T1 O; H- \8 |
- package org.l2jmobius.gameserver.model.actor.state;
/ n. {- m. D3 F$ \ - " m: H' g9 f @/ L
- // Интерфейс, представляющий состояния монстра
3 C% G8 f3 f$ l! z4 x3 ~ - public interface MonsterState {
2 H4 G9 G" I2 R. `. i% [& n7 `8 @4 G - void handleState(Monster monster);( P3 C- }4 Y- o2 n
- }* _: A) q# R1 l0 n$ m
Скопировать код * F- u8 ?% V5 L% {9 K o
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
) x( y# d; S) g" P% k
" g: y' v0 W6 w1 ]Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
% @. |$ C! w) V
" |( m- N8 a. @% B' o7 WКласс для начального состояния монстра:' s7 e& Q' G- @; R: r& j: K7 G
- // Пакет org.l2jmobius.gameserver.model.actor.state
4 j6 D8 T! u% w3 D) S9 n/ X4 @ - package org.l2jmobius.gameserver.model.actor.state;2 W) H( R' O! F7 |7 d7 m
4 Z4 t2 C5 h5 Q! p9 y6 ^- import org.l2jmobius.gameserver.model.actor.Monster;3 f) M$ \. K8 V' \
" K: r y' j% ^# e& w- B! b3 T- public class InitialState implements MonsterState {, i0 j8 |6 V- }0 J/ G/ k T- ~
- @Override
" |) \) O3 S4 F - public void handleState(Monster monster) { x' c' J& O" X7 q$ i y
- // Начальная фаза боя- T- a7 F" m; ]' _4 X( R$ c
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");6 [* m0 V6 X( b0 N% D
- }
' ~3 Z2 {% k9 `4 S4 T - }
$ q! D3 O' G9 y, [
Скопировать код Класс для агрессивного состояния монстра:
! D) |- u* N4 h, s- // Пакет org.l2jmobius.gameserver.model.actor.state
) o* y. b7 k2 w2 g, S6 v5 ]' _ - package org.l2jmobius.gameserver.model.actor.state;
6 T# Z7 Q3 F; f+ _# X0 {' {% b - $ C7 _7 ]: W9 B) q. G
- import org.l2jmobius.gameserver.model.actor.Monster;
4 F4 ]0 k- v) \/ Z - % w, \: @ ]' J% q0 ]
- public class AggressiveState implements MonsterState {
) s _$ d! l4 q& M/ { - @Override% z; l2 H0 D% `+ B Q N7 L
- public void handleState(Monster monster) {
% T& O; Z$ Q2 v# X- q. W. C - // Агрессивная фаза боя
6 y/ }; K4 q6 ~% r - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
! a" u: U6 V/ e* {% B( y! L3 } - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
) k/ o4 J* V" D* |, v% v- } - }
; o- _( l( j7 a - }
& I1 n M1 E0 j$ [+ E' k' k
Скопировать код Класс для финального состояния монстра:
3 p. U' S/ ~ m: N4 h( }- // Пакет org.l2jmobius.gameserver.model.actor.state4 K. q, T1 Y! }7 {- h, u3 L
- package org.l2jmobius.gameserver.model.actor.state;/ W- o. V+ j) w7 I$ b, M1 I
/ z" p" s8 |9 U3 L1 s, o- import org.l2jmobius.gameserver.model.actor.Monster;
8 Z, I9 E2 x' r3 g8 e. o
9 h) U) l4 X+ y! Z( c- public class FinalState implements MonsterState {# ] o: N7 t3 {3 x
- @Override- p0 q+ a4 u1 H9 v8 n3 K' S
- public void handleState(Monster monster) {
3 A9 p* d: P8 ]* _! I& p9 k - // Финальная фаза боя. R) L' B# X3 b4 ~& U: q; L
- System.out.println(monster.getName() + " готовится к финальной атаке!");
" c# ~5 t2 X1 \$ t2 ~+ m - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
4 f( |0 A( |+ L1 C3 H7 {1 S - }; D' ~/ }% `! h; o6 S
- }4 [$ ]. d6 _2 T# |2 F7 ~. _
Скопировать код
# c! ^, V- p: s! zШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
8 c, }# F) c d) y; u/ t- // Пакет org.l2jmobius.gameserver.model.actor" u8 a* ?( b b- M+ ?9 e8 }( z
- package org.l2jmobius.gameserver.model.actor;
4 y- y4 t$ d/ h7 Z* | U- w P - : q3 w3 D* v/ h4 T$ r$ W# ~. t
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
+ Q6 }$ q3 v% b4 [ - import org.l2jmobius.gameserver.model.actor.state.InitialState;, l2 _1 z: m& F, x9 Y4 R6 k
5 a! z6 c6 e* ^- public class Monster extends Creature {
9 g. R/ @) ~. Q" x( G6 S - private String name;4 @( ?1 y- W' v8 [% f7 D6 y* b
- private double attackPower;
! z) Y* U+ m; L8 N - private MonsterState state; // Текущее состояние монстра
- E4 y/ J4 i' b2 s9 a - 4 Q( _3 Q5 z6 X9 \2 L
- // Конструктор монстра
; I; x* L, S3 W' _1 y+ K - public Monster(String name, double attackPower) {8 l( K% S+ s+ M, M2 Y4 T/ ~% d
- this.name = name;
; B2 `) q( Q) K# v: g) r/ y - this.attackPower = attackPower;1 D" a4 ]$ Y$ H |+ z4 G& p
- this.state = new InitialState(); // Устанавливаем начальное состояние
0 M8 J; U8 L9 _$ R7 x% e( O - }8 C0 K: t2 T+ N" L+ M
- & ]" W- F0 c3 B2 B# @) U
- // Метод для смены состояния
, Q, D$ t, r- x$ O+ n! N - public void setState(MonsterState newState) {
8 g- M* q. o* W! |( n. m# L - this.state = newState;/ ?/ i* d5 |& \3 `3 M
- }
) W7 M, {* ]% t0 m
+ ]& Q# T; C9 B1 w \+ f: O- // Выполнение действий на основе текущего состояния1 B: o4 C' B& W$ ]6 @
- public void executeState() {
3 L/ ~* B3 l1 Z& k% U) O - state.handleState(this);
( D; r, b- x1 [# I9 x; T5 Q$ N - }/ w/ ^7 [( E7 t: R3 }" d7 P+ [4 [2 @
- # J- |2 t$ u, q: \; E S
- // Геттеры и сеттеры
) [: E: \2 h5 c( h' O0 j - public String getName() {' |0 J& [/ T# T2 t+ z
- return name; M; _! K! W: b9 U7 F
- }) V* \& Z% k; ~/ U0 b
' L; a8 `! |" P) x1 T" U- public double getAttackPower() {* {. ~; ^* \6 p, n5 l6 Q7 F% u
- return attackPower; Q: M0 j% @" k1 P+ x2 O
- }
0 ]* f0 P! ~; I+ Z/ i8 U
. |! L" c& K* g) e- public void setAttackPower(double attackPower) {
& c/ G: x1 ^1 Z - this.attackPower = attackPower;
; z2 _- m, W, @1 d9 y$ f* O - }$ x; c( k" G1 `$ o
- } \ A$ \- u, Q! U% b& T) T& d
Скопировать код
& \& b6 l4 o7 l) k7 x5 o. g0 xШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
! W8 H: ~: G; z- C8 J* l* J0 T# G$ h- B
- // Пакет org.l2jmobius.gameserver.model.battle% c2 E& k2 ~8 Z* L/ |- J1 O0 t
- package org.l2jmobius.gameserver.model.battle;0 ]) s" T+ Q- |. _
- 0 q: Q4 o' f9 W+ u2 K
- import org.l2jmobius.gameserver.model.actor.Monster;
7 I3 q. l" ~, M8 _3 n1 n/ z/ g - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
' E3 _9 E* p) ~+ F4 ^% P: x' I - import org.l2jmobius.gameserver.model.actor.state.FinalState;4 N- q, J1 E7 f
- 2 i9 w; {: t @: a. Y$ s
- public class BattleSimulation {
* Y4 X4 i& S' ^) Y - public static void main(String[] args) {
( G( c. p) n# ?9 W% Y ~/ ]% \ - // Создаем монстра с начальной атакой# X& h% h9 l$ s
- Monster monster = new Monster("Дракон", 100);
# u$ Z# K" T( ?; b - 8 Q8 p7 o. r& m# C
- // Начальная фаза c- S- e: r- _7 X
- monster.executeState();/ {+ L F) h% U5 [: v& U
8 F. z7 B- P$ X! G' ~7 u7 u* t; j5 y- // Переход в агрессивную фазу, F+ b5 B8 i- d$ J" a( m
- monster.setState(new AggressiveState());( [# C" b [/ n7 B
- monster.executeState();
" K4 o6 b: | W8 r8 I
, [5 L! P6 X! c8 {6 D9 b- r: } ]% R- // Финальная фаза
1 [/ [+ r* p: \4 X" \2 E - monster.setState(new FinalState());
3 q0 M7 P7 h0 \/ q - monster.executeState();: o' ]& S! F$ r/ K" p3 N5 T
- }1 ]1 s& r# B4 z( D9 p
- }
9 ?/ \ V( T% p% Y' E) T# B4 w7 W7 O3 e
Скопировать код
2 _6 |6 W& P, ~4 P' k$ wКомментарии по структуре пакетов и классов:
3 d: i# `1 @; }$ d( ^ ~0 e/ C. p- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
, k9 z/ M, F3 w; m) n ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.- d7 u* Q8 M4 l: F9 ^4 I1 i
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
* v1 @7 |1 S+ W- T6 I: x1 @; P3 ~6 s" ~7 O9 J& f
3 ~: \1 L1 f( L+ N" [, \& ~
4 u! c& w, P3 Q: \3 h% a& x: b4 r/ l: m8 o8 l& X4 i
' L& F. i' h: q# r! M$ j& B& i7 I
" c- \* B1 I1 C
0 v' J n( j6 O8 a# i: Y# y O4 ]; H/ q5 |$ |9 m
0 D' @" i! O4 M$ l" ^3 a7 v6 f" j, p6 a& |, K. G: p: t
, f. z1 b6 b0 i7 D6 k0 ^2 q F
9 X, d! p" G* d% c3 y# |+ S1 V1 X+ W, X. T7 s6 K4 L" ~
9 X, U! u2 E |. f* p
|