Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 9 Y$ B9 ^1 j- s& l4 J; V: j2 ]
4 {0 I; v @* l4 m0 N+ g
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.7 z8 S& E9 J: \- b
4 S' M. l5 y' N
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния., |2 Z6 K3 P7 T/ m- N' T* M4 D* |
3 H5 T+ r1 s; e7 M8 A8 ?5 Q- // Пакет для состояний монстра3 j7 S9 e4 g/ r6 F; ? N" ]
- package org.l2jmobius.gameserver.model.actor.state;- l$ T# ~+ L4 E! t: o% S
- 0 T7 ?4 y! k. U& @; Y
- // Интерфейс, представляющий состояния монстра
- ]2 w( B+ |& ~ - public interface MonsterState {. Y! ^& `/ R9 ?+ r' j
- void handleState(Monster monster);
1 `) q& e0 S) T' c$ T9 l8 l0 ~ - }
* M! v, I, t, S! u# ^$ j+ m$ s; d
Скопировать код 7 w( h% `" y5 n9 g$ ~% |7 I
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. $ t+ C; d+ J* ]2 W3 u4 t" {, g( H
k5 n9 H' l7 R0 A& L% j" f0 o
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя./ q' v) ~$ v* E/ P0 r5 t- m
7 z# K! H7 j" f) eКласс для начального состояния монстра:0 b! q1 J4 L2 V( D4 c& J
- // Пакет org.l2jmobius.gameserver.model.actor.state
" b. h6 z% y, v2 e - package org.l2jmobius.gameserver.model.actor.state;; ~9 A- U6 Y8 P4 q) k
; ~! ^* I( X" V U: W- import org.l2jmobius.gameserver.model.actor.Monster;
. P1 t$ R+ g6 m1 P9 ]0 M
0 t) h8 }2 b" j+ f3 h7 |- public class InitialState implements MonsterState {$ h/ N% `* d0 T; u
- @Override3 |" y9 b* n8 M, O) l1 h
- public void handleState(Monster monster) {+ m! N4 c, E, r v, ~( _) o
- // Начальная фаза боя
: u( [7 P) G# \ - System.out.println(monster.getName() + " начинает бой с обычной атакой.");
* W: {" H' X; D: n: j% U - }( U" r" v( R! X3 J1 @! r
- }
1 q N1 Y& b# w1 M. N2 k
Скопировать код Класс для агрессивного состояния монстра:
! Q5 \- e l6 U5 u- // Пакет org.l2jmobius.gameserver.model.actor.state
3 z$ }6 [+ T4 c' e1 i* Y% l/ u/ W - package org.l2jmobius.gameserver.model.actor.state;5 n% B8 C6 T) X1 {" O& X" t
4 U* [; Q" }4 h) R- import org.l2jmobius.gameserver.model.actor.Monster;
+ Y( H' C( _9 h3 f* o; F - ' u) J D# `$ c5 w& m6 T
- public class AggressiveState implements MonsterState {8 b2 n2 [ R$ A0 A( a' _
- @Override
, _2 _$ E% z1 E - public void handleState(Monster monster) {3 t: I+ g4 V3 Y" y# b; p
- // Агрессивная фаза боя9 p! K; D7 ]3 C' B
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
# f5 `- `& l; s+ D+ ~* g- f - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки' p" J D1 q8 P( C# T; Z
- }( D% G a8 M A7 O+ Z6 A9 M A
- }
' R2 }& k" b2 M j B
Скопировать код Класс для финального состояния монстра:
, t% Y6 l& U) r# f1 y% Q1 H- // Пакет org.l2jmobius.gameserver.model.actor.state
6 r! S% n( Z( j! c& ^ - package org.l2jmobius.gameserver.model.actor.state;" s7 j2 j) X# Y! y" w5 q4 C& v! r
6 E+ _8 f7 t5 `6 R$ G- import org.l2jmobius.gameserver.model.actor.Monster;, ^, Z0 d$ d2 L9 T! Q, d* |
- / l: N5 ~9 Z, B
- public class FinalState implements MonsterState {& v9 q7 Q, B3 l+ u+ V
- @Override
. d7 B3 d2 q' B - public void handleState(Monster monster) {+ t( c: M# u. G: f* v2 c
- // Финальная фаза боя+ q z1 V2 m1 V8 ]5 [7 Z" W" B
- System.out.println(monster.getName() + " готовится к финальной атаке!");
* Z3 `3 [; B5 Q - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
7 q) B1 @4 j* l! G- p% C - }
3 u9 b/ S/ l+ M" Z2 y2 P - }* H0 N" p7 ?; {! I, a* ^0 Z! Y. [& j
Скопировать код % W6 |4 \$ S( C. ^$ N3 f, q
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
$ `+ J* k; L& ~2 F- // Пакет org.l2jmobius.gameserver.model.actor; i/ k- b# {- r% r9 X% k5 j# l
- package org.l2jmobius.gameserver.model.actor;# H8 G. L$ m; }2 v1 x
( V1 X3 _) Z2 c( T8 O) \* ~; u- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
8 Q. b# N- }% h( g - import org.l2jmobius.gameserver.model.actor.state.InitialState;! j3 T: W7 A+ h" b. [, R3 S& B& R
- # M3 a' j: G/ k m& K
- public class Monster extends Creature {6 h9 X3 M1 n8 ^
- private String name;
. R* V- ~3 O" v4 ?- g6 a. l - private double attackPower;
) M; @' l. K% q0 R8 q - private MonsterState state; // Текущее состояние монстра. y. Y7 @$ T' x' O( L8 X
z R5 h9 o7 R' `3 W- // Конструктор монстра# h0 q; Y2 a8 z' g5 {* l9 c2 k( v
- public Monster(String name, double attackPower) {$ g8 A7 P: |6 s" @7 y6 g$ S
- this.name = name;
% U; N# g% S$ X. @0 y2 @. ]: } - this.attackPower = attackPower;
) i+ M# h8 |7 K; H' E% ? - this.state = new InitialState(); // Устанавливаем начальное состояние
0 ~" q2 y3 \6 m3 T& n1 C - }2 W1 B! }2 }, r+ {, r8 @7 o
- 6 m! R5 v( m7 r( t8 c
- // Метод для смены состояния
$ D4 L( k: m- s - public void setState(MonsterState newState) {
& x" o' z; ^ B& `5 d B) _ - this.state = newState;6 z# ~2 s3 X( G. b" f
- }
& _' O4 B2 b, u4 h' Y
! L6 R! ?( t7 c) G( d- // Выполнение действий на основе текущего состояния
9 ^) x/ D7 n! Y2 [- }! r - public void executeState() {+ T+ X" b. L# ?& X. R7 o
- state.handleState(this);, N/ K+ h( C$ K/ B+ G7 o# `
- }
6 I/ O( M( \4 f1 L" E) c
2 g q0 N9 {3 Y9 S# H% f- // Геттеры и сеттеры2 O X# y- D( I- m0 }" J* X! T# Z$ ^
- public String getName() {
/ W2 B& `& T2 D @# n$ |3 \. T - return name;
0 X5 c5 f7 j/ U, Q - }: @) ?1 Q8 z( B: V2 W
- ! [" ~7 |1 F5 O9 H& E0 `
- public double getAttackPower() {0 ]2 ^! Y7 o6 B
- return attackPower;
2 d! s5 P2 S' ~2 s+ G/ S - }
# o: `2 n& q' J3 V4 w6 v - - E* \# |" |& \, H8 e; u+ a t
- public void setAttackPower(double attackPower) {" R4 K/ [2 j1 M9 x- M4 p$ P+ D
- this.attackPower = attackPower;+ g1 { f- w# X& K/ {
- }6 H# c% X# C) x7 M+ n# f* O# l
- }
( b1 t- R# N/ {: A" g5 v6 ~" t
Скопировать код - B5 o9 G$ u5 i5 c$ D( u- S- e
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
( a1 I* j% ~) x S1 B) t/ z) U! Q* C- I( p
- // Пакет org.l2jmobius.gameserver.model.battle* Q# j% G) H5 f- r/ \% z
- package org.l2jmobius.gameserver.model.battle;
1 |: O: I$ K5 C" F8 u) P" T- F
- d# Y0 a- V! w- }9 o5 u7 K4 h- import org.l2jmobius.gameserver.model.actor.Monster;: r% S& {- X/ O* O
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
% M1 d" m1 Y: q& t. ?! W - import org.l2jmobius.gameserver.model.actor.state.FinalState;$ S- C! }9 {) c) p3 B9 e
8 Y. ]1 H# f4 q5 l3 N8 i& Y- public class BattleSimulation {
! f* h6 l. i i5 c# H9 I3 i) R5 i - public static void main(String[] args) {) @; ?9 l. M7 Q( {: h8 C+ ?
- // Создаем монстра с начальной атакой( U% E4 b6 A2 _ m I& c/ G0 S H
- Monster monster = new Monster("Дракон", 100);' e/ q" q6 F: L( b8 c! K0 G, h3 ?" f
- 0 S* B; R8 d5 U {, \: d1 J, `
- // Начальная фаза9 ~2 D0 y8 K' |/ i5 s p/ y: e
- monster.executeState();: r' o1 Y& E3 L5 g) M& y
- , s5 f' ^! w& A8 X0 M4 e, s
- // Переход в агрессивную фазу
. e* H; h! k, \ - monster.setState(new AggressiveState());9 J/ u8 S; @& G0 J
- monster.executeState();
6 H; i* F4 Y4 [% f+ P
* G# e* l4 f$ ?" H1 g1 }- // Финальная фаза
: ?( [0 a* _' r: L0 U' i - monster.setState(new FinalState());$ u, H9 d9 E! G- q
- monster.executeState();
- p6 w$ T; L L: I - }: \# u* J+ W" v' D
- }5 e% J+ z9 F1 h
Скопировать код + @$ Q7 D, f' C& j" L5 S* I& o
Комментарии по структуре пакетов и классов:5 G6 N$ a: `' `. L& @ R
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.+ u7 t8 {9 g% ~+ M, C; T0 H
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.: T( j, v0 p# H9 R4 j8 p
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!7 t! w+ u% R6 j5 j5 i
" S2 |2 O" g* N; N, x& z
8 M2 a- Q u- ?/ N
4 u. g- B( L" W' Z) U9 _2 y: O. b- n* [
* A" r* y+ q. g: ^3 h% `7 {, k2 G
3 }% V* x. g. I+ y& a* {
- G; O+ z/ ~1 G% s1 v Y
0 ^" P& j5 [ C
& K5 w6 ~, O# ~2 V) z$ I; w' r3 e9 r- m3 _
8 i& \. X7 g+ P4 U# D: G& P
3 S1 {/ b8 o2 P& d# g$ Q% t- `6 i1 b8 ]' `+ a( |
! a5 b. L( m2 E; ~+ b. v4 S: d% M" _
|