Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 1 b3 }- f+ @7 e6 k; U* P: l/ M
/ g! m0 X! r. d) h& \. W! Z
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.) `( f6 }3 V% ~
. c( T+ `7 z( V( i! h: b/ RШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
6 }# J/ s1 o; P' N; |+ q" A8 b9 Z% P
- // Пакет для состояний монстра
" R s+ t5 v5 N# D. V, B7 ^# B - package org.l2jmobius.gameserver.model.actor.state;. n; e* H* n2 V% \8 k- |
- ' n/ h1 z, O3 i1 C$ @7 y
- // Интерфейс, представляющий состояния монстра/ ~1 p& M# |( \3 U0 V
- public interface MonsterState {0 F5 D7 W1 F& f# w" B! i
- void handleState(Monster monster);9 l+ M- T3 j# {$ z5 i7 \$ p2 J
- }
) ~% d. K( j6 i+ c/ u/ N7 N {
Скопировать код
q) D! B" U GШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 5 n2 I Q! L" ^1 c
5 \# `4 E" [ g% \Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
0 `; K! a* }: s* h" _5 H: A# F# g$ o E) P- j/ `0 \8 _2 [6 ]/ I8 r
Класс для начального состояния монстра:
$ `+ o0 J' i' C- // Пакет org.l2jmobius.gameserver.model.actor.state
0 D/ w" x5 B. `. {1 C6 `9 } - package org.l2jmobius.gameserver.model.actor.state;
/ R5 b5 I5 I3 F1 T4 o% n+ T/ e
8 p8 i3 {' z4 \) ? Y- import org.l2jmobius.gameserver.model.actor.Monster;
( ~3 N' h# z1 @ t7 `
( D9 E" r8 H) M- b, v- public class InitialState implements MonsterState {
5 U2 Q+ H3 P3 v& f4 M7 y) @ - @Override
F+ K2 a' ?, Y6 b' b - public void handleState(Monster monster) {$ l5 T6 C/ L) i; n
- // Начальная фаза боя
6 R& _) m$ P0 ]3 b, c# H - System.out.println(monster.getName() + " начинает бой с обычной атакой.");
8 b' w0 I$ ]% Y* m* W) }& }5 p - }
" M: U" K0 A3 C X4 Q - }
" J& X9 o, {* n2 Z( O- s: d6 f! c* V
Скопировать код Класс для агрессивного состояния монстра:
( j5 a0 e4 {' ?) |( V- // Пакет org.l2jmobius.gameserver.model.actor.state0 C9 _9 y0 H! B& v" Y/ Z
- package org.l2jmobius.gameserver.model.actor.state;( K1 I- S# q" f2 t _0 F# t% l
- E( t' U# N' I- import org.l2jmobius.gameserver.model.actor.Monster;3 Y: v7 a# {# q, f
- ( X9 t0 @3 C, O4 t8 ~3 s/ E1 y
- public class AggressiveState implements MonsterState {7 t2 |/ b4 U+ s; m6 x; t, }
- @Override
; m% Z) G0 R# e3 f c* V - public void handleState(Monster monster) {
/ i+ q. c* h7 E; s: V - // Агрессивная фаза боя
+ Y! ?0 J7 R& j- u" v/ S) F3 P - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
4 p" g+ D& J1 v7 Q - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
' y$ G* \* o% n. f - }
' l1 Z2 d9 @# N3 G4 i" F: N - }5 B% y3 a- k3 V
Скопировать код Класс для финального состояния монстра:! I4 Y5 `$ e) s7 R& h; x
- // Пакет org.l2jmobius.gameserver.model.actor.state& w( x5 l# Y- c* ^( d
- package org.l2jmobius.gameserver.model.actor.state;( i' D8 E7 ^2 O4 ?
! A: E P/ J F8 S% W- V- import org.l2jmobius.gameserver.model.actor.Monster;" O/ C" h, `. I! }3 Y" u. e9 ?
- 0 k( d% g( [- f3 t) c& C! [# c" I
- public class FinalState implements MonsterState {0 z) Q ^, R7 q$ |6 }
- @Override( ^* ~+ G/ Y# @- ^
- public void handleState(Monster monster) {
. q) P4 |! d) ? - // Финальная фаза боя
1 {. b( w; K9 F# I - System.out.println(monster.getName() + " готовится к финальной атаке!");. a1 @% U* r' Z7 B8 f$ b9 K/ L
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
6 H4 L" { C [' Y$ k/ c- o - }' i$ I6 g" v8 f' h; r
- }
' t% Z9 |6 r' G+ _) p
Скопировать код
8 I4 l" A4 Y% J$ y8 iШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.8 C2 u; l! x& T+ ]7 N4 \
- // Пакет org.l2jmobius.gameserver.model.actor
` c# k0 J$ H3 l2 m6 S - package org.l2jmobius.gameserver.model.actor;
4 Z5 u& M, H1 P6 ] - * @( y# B% @6 |
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
% c" j$ k) q* Z2 S - import org.l2jmobius.gameserver.model.actor.state.InitialState;
# i# l, j& i' I5 }. G [6 d9 ^
! ~5 I6 s! W' ?1 m* `3 H/ U/ J* x3 Z- public class Monster extends Creature {
9 `7 f5 g" u' H: i& F! c - private String name;1 p* j2 h2 C' h( P: u) ?7 _6 Z- n2 u
- private double attackPower;; v: F. p# f' R5 e' [! u
- private MonsterState state; // Текущее состояние монстра
# |2 X% o$ p) u; U- J! r - 3 ]+ o1 y- U" H0 a$ y- u
- // Конструктор монстра8 S" l- D& B8 |
- public Monster(String name, double attackPower) {
" [( L2 { Q1 j/ d" x - this.name = name;
+ S- k" j+ F" u# \9 m3 i& Z0 a - this.attackPower = attackPower;
& t: T% X3 ]) ~6 n; B - this.state = new InitialState(); // Устанавливаем начальное состояние
7 R# v( f; E* p' s8 H& G - }& _! \: w! S2 u0 n! c4 P( F9 e$ Q
- * @5 @9 \8 _& S) |) ]$ V5 o6 l
- // Метод для смены состояния
: P. Z4 a3 W4 h; R3 B3 G$ z - public void setState(MonsterState newState) {
% Z8 b9 n! x9 D2 s9 ^ - this.state = newState;
9 {7 C% Z% e2 k! |, f n/ F - }) X4 k0 ?. ^4 U, u1 a% |( L
- u( g8 }8 F3 c4 C, ~/ ^* J% k# K+ A
- // Выполнение действий на основе текущего состояния
1 K* l4 N; O1 B0 R4 o - public void executeState() {3 D) e. G" K8 d$ |5 |( ?# _
- state.handleState(this);
, z% Q* [+ P5 K' X - }% ]2 R6 B/ K' A8 o4 I9 l' L! c
- 7 K3 Z* y4 S- O# C! v
- // Геттеры и сеттеры3 B8 B% E5 P) c' b i0 i2 n" \ I _
- public String getName() {- y1 j* K1 p2 ^9 O! g0 A. H
- return name;3 J/ `6 i6 p1 F8 C3 D; B
- }
' R/ t5 A# ^* |- ]
. K/ I- d) o* s; h) ~5 V- public double getAttackPower() {
Y/ L0 w- B1 E8 Y" \7 Z1 g - return attackPower;2 }. Z) |- |$ H H& f0 g+ ]. m
- }
) o4 Y; P8 E. R; ]5 I/ ?; l+ }: T
) p9 s; }) r: x' J- Y- public void setAttackPower(double attackPower) {
6 g& t0 J' Z7 C# C$ ^7 _ - this.attackPower = attackPower;7 u5 w! ~# E2 g U7 K! x! r
- }
6 S% A5 H( N% h8 ]/ a& N - }# p4 {. Z1 ~7 J+ ]0 V' ]
Скопировать код
( Z) l+ U8 m1 F6 {/ U( hШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
0 [1 |' ~* i6 v+ |2 d/ x0 j7 ?0 W7 h' _9 F$ e% V: q. K) M- B
- // Пакет org.l2jmobius.gameserver.model.battle/ r: _, t& @/ ?) I/ e
- package org.l2jmobius.gameserver.model.battle;$ v/ q: }* r8 ] U/ a
- 0 S' w6 W2 e+ a
- import org.l2jmobius.gameserver.model.actor.Monster;
. F# i7 ^/ F4 k) Z: H/ m9 O - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
5 A4 K8 v# n1 b# \; J( L* l8 u - import org.l2jmobius.gameserver.model.actor.state.FinalState;
; w7 G+ [" {+ y0 Q' A. Y
4 C) P! ~0 J& j# p- G- public class BattleSimulation {
% e; y- U( i: a - public static void main(String[] args) {# y2 t" D+ F: a n$ h
- // Создаем монстра с начальной атакой3 V. a6 s# U+ ] }
- Monster monster = new Monster("Дракон", 100);5 |! ?3 l x, c" I" q
- 8 `' p6 P/ h8 D& F2 C& k
- // Начальная фаза
, p/ _! _5 M7 N1 N! n - monster.executeState();& \, M0 p/ p' Y" y& k
- + Y$ K5 J- t( X
- // Переход в агрессивную фазу7 L4 J4 `$ f: _9 P4 {
- monster.setState(new AggressiveState());
6 r% z \0 u, ~. r1 }9 f - monster.executeState();
- z3 Y4 E) ]3 E
) @0 Q* k' ]" U- q0 R- // Финальная фаза7 _ g! Y' y* `- G3 k. w) X
- monster.setState(new FinalState());
1 K1 N# z- @# E& m) g/ ^ - monster.executeState();
5 Y) T! ~6 a; I d; R$ S - }
$ Y/ U2 O0 ~, `9 [1 L7 H - }
9 d# R) G3 s" a; k
Скопировать код
( N! z, g6 ^2 U+ U6 H3 YКомментарии по структуре пакетов и классов:
- H& h, E8 B& y( E- i. G- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.3 U/ X8 h& A# @- N
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
; f2 g1 r% O( ]1 xЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
. h& P- Z2 u/ Y; {% S# |" m: `0 u. C6 D" i
) M; v4 {2 Q f# e6 [& Z. r r( J8 z
( y( b5 l+ Z- i6 N3 a/ d6 L
% g8 ?: c$ |9 ~6 n0 [
) j2 E9 F/ R0 R F- W, q% q0 ^# h: {- F$ \+ @" Z1 n; }
5 P* H1 v6 c! `1 f# H
. H2 T" [; l' Q+ U7 m' t
/ [. P% ]* f1 }# p+ _6 _" }: r4 v" L |9 f/ f9 \4 C4 f$ d
1 {9 I% ~6 t- x
! K5 [1 W. ~) A& k
2 L/ j) n) Y) m% F
1 t1 G. ?% T" g3 z- y- d
|