Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
- Q. l$ [# i) l5 m8 X& z9 ?6 Y$ T, D* Y
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.( ]1 c, J: G5 }* r5 r0 |
4 _3 ~3 H6 I$ E) q4 b$ ?Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.2 E2 G' O! |3 }1 J* Q
! G2 b$ `+ m9 q8 b- // Пакет для состояний монстра
0 L4 j! }, _8 P* N - package org.l2jmobius.gameserver.model.actor.state;
4 P# X" P1 h6 v - ' V8 ^ v: J. c7 p2 P
- // Интерфейс, представляющий состояния монстра4 l2 X3 D% I! x
- public interface MonsterState {
% O* X1 k9 s8 W3 [ - void handleState(Monster monster);
0 l7 {- u1 V W& I# L - }
3 C- r" V# k6 @6 R! m
Скопировать код * v7 F* } F5 W$ w" d
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. @1 r5 V4 | ?
* d8 U/ n# e! A* h+ NЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
" w& _3 v; q5 | Y0 h x5 B0 p& q# u% J; S
Класс для начального состояния монстра:
* E8 F1 x6 a0 a" q# y) o' x- // Пакет org.l2jmobius.gameserver.model.actor.state- `* E0 z) v1 z8 E5 I
- package org.l2jmobius.gameserver.model.actor.state;5 @1 N j. ^+ \! H! _$ p3 N$ H
$ h+ r4 x# o; V# Y( i- import org.l2jmobius.gameserver.model.actor.Monster;7 n* x3 s. ~7 S# g1 |" ~
- 0 n/ r% ]" p+ j5 {3 a: T& S' Y
- public class InitialState implements MonsterState {+ A3 n6 `! c1 `, w8 R9 L! [
- @Override5 @) x4 i! H5 O# @+ s
- public void handleState(Monster monster) {! N. b4 ^) G% q" Y5 N6 O
- // Начальная фаза боя$ h* z, ` \. |: k
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");
. ?4 m" P1 K# Q. L: O4 a: z - }" o: ^" G; M! _0 t6 m/ M
- }
- C9 u+ P6 P y( {1 W' O ^
Скопировать код Класс для агрессивного состояния монстра:
3 u- [! M I' C+ u* q. K- // Пакет org.l2jmobius.gameserver.model.actor.state
6 F& I0 r% R! L5 O3 Y$ k+ } - package org.l2jmobius.gameserver.model.actor.state;2 c% E; v2 u" X! b/ f3 n
- + v) a( x8 `; {5 T) ]
- import org.l2jmobius.gameserver.model.actor.Monster;
! U/ z* l3 i3 Y0 d4 ^+ ~8 J - 0 r; W- |8 T: C3 c( m
- public class AggressiveState implements MonsterState {; F3 z& r5 G6 q
- @Override! f" U7 s% }) ]. m' u! [' B4 B6 h
- public void handleState(Monster monster) {1 Z! Z1 V" C! O9 h2 `( b/ D
- // Агрессивная фаза боя; B, \$ h$ Z/ m5 g) J f
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");( ^5 Z) @- r! _. h. N/ g9 A# a* P
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
" H J; ?( I+ L! d - }
' N3 N/ A: B* l4 ~3 ?) [$ _ - }; w/ W. L, g& S4 u
Скопировать код Класс для финального состояния монстра:! }9 f1 k) \% A5 D, a
- // Пакет org.l2jmobius.gameserver.model.actor.state
4 T3 n/ b; `7 p - package org.l2jmobius.gameserver.model.actor.state;- B* o8 ]. A- g h9 g- s$ k
- * \, k5 V, a& Z4 }; s. k5 v4 N
- import org.l2jmobius.gameserver.model.actor.Monster;
) C0 h# l2 I/ @# z5 |$ ]
) m9 c; }7 K1 n9 B. e/ y3 R- public class FinalState implements MonsterState {* q/ c5 N! p- F- Y$ D3 H9 T
- @Override+ m' m* E+ O _
- public void handleState(Monster monster) {; f9 c+ @4 ~+ ^0 w0 L4 _& w
- // Финальная фаза боя% H& P7 V; Z- Z8 a) F% N
- System.out.println(monster.getName() + " готовится к финальной атаке!");$ h7 X+ u* N% X3 p% w R( Z1 {
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
1 _: i5 y# b& W) k7 r- C/ k - }
' P. N6 W7 D) Z: \ - }9 ?$ U3 L+ [. e- i; Z8 v2 q" H' ^
Скопировать код " Z' A8 k' B( b6 V/ r6 K
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
# ~9 C* R5 {2 w- // Пакет org.l2jmobius.gameserver.model.actor! D, o# a+ a8 M/ h* x. d
- package org.l2jmobius.gameserver.model.actor;' u; s) W, i/ D$ \4 f" s: g
- * u( [( K( o2 Q4 u8 j
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;; `" e& i+ v! N2 E5 F' t; P
- import org.l2jmobius.gameserver.model.actor.state.InitialState;; i0 q0 n! W# v) Y: i. _2 g
- 6 M% x( q4 ~2 L5 l
- public class Monster extends Creature {
~+ }6 \; `( Y0 T g - private String name;
3 c5 d& V/ o2 W7 g/ {1 ~" H - private double attackPower;
: P g% U3 }1 n8 J# y0 E8 J - private MonsterState state; // Текущее состояние монстра. m4 T6 v- N6 a) j
- ; h( t2 j4 F+ O. R
- // Конструктор монстра8 O% x3 U' `% x; u% v
- public Monster(String name, double attackPower) {
$ X+ D4 ?% N/ U$ E/ ]5 t+ V- y - this.name = name;" B3 H+ G- y; a" L( D
- this.attackPower = attackPower;
2 c h8 M% Y# Y4 [3 j - this.state = new InitialState(); // Устанавливаем начальное состояние9 `; F1 P# A. Z8 Y
- }1 N9 b5 `. `: i: |0 _
- / _% |! i0 k4 @- ] x% }
- // Метод для смены состояния
# D3 a; \6 j9 Q# R5 Y" |8 {4 f; } - public void setState(MonsterState newState) {
$ t* Q3 ?: o/ e% x S" ? - this.state = newState;9 e" E) s7 }3 j0 y& w
- }
4 U( |' c! P1 G; t, ]- W# D - $ e: r- f4 P; g8 p/ x+ f' K
- // Выполнение действий на основе текущего состояния6 c* V; ` Z! h7 }( a4 F
- public void executeState() {6 s3 _# ^0 a4 ~# w, L2 q
- state.handleState(this);
8 d; V' D! V# g6 _' l - }
& F9 M9 S7 g b% G$ A: w- h
1 M6 S; M. f6 u- // Геттеры и сеттеры! U/ D+ A# J/ i" D7 j
- public String getName() {' `+ }; }: U( @
- return name;( C3 N) V. y8 f' J
- }
3 G4 ]5 B+ ^6 y( Z6 i1 k( L5 w
) F8 V# v1 P9 j% r7 g! q! d* n- public double getAttackPower() {
1 G4 ?) S; ?6 L" Y g - return attackPower;" y" z. I4 [( D
- }! x% I5 a$ x. w6 R4 S1 A' z% A- i
- 3 e u7 y( R* }" t! w+ y! u# K
- public void setAttackPower(double attackPower) {2 @7 O+ d: I! t8 } @
- this.attackPower = attackPower;4 Y1 R# w# V# x7 H4 b; b/ X J: I
- }& J: y& \7 [. z4 e% ?( Z
- }; B8 L/ q$ r1 }8 t8 G% J) I
Скопировать код
9 q2 ?" q* Q3 k8 @7 {Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
8 w" X4 z! K0 {) g- d( F" n0 e9 q" r" r
K; t1 _' y g2 A$ [1 D- // Пакет org.l2jmobius.gameserver.model.battle5 f; f. ?; d: I9 {, @
- package org.l2jmobius.gameserver.model.battle;' _7 j1 s2 _$ Q! _9 ^( k$ V3 D
# A c$ M I3 N- import org.l2jmobius.gameserver.model.actor.Monster;
% t6 K3 S1 C5 x- D - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
1 g$ Y, s' {2 \$ O) V& W - import org.l2jmobius.gameserver.model.actor.state.FinalState;
* Z+ B) v7 ]$ i& s: t" I) R$ m$ E
* K& ~8 O: ~9 l- public class BattleSimulation {. @6 L8 e! S9 O# N# G# f
- public static void main(String[] args) {
/ I' t2 ?" L( h% |* ? - // Создаем монстра с начальной атакой$ q1 O' j! w3 w* e+ I6 O! m
- Monster monster = new Monster("Дракон", 100);
. \" t2 M3 ]3 ]) Q0 K
1 ?+ @1 U0 a# r. P. W! M- // Начальная фаза8 m! r8 Y: P# Y; e# f" Z0 d% C. f
- monster.executeState();$ p: L; G& ?4 P5 Q1 l# d+ Q
0 f1 N/ o; x- \$ w/ [- // Переход в агрессивную фазу$ d' y/ n4 F" E& s3 o9 C) C* v
- monster.setState(new AggressiveState());
2 L- D$ |: ~% T7 l2 [% K - monster.executeState();4 R- w$ i5 V! \2 }4 [# D7 Z( W
% O) Y7 d. r$ i$ M! ^7 R& J- // Финальная фаза
" T: {1 l- H7 U+ y- G1 B; V' ] - monster.setState(new FinalState());7 g/ e6 i2 _1 d
- monster.executeState();
( |0 S, i" P" r/ k6 b4 y - }# ?, ^* u& Z, c4 ~6 c7 @
- }; E# g5 d6 F' {, y1 U* j
Скопировать код 0 ?! \* W2 O! |1 n
Комментарии по структуре пакетов и классов:
3 ?9 C, O! }6 N& C: u9 U+ c5 Y4 R- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
, @) X( @- [* d9 b8 |5 W0 d ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.% L! B# g2 Q: y9 r8 |
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!, j5 V0 t" C1 W1 L
( i/ j) D, y- z* s" w1 Q5 v, @; C+ ~: g- t
, d% G7 g) E1 X. [7 L/ g% x
. F# U/ G" }/ `8 j& |
7 h1 J4 ~( D$ N2 [2 \# o- W- S. _" E/ D3 C: s+ O9 d9 o$ D
7 j: I* Q: A3 p6 g' V! Z6 f* p
/ p7 `2 e q9 s6 k# ^- Y) l% v! ]; m" [! g6 F; d
6 R. ^' L# r) Y; a
6 @2 i& c/ B4 b5 @7 `9 k0 N% E, h; h' P$ F/ @$ s
$ q/ L& U9 v8 u/ J3 S3 T0 L& Q3 l7 O$ @; [& g8 H3 N- U
|