Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
3 A3 v/ {/ w$ R4 s. Z* M" J# a+ f( F/ f
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
" D. G1 s" r7 m6 Y5 U, o r$ K! V2 D- g
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
7 n1 i3 X, N* T- W# z5 u. H+ I0 s2 Y; _4 D2 C
- // Пакет для состояний монстра; T( B8 c: D5 m3 p" \
- package org.l2jmobius.gameserver.model.actor.state;
1 M$ d6 f) ?$ x - $ u3 i3 H2 `& k+ x4 p9 x) |2 c+ E
- // Интерфейс, представляющий состояния монстра$ @$ M3 `! |, m, ?9 b! J/ d
- public interface MonsterState {4 Z3 M0 h+ W- i3 p4 X
- void handleState(Monster monster);- T4 D x# l/ |1 I1 @
- }
5 \& y+ b$ p8 U2 B5 V2 h: I! F4 o" w
Скопировать код
g% D& d: x# `/ h; O8 U! {Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
" \. z( S" G* d% c+ \6 D
- l. o: O1 h0 f: V' EЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
2 R5 b7 o: c/ J, A# }& x m3 z9 q# U( [7 ?. k
Класс для начального состояния монстра:3 M' R3 c( r: {$ h% R
- // Пакет org.l2jmobius.gameserver.model.actor.state
/ o% j; C5 d) w. Q! I N+ l7 i - package org.l2jmobius.gameserver.model.actor.state;1 o4 z& B% Z& l5 S/ @' Y
- 8 q6 Z8 b6 @% d* \6 g6 ]4 d. X6 l% \
- import org.l2jmobius.gameserver.model.actor.Monster;
+ Q2 N- L3 Z& \, ^. N! M3 ?* i - 2 {3 i. ~& ]+ x% t" v2 J
- public class InitialState implements MonsterState {
+ T L2 ?" z" [! s& u4 W; L& k - @Override% t- z( R, M3 y& y
- public void handleState(Monster monster) {. I5 P! Y( c7 H. Z7 z" a
- // Начальная фаза боя( r2 f8 i5 U: Y+ r7 a- y) c
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");
7 w4 B+ A& h1 k& V. f - }# n R/ Z! L7 b
- }
1 l, s& N" x: G' ]5 w$ F, l
Скопировать код Класс для агрессивного состояния монстра:
# \3 }# ~- `) c, O- // Пакет org.l2jmobius.gameserver.model.actor.state
% a& F8 M8 v: Z - package org.l2jmobius.gameserver.model.actor.state;. v5 O( T& M2 e. q8 N
- - s3 d! L9 b! P% I
- import org.l2jmobius.gameserver.model.actor.Monster;
' X* N9 ?5 h% y4 _
( k+ K( v5 a0 Q8 J) R. }# Z6 {8 v5 `- public class AggressiveState implements MonsterState {- A- u' k" u3 t
- @Override3 y; X6 ?$ d+ J; @- M9 S& t
- public void handleState(Monster monster) {4 u7 A! h( R+ N- o: M. Z
- // Агрессивная фаза боя
9 g# ?% b, }' [- |& V' q" M - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
+ ^1 F9 n y/ g' p - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки, b2 [6 j3 f0 x8 ~( b Z
- }3 C4 @* O" ]0 w/ f0 U
- }
* I! u# H$ T9 M8 G, V% I
Скопировать код Класс для финального состояния монстра:
( N! j) O; m4 e9 h- // Пакет org.l2jmobius.gameserver.model.actor.state& b8 Z1 K" g. W" }4 q! X# g
- package org.l2jmobius.gameserver.model.actor.state;
; @( @6 V9 @1 I' w7 r- H' ?" E - 7 g5 K7 q% r) H# W
- import org.l2jmobius.gameserver.model.actor.Monster;/ p4 u$ v9 I# @ E
5 Y# m6 z! b. p N- public class FinalState implements MonsterState {& i. m1 T, v' n8 P5 i& T" y
- @Override
3 S# D+ u* p$ f: Y7 P& j - public void handleState(Monster monster) {$ v( X% ?. h5 h# H
- // Финальная фаза боя. Y# y" B8 C4 U% O8 }+ E# h C
- System.out.println(monster.getName() + " готовится к финальной атаке!");
8 R3 h! l- ]) J& o; p/ e3 _0 K4 a - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки# l$ m: y# O+ I8 N
- }
/ ?7 y+ A5 C' E) Q2 | - }9 J9 \3 Y* s }; r
Скопировать код
, w9 D/ B5 S' |3 g" WШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
' J3 H% s% u% S- // Пакет org.l2jmobius.gameserver.model.actor
' _: f. u& y. V# ^' y. z - package org.l2jmobius.gameserver.model.actor;
6 I2 {' ]7 t% x" S% x
& M" }/ q/ O2 \& p" f- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
0 N; N! J$ q" A/ b% n* \ - import org.l2jmobius.gameserver.model.actor.state.InitialState;6 t5 ]* ^# L4 ?. L' l
. R) `4 @ |+ I0 p- public class Monster extends Creature {
. s3 T. m" V2 L. O - private String name;
& F) u4 l0 |9 h/ q: n - private double attackPower;9 v: m2 I) `/ Q/ k( w" Z
- private MonsterState state; // Текущее состояние монстра
3 E1 H' e4 v" l" M2 B
% T5 c+ m& |* }. ^- K5 g) V1 K- // Конструктор монстра$ w# y2 U' Y5 K! ~ v4 k( k* ~
- public Monster(String name, double attackPower) {
* y0 O+ ]- {/ ^2 f4 O8 i( b5 B - this.name = name;4 m+ v6 A- j' ^6 Q0 p
- this.attackPower = attackPower;
. L6 m( U7 z+ H) } - this.state = new InitialState(); // Устанавливаем начальное состояние
3 Z, a& o) E3 z: b5 ~+ c - }& } \1 h* g' K/ f& e9 n# k4 a$ s
- 6 r" h4 l4 S( i3 m- Y$ }
- // Метод для смены состояния
b& ~* g, [) d: e# _. V. r5 u3 |+ h - public void setState(MonsterState newState) {
" T& m4 f s6 U9 H - this.state = newState;/ N( J/ _5 z3 g- M- ^
- }3 a0 {8 B- F* I' ?
1 O1 n' _9 X9 V- t/ j- // Выполнение действий на основе текущего состояния$ N8 {: P, @- @ w. ?; `6 ^6 o
- public void executeState() {
/ B- I1 {% Q7 h; d" z7 Q - state.handleState(this);
% x- h$ _, \; Z. l+ s& [4 ]2 T; m: { - }% P, o5 p4 n3 s0 [6 h3 @; ~
- 6 b% w6 m; P2 u# O" s& g" x9 m
- // Геттеры и сеттеры5 _ o6 H% I$ N5 [, R9 p _; I
- public String getName() {! p/ r5 S' @5 G4 e
- return name;
7 M* z) Z! M' X! [ - }
& u3 s6 n& c) `& C: Z- ^1 S4 K, y - / E1 l* f7 L5 [
- public double getAttackPower() {0 o) P8 w: f; W" G
- return attackPower;
& P9 p2 a6 G2 j7 F - }0 J/ {. U3 Q/ ?
- 7 f0 [3 }2 v0 k
- public void setAttackPower(double attackPower) {- M# y$ X/ c9 I0 t
- this.attackPower = attackPower;
6 T( T4 W/ o) W* F - }" a( @7 y' `4 z' q2 I G3 J* V0 H4 k
- }: s3 L* G3 b9 B/ ~: Z' Z! i; A& z
Скопировать код
8 c' L2 C6 D! Q# m% ` B H, XШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
& O8 J! C1 [0 h5 v
+ d5 @" E( t% I- // Пакет org.l2jmobius.gameserver.model.battle
# q a6 G6 L' P6 c- T; K - package org.l2jmobius.gameserver.model.battle;
7 I/ h. w1 y0 O. k9 {& V. w# F
9 N+ w3 T. @; H( Q- import org.l2jmobius.gameserver.model.actor.Monster;" ?" l6 h7 J" ]; F- B6 W5 G
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
' e) e3 W) q5 M u - import org.l2jmobius.gameserver.model.actor.state.FinalState;1 J+ b5 H* R! \. o b* M
. {* K/ U; H3 V- public class BattleSimulation {6 ^) E; D' b- k1 A+ u* E
- public static void main(String[] args) {
1 Z6 o, e8 R/ G8 j1 Y3 I - // Создаем монстра с начальной атакой
9 w8 [3 W, v* H - Monster monster = new Monster("Дракон", 100);
1 q+ X+ o9 f; i, ~4 S/ K* b
. F5 k V5 ?. L2 ~ _- // Начальная фаза* h, f/ }4 _( B1 |9 \
- monster.executeState();
3 [9 ]. m0 T; l9 u* N! z
9 W: S. d7 o4 E- // Переход в агрессивную фазу+ d E8 B$ _0 Y" |+ y3 c1 B
- monster.setState(new AggressiveState());
; Y# Z; @4 h) d" a2 \' i+ g" t/ [ - monster.executeState();" H$ [" v" K& B* x" ?) n# A; K
- 9 H& L+ z$ h& O# ~. @
- // Финальная фаза) i4 t- g9 z9 W/ x2 ^' y" D
- monster.setState(new FinalState());) X' M; ~% k' O" B0 d( A
- monster.executeState();
3 A! k" D9 I; R( E3 o6 E - }
# D) v+ ~ ]0 i$ f - }
9 H% u- q, ~$ c9 z' R
Скопировать код . k! R9 A9 N$ M0 T2 e( M5 [; }
Комментарии по структуре пакетов и классов:
/ F5 ^$ C* a8 [) M n- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
4 G# D4 _# X* e: w3 n# J ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
R( |) B" v$ c c( p$ I$ MЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
8 Q$ Y8 [" k1 t3 Y- L5 s5 f2 \+ P3 [- X) h( ]! K
' ^: T8 R6 b# o' i; R8 k9 Y7 q
6 b& K" p$ H \9 R3 ` Z! W! o
% }7 k1 Y3 b* O/ ~, u4 y( x- B* _* [" |/ \: m: R
3 |' q, [8 K E8 M
P5 m) @5 V' D. z6 e1 G
2 n" X4 j' d' r9 i" u B
' A0 g: b6 ]7 `7 Y* v. d2 i w) ^$ [- a+ P2 ^; H( _ U! X- f0 H+ m6 x
1 z8 S y" b- e, W7 N- i+ K8 b4 V- Z- b3 o- f+ G/ y
; B' @( e3 Z, R5 v" {7 b4 q7 p% v4 ]+ \( B8 U6 O6 E7 t( S" I
|