Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
6 m. Q( A8 V# }# e; L- A, B0 a! r0 d$ m$ a f7 o
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.3 U- E& x% j- f9 h; C* M
9 {- k0 r/ C# p: J( v
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.! I8 ^8 ?0 C& E* G; [* w( k
7 ]! Z0 Y0 O1 Z
- // Пакет для состояний монстра& p: q, R0 ~- A( m& t
- package org.l2jmobius.gameserver.model.actor.state;
% G; E# o' ? e - ' J [& u T* v( C) D6 A r: B* g9 }# J
- // Интерфейс, представляющий состояния монстра
3 t7 d+ g6 g; m - public interface MonsterState {
: v7 I( v, [6 P5 H }7 F$ C - void handleState(Monster monster);8 I$ b- v8 I: S% \; w0 x: a0 |
- }7 z- U& o7 ~' I, o0 W- I
Скопировать код 6 Z5 M9 x, S- u; L+ b
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
3 x' W4 z5 w! r* r2 O
. p( e/ Q$ ~: c6 Z+ Y! `7 i9 OЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
0 F7 R, o7 O- P, S
/ D/ y4 w2 R0 F& WКласс для начального состояния монстра:
: i" U( n# W) r8 e, l- // Пакет org.l2jmobius.gameserver.model.actor.state
( \; @8 z3 n# M H; b- d - package org.l2jmobius.gameserver.model.actor.state;3 I/ }8 ?; ~- W
6 U, v, t9 y1 f. Q( V, L- import org.l2jmobius.gameserver.model.actor.Monster;
+ a2 i! W( j' K - 0 [; g+ j' r3 Z" B& X
- public class InitialState implements MonsterState {
' L7 b1 h( A3 z; Q7 [! X* L - @Override
( { M- l+ Z: Y+ p. H - public void handleState(Monster monster) {- `( Y6 n4 I" E3 W/ H
- // Начальная фаза боя
; t: Z2 |+ [2 {" g# c m - System.out.println(monster.getName() + " начинает бой с обычной атакой.");( }" W( g5 V' l- N
- }
* ]! s) U7 h- m f! r& Z - }
8 o _" e3 Y) D9 ~$ p
Скопировать код Класс для агрессивного состояния монстра:
: x/ |/ H; ]7 ?) H& A- // Пакет org.l2jmobius.gameserver.model.actor.state$ i0 ^$ V8 T! Z9 F& T# n
- package org.l2jmobius.gameserver.model.actor.state;
( l+ O& G* k7 |. Q - 3 w2 \$ C) Z& I
- import org.l2jmobius.gameserver.model.actor.Monster;6 G+ [( r: F# l% q
- 8 D6 o* u* [. `5 B) M" `# ]# r
- public class AggressiveState implements MonsterState {
: C3 J/ c0 V0 |6 j - @Override
# F7 @& w Y0 x4 | - public void handleState(Monster monster) {5 c8 Y3 ?4 L& c9 o+ O- B- V
- // Агрессивная фаза боя
# F; i# E T8 {# j0 [& e - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");9 T4 E M- E! l1 k! O% t
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки' F4 p: ~$ p& O% S- W9 @. ?
- }
3 q$ k; h' |) T2 O% f3 q - }
2 K( W/ P0 }$ m- S U. S- L
Скопировать код Класс для финального состояния монстра:) V+ J3 j! W6 V/ @* t
- // Пакет org.l2jmobius.gameserver.model.actor.state
# D" Y0 h6 \% w) l1 i) ~' Y" i* m! }9 H - package org.l2jmobius.gameserver.model.actor.state;
, _6 [# E* C8 ]0 B2 j2 G q - + j {0 u. D6 g) X* V% g- w
- import org.l2jmobius.gameserver.model.actor.Monster;
5 S. @6 l8 `! i5 @
7 t. D" s! b* D- q% Z7 k/ L0 P- public class FinalState implements MonsterState {
# s' g. C" ]3 }: Z3 A2 \! d8 m - @Override0 Q" x" Y8 m u4 z% D1 {7 U5 E
- public void handleState(Monster monster) {0 R; _! q. _6 Z6 @" o' [
- // Финальная фаза боя
8 T- X: X9 n# l0 `% B - System.out.println(monster.getName() + " готовится к финальной атаке!");9 L1 e: {2 e* G+ X
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
# W" p1 d( x3 x: L$ y9 [ - }$ W+ ]4 r6 ~7 d& n
- }
0 y6 f4 w' [* D+ R
Скопировать код
2 |. j: A& N, u6 {8 PШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.8 Y# _$ _/ R) @4 F6 d4 o
- // Пакет org.l2jmobius.gameserver.model.actor
4 \; E2 R M: ^- p! U" [- S1 ^ - package org.l2jmobius.gameserver.model.actor;2 N$ h1 V( d$ x$ r- D
- ! g2 l) k6 {. {( }
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
; h7 C" u0 d1 ?" ?1 \ - import org.l2jmobius.gameserver.model.actor.state.InitialState;
. l: O7 k+ T. S
* f$ Z7 v0 j6 \- public class Monster extends Creature {
7 C' h" c7 S: Z# v$ W2 h5 v7 k" @ - private String name;! {* }$ _$ Z Z% W4 T* R [3 V# L
- private double attackPower;
- B8 H @- \; z: Y2 l - private MonsterState state; // Текущее состояние монстра9 ]/ _) R" ^9 {: o, T$ i# h
- " y4 y+ Y& P5 Y* o
- // Конструктор монстра
7 u) h& Z/ P' d# N K - public Monster(String name, double attackPower) {
. G% Z/ s5 |* w* ]7 a$ R4 b - this.name = name;" U. t+ R- }5 l% w7 L9 E; `
- this.attackPower = attackPower;6 L; A' |+ ]: [: z" `; r
- this.state = new InitialState(); // Устанавливаем начальное состояние
% t" }3 P) d; Z - }/ A, Q! f: k, r" O
- 8 _! ?" }4 j! w1 b5 Q# m" B
- // Метод для смены состояния/ i+ Y1 w$ U/ `0 A
- public void setState(MonsterState newState) {
. ~% I. u6 @, R0 |7 K8 n/ B) u - this.state = newState;
; t: ?' n5 l9 J" \& ~ - }
3 K9 \7 v) u* r! X ?5 s+ {7 E) y; \ - 1 ^$ \% q& }: ?0 _1 p$ z, G
- // Выполнение действий на основе текущего состояния
, @/ J0 V7 Y( D5 G; a4 t& T - public void executeState() {" x6 |: X3 U' `; O' g; }
- state.handleState(this);
7 g8 m$ _+ _: {* _7 k9 {2 i- l' t - }! M$ r) ^# t9 _) F
' w' Z8 Q$ D2 [7 W! w p- // Геттеры и сеттеры
2 s; b7 j" n5 I! `( D - public String getName() {
+ Q1 I! _; [# u/ h - return name;
4 a/ |& Y8 R6 F0 G+ a- s - }. U$ W7 _) S- G4 T1 D3 d( w0 m
0 O0 t8 w0 C( P- public double getAttackPower() {
2 ~' H) l# E* d - return attackPower;
0 I c5 ?9 j! h4 V+ D8 I - }
( O; I4 N6 z8 Y
) P7 W1 N8 [0 m& q' b' P! X+ C' R6 F# m- public void setAttackPower(double attackPower) {" C$ _; I" }9 j' A
- this.attackPower = attackPower;
: B1 x6 y1 Q1 F1 P, O - }
" d# m( k" y3 v! Z( N' E- \ - }" H2 [) x& B3 q+ Y! K
Скопировать код
( S( _% I5 G7 @2 B7 K8 ^" G5 cШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра./ Y* I' u& k, S6 e; g J% h$ k
/ f% A! h# |) l( E, A" Q' c; u% g4 P- // Пакет org.l2jmobius.gameserver.model.battle
8 @8 |8 |6 K4 H$ S% x/ B - package org.l2jmobius.gameserver.model.battle;
/ K: J. {% R' `! v
9 a' @* E$ J6 R- c- import org.l2jmobius.gameserver.model.actor.Monster;' c5 `9 J3 n/ I+ ? W/ L0 V' ~4 Y
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
1 C# ~( }3 l5 K, z: j - import org.l2jmobius.gameserver.model.actor.state.FinalState;
' t1 i3 F* j) Q8 J( i6 o - % L# Z9 \0 U$ M2 f7 s; Q
- public class BattleSimulation {
& H8 k( Q J) ?6 W - public static void main(String[] args) {4 R/ U/ i u2 C7 u
- // Создаем монстра с начальной атакой3 z9 @' x6 r; Z6 h. X
- Monster monster = new Monster("Дракон", 100);
1 j( Z- X$ j! H( P* h% E. n/ `$ S7 H
: R! _ t b! C/ [) A6 \: n- // Начальная фаза
% i3 r, @! z" F8 {' x! J - monster.executeState();
' V% }: G& T% I6 [% m# K/ z* j - , }( v5 f% ?0 v ]
- // Переход в агрессивную фазу
( C) A1 U+ v5 l0 R4 k - monster.setState(new AggressiveState());
7 g1 }" R7 |! e( [ - monster.executeState();4 x, T4 D7 W* | ~' ~
9 F/ c- Q# g4 d- // Финальная фаза$ h& S5 H4 f. A4 p
- monster.setState(new FinalState());
9 J- L& H. |# ~2 m' Q - monster.executeState();5 _- j \) c4 F% l f0 J. y
- }
+ }" ]! \2 d( o3 W8 J/ L - }# B9 _1 o) g2 q
Скопировать код
4 {& \5 y/ S9 H6 q; G9 qКомментарии по структуре пакетов и классов:
4 c% ^/ I/ {' s b- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.: ~0 L# h, B( U. F7 e2 x8 k' P& G
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код., |( Q$ Z) @4 ~- T: |: G
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!( ~) g0 ]; a6 z% [
& O8 S- c0 H" u; b1 L
5 D5 E' N( z8 {; A L/ D
- Q t7 U4 m- T: _
- H% `+ ], q. G. j7 {7 O4 K* {/ Q0 T$ q; J$ }' K3 j- x- U+ n
; @: F" ~ ^# |5 n" I) \9 D3 b5 q% H' ~ D7 ^' x6 C
% ~9 i+ H. j4 S1 ?1 q2 |$ `+ B+ d! x" ~
, B) e" o: \# @4 U- F& m( |( h8 ]3 O4 j& E- V
5 B3 f* d! @0 ?1 i8 N7 E, d; G+ w
3 i) `% N+ W/ ]$ {. x$ I* }4 g3 D, `3 H; y5 N8 `
|