Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). . T/ f0 T/ j, f/ o
m( ?) B7 J! s: x, q" ^- c
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
5 r9 [4 W+ t( M! x' C5 C
4 M7 q/ U0 p9 `9 J3 AШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.' J1 U' h) q/ u' U' L l
: p3 {4 _% F# n6 E
- // Пакет для состояний монстра# ^1 c& f$ ~$ @/ c9 I+ X2 H
- package org.l2jmobius.gameserver.model.actor.state;0 t- R3 M p8 c z3 e
- 2 Q) I1 A: l6 I. T9 e
- // Интерфейс, представляющий состояния монстра
- W, X* b. {6 A- T1 ^ - public interface MonsterState {
$ y' X- D5 ]3 x( ~ - void handleState(Monster monster);- }4 m' f% m0 j
- }
) B v' |/ d D3 I3 j. t
Скопировать код . J- z% I8 e8 x: W# X# b3 K
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 1 }, R# A0 S! q+ o
5 x, `, \7 A4 h2 {/ ]. m# N7 y
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
9 D1 Q+ S! {7 a
0 j. t( t n& d4 M, kКласс для начального состояния монстра:5 X4 Q" e; O; m& t4 b8 N) J( E
- // Пакет org.l2jmobius.gameserver.model.actor.state, V3 V8 }6 L1 q, T! N! J
- package org.l2jmobius.gameserver.model.actor.state;
- ]! E% M( u) x5 S) J5 J - % G- L9 Y/ K5 o( j
- import org.l2jmobius.gameserver.model.actor.Monster;
; i8 Q, N4 _/ t B7 ]( k4 P1 t4 q - ^. N1 S& U# ~6 S3 a( d8 \9 X
- public class InitialState implements MonsterState {
7 D/ B) ]' v3 \ - @Override$ O1 N% O! {$ ]" X
- public void handleState(Monster monster) {
% j! Q* {. R; W# U/ z( U, \ - // Начальная фаза боя- R. s# l0 J( X; ^
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");; |. O3 Q* _+ H) C" T; p
- }* y3 I$ `9 u, {% r+ ?2 v8 q8 b, L% B
- }0 E1 D, k+ o- l( \% ?( \: V5 N% H
Скопировать код Класс для агрессивного состояния монстра:4 L+ m- ?$ m0 E, `
- // Пакет org.l2jmobius.gameserver.model.actor.state
/ Q& ~% ?' o. q; K( x* F7 A - package org.l2jmobius.gameserver.model.actor.state;
: b, r$ m9 p4 R - " H6 s7 j8 I3 J
- import org.l2jmobius.gameserver.model.actor.Monster;
9 [/ \1 U3 t) U2 C - 0 k% }+ G$ A6 |- j8 s
- public class AggressiveState implements MonsterState {
; C6 y4 g6 I2 ]3 f N9 H, ~* _ - @Override2 h( u2 @% ~. ?. x1 Y# ^, a2 _
- public void handleState(Monster monster) {7 ]5 b: C$ Z3 A
- // Агрессивная фаза боя
5 D6 u1 \5 m! J8 y& F8 M' S2 { - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");' D; T; `/ b; l7 W# t; l8 r/ u
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
" _$ q) Z; }* l7 x - }0 B7 h! V F$ H" s3 q
- }
/ E5 [' H) V7 I2 Z3 `4 X1 v
Скопировать код Класс для финального состояния монстра:, u& v8 s4 k, p6 E- C; ^
- // Пакет org.l2jmobius.gameserver.model.actor.state
. @0 c3 }# @. Z4 i - package org.l2jmobius.gameserver.model.actor.state;
$ H2 h& A; W9 e. `; y - 5 o' v* q7 b/ o
- import org.l2jmobius.gameserver.model.actor.Monster;7 g: g: q0 b/ X b' W
- 3 l8 d8 O" I$ ?& I
- public class FinalState implements MonsterState {
& B# e& C: p# M2 D" D - @Override
# Y2 ^+ N# h7 X+ ~# S( Q" q( e - public void handleState(Monster monster) {0 J0 S4 o$ `. O9 ^0 A" L
- // Финальная фаза боя
4 N4 \. W$ u) o3 Y j( g* K. |" B - System.out.println(monster.getName() + " готовится к финальной атаке!");
1 k- z+ J( C4 a - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
3 {! u" y# F: \ - }
3 b3 j; @1 k+ k, @% S; m/ n" U - }
# e& w3 ^8 b+ k4 z* P# b" D
Скопировать код
' m$ W V: ]2 n' N( e+ q/ ~Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.0 Q; E7 m7 X$ p) L) I
- // Пакет org.l2jmobius.gameserver.model.actor
9 f4 M7 U! D0 ?0 K) G - package org.l2jmobius.gameserver.model.actor;
9 K9 ^. K4 w* { q% h/ b - 3 N- z' ?2 u" b% w
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;( X. d% A2 ^# E1 N9 j$ f
- import org.l2jmobius.gameserver.model.actor.state.InitialState;6 d% P6 P% g6 _& d7 O) d
- 4 o/ E$ `' l: s7 u
- public class Monster extends Creature {
& ]. e! e. |; f - private String name;
/ y( Q/ q+ x" g7 E- `' O5 e" A - private double attackPower;0 m" J: }" A( `& O2 q. j5 A. h
- private MonsterState state; // Текущее состояние монстра Y) y, k* `: Q4 V, M2 c
( R% ^. u9 e& j( G6 }- // Конструктор монстра
. o8 ]% K( }7 ]# j+ c+ [ - public Monster(String name, double attackPower) {9 y i* U9 _' s' Y: |6 y' c
- this.name = name;+ X4 P2 ^8 w+ ~* z+ M' D
- this.attackPower = attackPower;- T- i- P" v6 z5 ?) w- W- @: ?
- this.state = new InitialState(); // Устанавливаем начальное состояние/ G4 t+ D. ?2 U2 Y. a" N. U
- }
# B' L/ } S: {2 J, D6 X4 P5 X
8 ^1 _; p' Y- `6 c* A5 i1 |- // Метод для смены состояния
/ Z% `, F! G O" J. i- g - public void setState(MonsterState newState) {3 b" S6 A: N; o# l- E% }' `5 A: C4 S
- this.state = newState;. K0 s4 x- l# g& c) ^
- }' t$ H; g) w; W3 E' ~$ I/ d2 d
- 6 a, g0 G& e' i. Y8 m0 S& _5 y
- // Выполнение действий на основе текущего состояния
, ]- `6 L( `, v# \ - public void executeState() {; _3 B; H2 k1 a; \* Q0 r( \- B; c
- state.handleState(this);
" I5 r4 q0 z( q6 R6 {, ~ - }
/ v) x; [, @( p% K0 X4 E; ?" C) O - W9 \; `' K$ G' w
- // Геттеры и сеттеры
, N: y1 I% s* N& m: o" P3 a - public String getName() {
6 }; F8 S- S8 A( b - return name;
+ D, `. P8 l X! _3 o9 ?7 l$ j - }* ]" G2 Y& i/ Y( y7 D9 A; Q
. p8 n ]' p% G( h4 X- public double getAttackPower() {
, z5 ]( f. W1 t" E! C5 C) ` - return attackPower;3 p1 q0 ?9 Q0 Q+ ?
- }
2 C- T6 o- O9 U, n- X }
" @6 {1 E$ B% h& T3 _# [ O- public void setAttackPower(double attackPower) {
( {! r0 c6 a f - this.attackPower = attackPower;
' f$ W0 F- t3 Y& S - }3 ~, r. n/ E! u9 G& O2 b4 {( b( M
- }
( z- y6 }: j) K ]6 ^
Скопировать код
7 @; V6 k7 J! Q* d V M0 yШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
q" J ]3 i$ H( P2 m- f
- Y8 p G0 ? J a& H# B; b& ?; e- // Пакет org.l2jmobius.gameserver.model.battle: v) G4 }& \; M- c- @ H
- package org.l2jmobius.gameserver.model.battle;5 `: ]# f9 T6 L4 U$ X$ k3 e6 |
9 t, @, K4 G9 Y d4 a5 f- import org.l2jmobius.gameserver.model.actor.Monster;* v- x' U) I1 W2 [
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
- C4 n2 g* t+ u - import org.l2jmobius.gameserver.model.actor.state.FinalState;/ S Y/ |9 c! [
# x8 k& v# U# q) h8 R" K- public class BattleSimulation {
1 p$ K$ d! L: O# v - public static void main(String[] args) {
}6 |" V- z+ I- R - // Создаем монстра с начальной атакой5 p* s0 o! U0 Z
- Monster monster = new Monster("Дракон", 100);
' ]* C/ j4 x& @0 v+ i
) |& `% o: @6 C& Z9 E0 g- // Начальная фаза
% S7 }9 j& E; @1 n. X; A - monster.executeState();+ E O4 ?$ I7 W; V9 V) B
- . c/ _4 t1 \9 E3 h0 r# ~% V7 Y
- // Переход в агрессивную фазу2 `4 G' }) W" r* w
- monster.setState(new AggressiveState());
S& M) _0 W: s! e$ o+ d - monster.executeState();
d- e* B. J6 G
' z. |5 Q* k2 U8 _- // Финальная фаза, l4 N9 l1 h7 ?, o; a$ F3 s) P
- monster.setState(new FinalState());+ `% d8 d# E7 w: W1 h! X
- monster.executeState();
2 T8 ^3 ?6 ?" ?5 v2 f - }; T# R: {8 \7 y1 U
- }' X4 ^+ x4 m0 i' r! q! X
Скопировать код
7 I% f5 V* q( ~+ A6 x. NКомментарии по структуре пакетов и классов:2 T: P( v: S* v1 v
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
1 K: g4 H: w) ^- Y ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
& W* x3 y$ c, z mЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!2 \. j, y/ ?/ \, a* V9 H6 F
) Y( r6 a) C6 `! K/ n9 \, n$ p# o9 d# u
: Q6 g" X( W' |# \; w
2 j$ K, a3 N9 p3 |% `* a1 `" l- q: e) K+ q
4 f# o, h8 L' n) b3 \! k9 B0 v
( D/ T. J( a+ |7 M" @& j; ?% L! F7 R% N
" K8 ^, c' K# S
5 P! ?4 ^% c! D# ?3 v; S8 u2 i+ x
* g$ K8 E$ ~6 Q2 A2 U* h0 k+ e& A: a1 s# T; y, K" S& s
% e5 V: V4 G) P8 Z' K Z1 S" |; I
( W+ Y9 v; t1 M
|