Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). $ D. C5 t! ?; O& r3 v9 L8 X; }' S
8 e0 M8 l2 P3 R% \
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
' k3 ?1 ]. @. }( c. Y2 w6 V$ c8 x% l0 G, E
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
: _# y4 E6 _, G7 y9 q/ [+ G/ k4 {
- // Пакет для состояний монстра
9 ]0 f6 T. b$ h - package org.l2jmobius.gameserver.model.actor.state;/ j1 E9 N0 o* [% t6 H$ r
- & ^7 m; ^8 w& G6 j: j' c( U8 M
- // Интерфейс, представляющий состояния монстра
! F" }# p/ f# K8 N; T( h - public interface MonsterState {+ e F; w" K; e
- void handleState(Monster monster);8 T [" G; o# m+ f+ e6 K
- }8 M0 C* N9 ?4 d1 f; o/ g
Скопировать код
4 Q8 z* Z ]% Y3 i. jШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
, O* n3 N1 p* I @' }8 Z% u) V1 J% k+ K: a& Y- F1 X9 w0 M
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
- }6 m1 n# ]7 U! X7 V* ]9 U
1 S% L' F' z; Q+ k! [Класс для начального состояния монстра:
9 _1 y% ?# @7 @: W' e2 h- // Пакет org.l2jmobius.gameserver.model.actor.state! w* |& s, A- Z. c" r" Q P
- package org.l2jmobius.gameserver.model.actor.state;
5 c7 y3 P2 N+ K/ J* U I7 n - ; q- j ]$ ^: y0 t* i( l
- import org.l2jmobius.gameserver.model.actor.Monster;
6 h9 l) b& L/ m2 a5 a2 t6 E) H
( f' a+ G4 q" Q! G" U3 A- public class InitialState implements MonsterState {
0 A; N/ [7 Q4 ^2 V1 c - @Override
! b l. y% v! E* W' ~+ Z" q7 D6 P0 z - public void handleState(Monster monster) {1 X: z/ M! K1 y+ L9 m
- // Начальная фаза боя, x4 e/ R' H0 L7 X; r, p
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");2 f/ Y1 N& R8 Z. B9 H; V# V
- }5 n: s2 f+ k. y1 ^2 |- J2 w+ m k! a
- }9 Y0 [ \* | B" U) x4 K% `
Скопировать код Класс для агрессивного состояния монстра:
: d7 }* A% C. F4 x! g+ _- // Пакет org.l2jmobius.gameserver.model.actor.state3 C, R: }' o! E+ @! ^
- package org.l2jmobius.gameserver.model.actor.state;
' }+ l+ d/ F, h, k( Y5 k# E9 a6 k
4 `( F1 w8 H3 F, O' R7 ^- import org.l2jmobius.gameserver.model.actor.Monster;0 J* w, F2 h) k3 S7 f% c
m: h: b9 B2 x( L" L' P: o- public class AggressiveState implements MonsterState {# T {$ Q* l2 {
- @Override/ k' G6 x l, f$ F; m' G
- public void handleState(Monster monster) {
' M- P- d+ q1 W% o# A- z3 {! q5 t1 Y - // Агрессивная фаза боя8 q6 g h. C6 ?; O! z; a
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");. C! Y7 |* d$ B
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
' q5 D a; U' p8 Y: a0 _ - }
9 F. ]+ T3 E5 q2 m - }5 j6 g2 m, w. v& G
Скопировать код Класс для финального состояния монстра:: E) {+ m; o% K2 D+ |
- // Пакет org.l2jmobius.gameserver.model.actor.state
" ]2 l! w" K1 R$ p3 m$ x5 E7 m2 { - package org.l2jmobius.gameserver.model.actor.state;- D M& H X# A# Z1 y. ^# q
- 4 |: k3 g9 ^& X" d( \; ~" y
- import org.l2jmobius.gameserver.model.actor.Monster;
- D" `+ V- M/ r, E% j* |
+ ^& F2 e. Z9 A9 O( F2 w- public class FinalState implements MonsterState {
$ ^! P0 r7 v/ A" K - @Override
6 ?* n5 P. Y$ ?! J# R - public void handleState(Monster monster) {7 |; }0 H$ O- g- H1 {
- // Финальная фаза боя: j9 N. W& Z M
- System.out.println(monster.getName() + " готовится к финальной атаке!");
# p1 V' B- {2 H. a& v - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки+ T: v% W8 U4 @6 K# B) _
- }
' z$ \! l3 M! m# f1 b0 L - }! {/ M3 b' f# J! |! z2 f& g$ n
Скопировать код
, K' ]. M, l5 q/ v' e6 ]Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.+ \- Z. Q7 r: Z F* B8 ^4 ~2 _/ V
- // Пакет org.l2jmobius.gameserver.model.actor
" @$ n' ^6 l5 b$ E* y7 | - package org.l2jmobius.gameserver.model.actor;
% @: l" J, J% s - + z6 \6 U) ]# }! F& I
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;. k' K; P' E- V7 D
- import org.l2jmobius.gameserver.model.actor.state.InitialState;& L6 ~ z: p/ I$ q1 d8 S/ y
) d# W" Q0 \. w; N0 ?( e- public class Monster extends Creature {
. k& B! J9 D; F: [" h+ T' i/ b) V. M1 r - private String name;. Z/ |9 z% F5 {% q
- private double attackPower;4 N: @2 ~$ S5 I& }$ y9 M
- private MonsterState state; // Текущее состояние монстра
2 d- B- c$ D/ o! w. q( J
! U7 F; H/ l K& y& g- // Конструктор монстра
' k3 N; j* g- c4 I5 o- l1 ^0 H1 E - public Monster(String name, double attackPower) {" X# v' ^; n8 `3 p2 G" _6 q
- this.name = name;
4 Y& V! G; j0 | - this.attackPower = attackPower;4 u4 R$ S, C7 ~( | Q" o9 U h0 C; c' J
- this.state = new InitialState(); // Устанавливаем начальное состояние7 z7 ^% c5 E* C4 u: `
- }& ^. i+ j* ^$ g2 _7 R
- 5 X" x$ r: _" e- q' R1 W" o
- // Метод для смены состояния
! T; X' P9 R; U8 b j# S - public void setState(MonsterState newState) {
9 e1 Y9 v" Y; f - this.state = newState;* {, f2 M: t, o3 {
- }6 i8 j% V; y' w- J
! M s6 a m! u# A! H/ t' P+ ^( B- // Выполнение действий на основе текущего состояния
' E9 u7 ~4 `1 @* r; v - public void executeState() {& G: D) f) V1 r
- state.handleState(this);
1 e( W3 |$ K4 [$ l - }9 [7 a( F. J5 t6 s
- " f( J2 [- Q% g& y# z
- // Геттеры и сеттеры
9 F% R) s; E, b' S - public String getName() {
+ N5 |1 y! |+ E& U - return name;" e3 x5 G3 u8 E/ L4 @7 `& d
- }4 y* M. l+ y. B/ ~* {8 L
! U" F2 K' T% u* o# u4 m- public double getAttackPower() {1 u' H- m3 X! }+ i: n3 y
- return attackPower;, ~+ m5 \1 |* b2 x( J4 z7 t
- }& m3 u ~& D2 \
- 6 P0 E4 _3 W1 ]! N
- public void setAttackPower(double attackPower) {
T2 w; Q0 X4 l8 m - this.attackPower = attackPower;
0 T$ h2 Q$ b6 e2 u% O7 d% T - }1 [) U( U& f1 A
- }* o) i+ Y- d5 }5 r* `0 T% Q" Q
Скопировать код # E7 p/ i. W/ u' l
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
2 F- H* ^8 @& C6 [; B: k0 O& I. z. J1 i. @
- // Пакет org.l2jmobius.gameserver.model.battle# U: d/ \3 h7 v, P* F; M
- package org.l2jmobius.gameserver.model.battle; T. t! J9 [. I
* y# S$ x( k# ]1 u- import org.l2jmobius.gameserver.model.actor.Monster;
/ F8 f! }7 @' \7 q8 b$ f - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;+ K+ i4 u9 R' J! x* a; m: I: `
- import org.l2jmobius.gameserver.model.actor.state.FinalState;: w7 D0 \* Q) T
2 { d3 I! Y. Y$ Y- public class BattleSimulation {& v% s' v" u# `* S
- public static void main(String[] args) {
# W9 \: D* q& B; ^ - // Создаем монстра с начальной атакой4 w6 [% |" o2 F& }8 F- _( u+ `
- Monster monster = new Monster("Дракон", 100);
) K: ?# T/ g' V4 j/ f, t - H* p" H% P4 }0 ?1 K7 D7 e
- // Начальная фаза
) v' q) W, f' \1 A l - monster.executeState();
) u; f# A5 t. P6 N, ~' r# q - ( O4 |. a$ W* K& i1 ] h3 m
- // Переход в агрессивную фазу
6 O( p" D8 W7 V I! m# c6 F. l - monster.setState(new AggressiveState());) T5 _6 w% }! @3 D6 l
- monster.executeState();# a5 ~ j1 ^3 W" w" l D- {4 ?
4 V, c! N9 z2 V( K" [" @- // Финальная фаза* W* {7 W' k3 P+ T1 q1 N# y4 N$ u V
- monster.setState(new FinalState());
# ?( F; z9 \( h! c# Z - monster.executeState();
# R: T: R' O w7 k3 n" v- I - }
2 v; N( \+ K( i; p9 Z! y9 Y - }6 y& k7 W: S8 o1 }' a. D5 e
Скопировать код 4 M2 P3 T, K4 C' m
Комментарии по структуре пакетов и классов:/ r% e$ U9 b* ~) q% y7 H0 n
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
* q% }$ D( ?& e5 A: ]1 Y& v8 Z, F ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.. ~9 {4 q& f# j) \6 v+ k* \
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
/ @. R7 e1 H! X* Y% `. _% L, h- Y# L+ R
# y8 U: y8 X7 R0 d2 U% ?2 s ^6 ^% a, e
, D- G; M6 {/ K6 A8 D/ T, y) {. k
6 a; W* t. X+ X" {6 c5 q6 ?/ P* L, Z; _/ O- b3 z' H) U$ b
4 F3 Q; Z K2 i6 j' U
' Q) L( ?: n3 t3 q7 @6 X4 {/ J
" t5 R2 ]1 N* G' Q
% N+ b- \& X" k: ~) |9 W! W& \; K2 B1 Q3 I$ _* C
* F/ X j$ F: ~5 Y! J, z4 x! l8 ^1 e/ }* a9 ~; x0 c+ W4 |
+ F+ c1 E5 N/ Q G1 Q! E |