Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). ; ^3 b" h3 X3 X( N" S+ R& r
8 X2 e6 d7 ^ Z8 QЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра. S0 D) U3 q. \5 K0 s5 g
; t5 [5 x2 ]( }3 w5 ?( {' F& dШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.+ G/ D1 z8 F5 ?
: y+ |, \7 {- \: u# S7 o- // Пакет для состояний монстра
- a4 L5 x& t0 m) B+ [9 J! w - package org.l2jmobius.gameserver.model.actor.state;, a' F- D2 E' _
- ' j# M8 C; g4 ^4 S5 j% [
- // Интерфейс, представляющий состояния монстра
! q" v' k9 s" q/ p9 \ - public interface MonsterState {" }0 G2 F8 P7 X* ~7 F2 w4 L
- void handleState(Monster monster);
9 `, ?4 B7 {( b, H/ l - }. |: O* e* o( l3 A
Скопировать код
5 ?( |' r$ A {9 ^, O7 X# mШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
+ _7 @; x7 E, a/ L4 W7 n. T% v% R1 z; T5 u
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
V1 b8 H5 I a+ O, X9 Z! Y; t+ X
$ j6 u% ^, { b- N/ NКласс для начального состояния монстра:
1 M3 h, [4 c& x$ j& G. }- // Пакет org.l2jmobius.gameserver.model.actor.state( J% H' N( B$ q) S
- package org.l2jmobius.gameserver.model.actor.state;
2 a/ f0 ^* h6 j" P/ U4 _
, R3 ^7 R! t S, D! P1 v) A9 }- import org.l2jmobius.gameserver.model.actor.Monster;
/ F* O! ^& E$ I6 u
# O- `, {7 Q: J' n' w5 k7 e( E- public class InitialState implements MonsterState {/ r4 [5 M; ^ i: P' j0 ]
- @Override. C. m% c9 F s6 y. c) n9 d0 [
- public void handleState(Monster monster) {
8 q6 c$ P% g& h5 N( X - // Начальная фаза боя
2 Z' Z# d5 i8 {* g7 B6 U4 i) u - System.out.println(monster.getName() + " начинает бой с обычной атакой.");3 f6 X* n. b$ f" T
- }
: [) A6 w& Z% p; H1 {( g. l, Q - }
2 m6 _) x w) B7 _
Скопировать код Класс для агрессивного состояния монстра:1 @. t- A; y7 Z+ \4 u9 P
- // Пакет org.l2jmobius.gameserver.model.actor.state
7 j* b5 x- b. H, U- c; H4 ~" s - package org.l2jmobius.gameserver.model.actor.state;
# P, E* ?, @+ t( c, j) L: n0 E - % \4 {; \, \. Y, Z
- import org.l2jmobius.gameserver.model.actor.Monster;
% E5 q# F y' G" U) X3 d* t
8 C% n- e; |8 {; u0 d% e- public class AggressiveState implements MonsterState {6 M& ^- h3 G7 F; t" `: {/ p* g
- @Override
8 k& r6 f7 |/ D) @ - public void handleState(Monster monster) { P6 T7 w& Y: C2 o% `
- // Агрессивная фаза боя
( r6 Y3 Q7 |7 A2 n1 q# }3 o - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
, D+ ^1 f4 B- u9 O' W, c - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки8 t2 o. z2 `8 B, s" n! m
- }
2 y6 L6 ~ o2 F; L$ u - }
3 q* X2 B( N+ o' n9 x
Скопировать код Класс для финального состояния монстра:
) n) ~" I# C" d- // Пакет org.l2jmobius.gameserver.model.actor.state
# S) B9 q6 O1 k8 y, \4 r - package org.l2jmobius.gameserver.model.actor.state;! i0 A2 t! D" }9 i
/ Y' G! m7 e4 y- import org.l2jmobius.gameserver.model.actor.Monster;
6 I) }$ r1 F+ Z" V% n - ( P3 `6 |3 w2 _6 y2 Z6 L& G' d
- public class FinalState implements MonsterState {9 S% r$ j& V9 c6 C8 d" T- @0 a
- @Override
5 h" J, b$ d# J: h6 s! Q - public void handleState(Monster monster) {
U: ~* d2 _7 S9 V7 ] - // Финальная фаза боя
3 e9 \$ A+ u& S- C) u( L - System.out.println(monster.getName() + " готовится к финальной атаке!");
) h7 L7 M; H& y; _3 G2 x6 ^& v - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
: e3 }1 U; `7 D2 V2 p Z6 F - }
1 N" p. `: ]" C9 P; T% s7 _$ J: D - }( [% N: F5 \9 E6 L/ l, X9 t
Скопировать код
/ L: S5 U2 x5 i4 R }Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
3 x5 G% ]: ]6 d- // Пакет org.l2jmobius.gameserver.model.actor9 x8 G3 P, p5 K( E% C9 Q7 s9 k5 p
- package org.l2jmobius.gameserver.model.actor;
4 w$ S5 P% j& C0 p( ` q4 k - 6 P1 @; I7 }+ v P
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;* f" f8 n% a. ?' E% d" N% W
- import org.l2jmobius.gameserver.model.actor.state.InitialState;* S$ b! y( m! M) M' O* O
- : [( N- W2 ?! j. t
- public class Monster extends Creature {
! S' Z) L; m+ X2 g8 q - private String name;
8 q! p; D `1 w: { - private double attackPower;3 x: P2 W2 k) d; Y, n
- private MonsterState state; // Текущее состояние монстра" c- o% ^' ~& ^0 r: J9 S
- 7 }- F: N" Z" Q( p6 y) ~
- // Конструктор монстра
- M, C. I" C" F- g - public Monster(String name, double attackPower) {
/ Q' s4 p$ K1 j9 S' S: g - this.name = name;0 F2 v4 }. p/ R4 V& U, W ^
- this.attackPower = attackPower;
; M X7 }+ a4 N2 ~ z - this.state = new InitialState(); // Устанавливаем начальное состояние
+ t/ `$ U' U% X0 D u" i) D; U( F% C - }
! X/ d5 u5 @( K1 `
2 [, L' Z# G6 X7 H. l/ \3 O7 d' D5 M$ m- // Метод для смены состояния: @6 H5 Q' N# K! s- O
- public void setState(MonsterState newState) {
S& f! U" P. T" U - this.state = newState;. _ c* `0 c+ C
- }
5 t- i1 W# f/ c6 t9 R
6 [, ^4 E# Q1 {1 ~8 p. v- // Выполнение действий на основе текущего состояния9 {( a2 I, x& i( t" I
- public void executeState() {0 b; N" l# b$ s4 t9 r: K. v- e
- state.handleState(this);
. v8 V% F0 n( ? - }7 i' O3 O! j7 w; `1 Y
0 }& a6 R' M) G+ B: [8 j- // Геттеры и сеттеры
6 `! e, v6 ^" ?0 E3 H( u, H3 f - public String getName() {. K R f( Z7 c: E# S- Z+ K
- return name;
`; r x! t. m) F1 c6 ^% k# \ - }5 \8 |; i7 ]6 m! H% U
. x, @. E: _' d. Z- public double getAttackPower() {2 Q8 j1 ?+ E$ o1 }1 E2 b* a
- return attackPower;) J4 w% ~+ B! r! c/ w3 c$ u7 u5 J
- }( d+ I* K8 p: z
' n2 U' m; _& H: o: O. o/ s- public void setAttackPower(double attackPower) {& q- Q1 T- I! l
- this.attackPower = attackPower;
- e- T0 H# @# c2 j- f4 d/ [0 A - }# C$ ~! S- G( h" z! h" ?' e5 ]
- }
) ?: j" [* t& X
Скопировать код
$ Z9 z0 f9 U+ g. vШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.) j7 {4 q0 m1 j7 @' t2 s
7 M4 P# n# Z0 @" z F
- // Пакет org.l2jmobius.gameserver.model.battle
, i+ o( `: H' K6 _1 S, P% a - package org.l2jmobius.gameserver.model.battle;& ~: k9 o/ h: c8 m8 ]
- ; F8 |" X) K# [+ N
- import org.l2jmobius.gameserver.model.actor.Monster;# A: n# \; J+ D
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
2 K% n6 q9 a7 Y" l" h& v S - import org.l2jmobius.gameserver.model.actor.state.FinalState;
- d+ H$ W. u7 \. ?9 g* ?) U' k
/ M% d8 {/ Q/ w6 e+ p- public class BattleSimulation {
' I$ J: L: b8 h - public static void main(String[] args) {4 E! S7 C9 ^% e1 Z: U5 ~
- // Создаем монстра с начальной атакой
, h# D/ I: W6 C) Q+ H0 b - Monster monster = new Monster("Дракон", 100);
- B: N1 r( A. E7 ]3 \# w
0 s2 J& z* g1 }; d9 s- // Начальная фаза
, e. N- y- q0 J0 [! z - monster.executeState();5 A! Q& T( K7 E I# B
- 4 `4 U& L0 l- D+ D
- // Переход в агрессивную фазу
3 `$ @1 B+ ]1 J6 s$ I( c - monster.setState(new AggressiveState());
4 q5 e: u! [0 Y. |: S" B - monster.executeState();
3 y+ D8 k' D, S. v) N+ Q
9 P6 s2 s" P% h2 G8 Y" Q$ @. K- // Финальная фаза B( X. Z8 `1 ^4 P# k$ o4 w
- monster.setState(new FinalState());
( k% s# ~9 B2 _, h1 O3 P7 R - monster.executeState();, e2 c0 U5 A7 D* P
- }2 V4 [7 ~1 j/ Z' P7 }" r
- }! W# N. }3 m: T
Скопировать код : ]2 V1 D e- u, q+ d* w% y [" f$ L
Комментарии по структуре пакетов и классов:+ Q; i/ R4 q1 _, [
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
5 w& s6 h% U; @. O ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
V( Q" y9 |9 i2 ?Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!3 z: p8 p8 K Q: k. b
2 j1 F- E2 j. x) f v- V
, Z3 R$ ], D6 q: s, E
8 e' Y, ?( i0 ?: }5 S* A3 z& F1 b2 d2 m) W' G0 K' P* a1 c
* C& D. h5 A' l* L0 S( A% Z4 H4 i
6 ~" F8 b$ U* t/ C0 K# d+ T7 V& V# @0 a) p3 Y
M. d$ d, V" l0 o; j
* K0 j: p- T! W
6 Y3 p7 I! M0 T1 _) T2 k/ T
0 F/ f \& Q- k& q" k- l' P
" f/ ~1 K% ~. {) d# G
1 f. n6 U( ^4 f1 H5 T; T" @! \6 X6 |7 H: M- R
|