Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
3 M j2 F, q: X# K4 U, x
. n, s( V2 x r& ]9 EЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.% b7 B; Z0 z8 T# E; L* [. s
0 h: M! s5 k0 p, QШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
: t6 {0 H+ r2 q$ `7 N& X M
* _ u4 A+ @" ~0 x# \- // Пакет для состояний монстра
( B- x; I; m; g: j; n! J8 G% O - package org.l2jmobius.gameserver.model.actor.state;& [8 n' _) l. ?$ E- l8 _0 o# t7 l& t
- 9 R7 R7 |& Z7 Y2 d" N* M
- // Интерфейс, представляющий состояния монстра
/ \! J& q$ t2 B, U - public interface MonsterState {# N* s0 z A5 g8 K+ W, ]
- void handleState(Monster monster);* y# c7 g A; h# ?! v3 \
- }
$ X Y x4 q& X. o% h0 V( `, L
Скопировать код " i& Y$ U' T- [4 F5 A* r
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. , A- W0 v7 B! {5 i5 {
8 O$ ?) A2 \7 v7 v1 N) R
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.+ B+ R) v& M B" b g
. _# R) J" f2 r+ R
Класс для начального состояния монстра:6 |2 T! Q% J; r
- // Пакет org.l2jmobius.gameserver.model.actor.state
* h8 m% P& H/ x - package org.l2jmobius.gameserver.model.actor.state;
" D9 y1 o. i+ W - & q2 X8 g$ T- Z" X5 U
- import org.l2jmobius.gameserver.model.actor.Monster;4 j9 [, c: R3 @* z1 m
* ^2 Z7 r2 F- G8 s) ^, m9 t- public class InitialState implements MonsterState {; X$ [4 K1 {, h
- @Override
7 o. v4 ?1 p3 t$ x" T% h5 ? - public void handleState(Monster monster) {
+ O6 c% H3 ?; E# L3 d - // Начальная фаза боя* r- V5 j; x% R4 K- }; [
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");( A+ a2 b* `. x2 e% l( a1 Q- V4 D
- }4 N- z0 D1 X) d% \* \0 p7 Q1 }/ u
- }
* I5 l% A( W) M% d w0 h" w
Скопировать код Класс для агрессивного состояния монстра:' A/ Z( S0 }% E$ ?
- // Пакет org.l2jmobius.gameserver.model.actor.state3 @1 E% h6 Z* O: o g
- package org.l2jmobius.gameserver.model.actor.state;5 t6 X) v1 W2 j
0 P, P- X' S7 M- import org.l2jmobius.gameserver.model.actor.Monster;! ~) {" W, n) p; Y" W( A/ G% _
0 V. \/ O8 G& n3 I- public class AggressiveState implements MonsterState {
$ m/ f9 c; w/ a- m/ F. ^ - @Override
4 _1 h V; q. I! b' g7 z - public void handleState(Monster monster) {( ?, I1 P. y* v
- // Агрессивная фаза боя
! ~& v; n# T8 a& P - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");1 D; _+ Y: p4 Z7 T: @' f* H8 }
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки9 L1 D1 z3 A4 g6 @7 [
- }; z1 W$ I" t7 Y8 M
- }2 F1 u# t2 ^& P* O. V
Скопировать код Класс для финального состояния монстра:0 \6 T. w$ W) b K2 U$ }
- // Пакет org.l2jmobius.gameserver.model.actor.state
: z5 h5 f ~/ E - package org.l2jmobius.gameserver.model.actor.state;
# b8 q) E1 `, c4 x, K, ?+ U d& B - 7 j. V* X4 C( T/ M7 J0 \; o' |
- import org.l2jmobius.gameserver.model.actor.Monster;
7 Z7 P+ r9 n6 i" k" @+ ^8 e - & k j# E- K2 @: N" r) \
- public class FinalState implements MonsterState {
$ G! k& h+ ?5 _: L - @Override8 t: a6 i$ o g
- public void handleState(Monster monster) {
0 @: {5 z7 \$ Q4 P - // Финальная фаза боя
1 i) a2 a) o$ _& v - System.out.println(monster.getName() + " готовится к финальной атаке!");" `# N) k- w2 y/ z% \
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки$ F4 G+ j/ \- R0 U
- }# w e, c1 w) ?8 W3 @: u" p5 O5 y
- }
+ r F5 \- B0 I r. z; q
Скопировать код
8 u$ z6 h3 Z& m, Y* zШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.. h: S6 @8 i' g2 I1 |
- // Пакет org.l2jmobius.gameserver.model.actor
: R' w3 o9 h* {* G* `* i - package org.l2jmobius.gameserver.model.actor;& F# k* x5 i) }: ^/ u
- 3 |1 p6 @1 p$ V
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
, K* R; ]8 }8 a$ v - import org.l2jmobius.gameserver.model.actor.state.InitialState;; }% w$ f, b$ C% J9 S% @9 T
1 o, Z+ q$ f" e; L. w! S& g0 M- public class Monster extends Creature {
) K1 _1 E% U1 t9 P, h) k( ]6 m - private String name;
- y9 s3 t3 k. v0 o+ c) _ - private double attackPower;
" }& |. r- ]' ?, c3 S0 E - private MonsterState state; // Текущее состояние монстра% G: d: m2 v/ D; Z7 |5 t( t
1 @% Y+ O! O0 f, H- // Конструктор монстра; F6 \6 s9 a- a1 w
- public Monster(String name, double attackPower) {# c% J1 C" A9 n& z7 B/ J
- this.name = name;" g1 w z/ K* y) d7 s/ Q
- this.attackPower = attackPower;
2 \8 B9 X3 S2 N# L - this.state = new InitialState(); // Устанавливаем начальное состояние
, X9 x; ` K$ y; @0 Y h: s3 @ - }
K- o) S2 a( I9 \' X/ O) p
+ C, D2 e3 S* x. c6 J4 D$ Y- // Метод для смены состояния: h' Y) O; l! d5 }" p5 l3 S0 W
- public void setState(MonsterState newState) {- [- r! ^ m" A& t. v7 \: ]1 j, h
- this.state = newState;4 _6 F4 ^2 P& @; e& I$ [; R& S6 k
- }
; X$ a L6 }1 ?# L: T) C4 g - " [% A `" H8 k- Z/ D
- // Выполнение действий на основе текущего состояния/ N& Q( o( S0 |, W3 ?6 R
- public void executeState() {9 y& R$ M' x" ]3 b. U' X( i, g
- state.handleState(this);* }2 p2 Z( p( N
- }
" ~8 O9 b! v$ {, H, r - % ^* K; Z2 B) y5 j0 Y. V5 D
- // Геттеры и сеттеры
: r" w: \5 p, z' D2 Y8 B. I$ u/ o - public String getName() {2 k3 _9 o e( p1 t9 P, v% z
- return name;! z1 t8 r% r4 e6 ]/ C
- }3 @8 ?0 m) s! U; k! G
- @6 M1 y7 c0 z5 i3 E
- public double getAttackPower() {
6 f2 U9 v: o. Y( `. v2 P/ p3 l; m - return attackPower;
9 F! c1 M+ s2 @, B2 Z& K/ B - }3 B* _5 d0 {$ s, F3 \
8 { f1 V% b s% V: X T/ k- public void setAttackPower(double attackPower) {2 {5 V. q# _* F. A5 F# U2 R1 p
- this.attackPower = attackPower;
% m* {% d# B9 X$ y) z Q - }
& h- }* V+ A1 \3 j+ }/ z$ c l - }
( s$ Z5 h4 L) t' l
Скопировать код 9 R! r- K) C/ Q7 R. p
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.# B/ M( F- Y ]
2 X' N/ I. N& o4 ]
- // Пакет org.l2jmobius.gameserver.model.battle N+ ~4 g& E6 T$ \' N9 i
- package org.l2jmobius.gameserver.model.battle;
* n; F4 T* m( W' ?8 W k - ! v5 e1 V0 \5 z- b3 |. }* z, I
- import org.l2jmobius.gameserver.model.actor.Monster;
7 ?7 J3 w( ~& c4 K. B- _ - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;7 a+ j6 y- {7 j
- import org.l2jmobius.gameserver.model.actor.state.FinalState;2 U9 j! U+ v) _. g, R$ L; H$ U5 B
; V! J: D8 n. o- e2 n- public class BattleSimulation {& |! o$ z: r5 k( |
- public static void main(String[] args) {0 w6 r7 }0 x) }3 Y7 ?
- // Создаем монстра с начальной атакой# W! H/ x) [; U, z: z3 b6 p7 a
- Monster monster = new Monster("Дракон", 100);
: v u6 e, e# p) Y2 v& I2 m - ( Q9 `* R. R/ E* ?+ g
- // Начальная фаза
8 ]: m0 X, D- @9 [+ F# q - monster.executeState();9 P( d: U; V' X# o
( w+ I. u, V7 y* B. J1 q9 G1 q0 \- // Переход в агрессивную фазу
7 j3 N" {. U" G+ `( H2 F1 Q$ n - monster.setState(new AggressiveState());/ \. ]3 J% A3 r g/ I
- monster.executeState();
. K* ]" U8 p+ B7 y3 d
4 ?" r5 t" {" i4 l4 I- // Финальная фаза
* Q A/ b! \" f; F( u1 H9 R - monster.setState(new FinalState());
5 I: }) x; b0 ] x - monster.executeState();5 r% v! l Y4 Z8 j- m9 n8 k
- }4 g# L1 n5 K3 C* _, }
- }
3 Z6 f- p6 `: N0 J
Скопировать код 0 K4 h1 p* T/ F x- |0 o- p" R9 A
Комментарии по структуре пакетов и классов:
8 r" }! D. M# l# k5 n- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
9 p, B8 _2 A; O) p" e; P ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
% S6 O9 [+ w+ ~+ `+ C" {: G. a6 eЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
# x3 A- D( a' ^! o2 F7 V u* R2 Y4 g. @8 _( _5 R
3 @# K: A; P% Q. f% t5 E
" [$ N$ I/ F# t6 c
) A: P8 P" c3 _. X& F! m! ?& ]7 [
- W: v# z; w) L) J) [
( N% L0 d0 }/ J7 r3 W+ W4 _. C" p' ~
8 \7 j( |/ e4 j8 w/ B, o' t, o& J8 @1 n
6 H4 _' L; X" i; i4 R% C' r6 i) J- M! X
4 p7 C2 N+ h+ |9 h3 O) ^3 R {3 }; V& e% Y
: R z8 L9 K, g C8 Z { |