Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
8 A: k7 A" a$ E5 h! Q, ^* u( `8 R) r8 o) z& X
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра./ k+ C+ f) e' Q' c
) f( Z% Z0 K f- p/ r' r
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
9 L# ~5 K% S K7 d8 d6 w6 j- B% _7 q/ p. O% _
- // Пакет для состояний монстра
+ E4 L9 d' W3 T3 k" [ - package org.l2jmobius.gameserver.model.actor.state;2 W3 H4 ^0 A/ i' ~& A, W" g, L6 K
- 4 f r) Q. ^/ n/ A5 b
- // Интерфейс, представляющий состояния монстра% ]6 W% ?6 z6 T) [
- public interface MonsterState {5 P, s- b! ~% i
- void handleState(Monster monster);4 d( L$ c. N5 _3 n# o" z/ l# P
- }" e1 _/ k7 ]' D: ?; J; a
Скопировать код
$ F$ p! `% T1 E5 c# H) y3 BШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. ; Y7 g" C( e7 t) X+ k$ n
6 |# Q' B* A! P) d5 p& \Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.1 t& r/ H& E. K4 c
, ~/ b0 k8 e2 q! g8 `. xКласс для начального состояния монстра:* ]! W1 g/ O( F) `* I9 V3 v) r
- // Пакет org.l2jmobius.gameserver.model.actor.state k$ U: F7 g8 o5 S& Y3 {
- package org.l2jmobius.gameserver.model.actor.state;
# z. @% r1 M8 D - / |/ o; Y- L; _* l! |" r U5 ^, P
- import org.l2jmobius.gameserver.model.actor.Monster;
/ @" ^9 f1 J5 W1 H3 G - ( S- u9 \% I& o1 C# F; K
- public class InitialState implements MonsterState {
4 e4 {- k* A, B5 y - @Override
, ^# u5 b% ^# h5 B - public void handleState(Monster monster) {( T) U0 d' P0 X- B4 y w) h* @+ d
- // Начальная фаза боя
6 @3 p) r- R0 V5 L1 S5 { - System.out.println(monster.getName() + " начинает бой с обычной атакой.");
# s. A0 s$ }; h - }. P) H) I' q3 [5 E* z$ s$ A" ]
- }
, Q. T8 @6 @' b, @5 T* `
Скопировать код Класс для агрессивного состояния монстра:- F `8 G b w) B2 Q
- // Пакет org.l2jmobius.gameserver.model.actor.state
/ E7 s, q1 y3 ?1 X# e. X% d7 U - package org.l2jmobius.gameserver.model.actor.state;
4 K3 \- [: p5 Y) c# f - ' V6 P& |' p3 ?3 o, @3 w
- import org.l2jmobius.gameserver.model.actor.Monster;# J6 s7 S9 Y9 {; W8 V
' Z! | p: M, ]( ^" C9 Y- public class AggressiveState implements MonsterState {+ g" {) P7 H& u0 h" ]
- @Override$ j+ ?, E/ [- W- \. |! x
- public void handleState(Monster monster) {
. ~% _7 ~9 p0 m0 u, f$ B( X" h - // Агрессивная фаза боя
0 Z; Z, i' M: Z" t& c# D1 ^5 x, l - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");; E, S5 [% H0 K; M
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
' \- @& \5 [; t% F" v) y0 {4 z+ y - }' A& Q6 C, f/ v# o& ?2 k6 z% `1 Z- e
- }- n4 t8 ]# i3 K0 }
Скопировать код Класс для финального состояния монстра:* r2 m7 v l: N4 s4 R5 R% t! W8 d
- // Пакет org.l2jmobius.gameserver.model.actor.state
( q* D4 u+ t. W; d2 H- {2 k - package org.l2jmobius.gameserver.model.actor.state;3 W0 i7 z2 K7 W7 {4 T
* N/ J) J4 n4 ~. ]. a- import org.l2jmobius.gameserver.model.actor.Monster;; ]3 Y" Z6 L5 a# d0 u3 C' \0 B
- 2 }4 _1 A2 T* E: t
- public class FinalState implements MonsterState { U- }! p6 C" G* z' M
- @Override
/ F% _3 L. _% ?- s A - public void handleState(Monster monster) {
, O8 ?, D/ H1 C - // Финальная фаза боя
* c. a/ N5 [: n# L) U6 ?. m$ y; Z - System.out.println(monster.getName() + " готовится к финальной атаке!");( C! b0 v# Z- h8 {3 N' x1 t" O
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
1 @( _2 r6 G9 M J' M - }& i& `9 w `$ c; N! O
- }
, Q* G9 P; I. Q- G% N! {
Скопировать код
9 @. H- m j7 f- pШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.$ n$ ]/ s# `6 H( f
- // Пакет org.l2jmobius.gameserver.model.actor4 A. O2 u( j3 s; S8 z4 {: r
- package org.l2jmobius.gameserver.model.actor;
* X$ `6 C5 L6 ~: i - 5 c/ B8 n/ u: G( B3 m% x
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
0 i6 e* F6 X" ]; _ P - import org.l2jmobius.gameserver.model.actor.state.InitialState;
+ m4 _, w O o4 ]' P0 k# i. c# G
5 Y. D {$ v5 X1 x* h) X2 {8 g- public class Monster extends Creature {
4 B, h+ p: u; I$ Y: g! r7 t" c) M - private String name;
, _: ~8 y. p) _5 `8 Q - private double attackPower;4 G* e) X6 L! a9 ^; F, A L
- private MonsterState state; // Текущее состояние монстра
/ H5 m+ v7 j* i/ k' n l - # P& u$ @- M7 z) M
- // Конструктор монстра
U! e4 c1 X2 D) X - public Monster(String name, double attackPower) {* e ~% M' g0 o8 u8 y2 I! K
- this.name = name;7 H( {. w! ^7 u3 a
- this.attackPower = attackPower;6 l# w4 t- R4 |# z- y
- this.state = new InitialState(); // Устанавливаем начальное состояние6 F! k" P6 e- {. {% I
- }
) E, G9 m, R9 E - + \1 @( i6 M$ N' m8 |" r. Z
- // Метод для смены состояния& U( b+ h5 J( N P; t) R4 p, O
- public void setState(MonsterState newState) {
' \( P( M7 T8 N' v% b3 i- b - this.state = newState;
, S! z& y* Q3 s$ ] - }8 q; R% m* u# Z# O5 z8 S3 M5 B
- ! j" {( r4 |6 L6 s
- // Выполнение действий на основе текущего состояния
: a# }+ h, I4 l1 U# V - public void executeState() {/ c7 L9 `6 A: @
- state.handleState(this);; Q/ z/ n' P" D+ |
- }
* r, J) Q3 @7 G7 F8 e5 z - 2 p) \; u" `( i# s& {+ y% A5 h
- // Геттеры и сеттеры) h1 S8 \$ C6 \7 |! W
- public String getName() {" P% }4 i4 \8 G$ q. \- i
- return name;" E* I. m, _) Y9 c; O7 g
- }1 ?4 U: I- d2 I6 |6 }5 O! K: W: d$ z
- # s/ ]! Q1 [8 ]6 z
- public double getAttackPower() {! R. c& x" d8 v- g
- return attackPower;9 A4 T2 g+ A; t) o8 n9 S$ ?
- }
$ t- T R b" B
" l6 U; |8 f, n- O: r3 f1 F- public void setAttackPower(double attackPower) {3 n: O3 v, H" v5 s! S
- this.attackPower = attackPower;- R. m9 O, t0 r$ x+ v) b0 |$ }
- }
9 b2 I* Y3 R/ s! T+ ?9 k - }0 N5 ]* F- `8 k7 o" z
Скопировать код
8 S% [. w- t/ X; E) dШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.5 N5 V- i- O+ U
; c2 [% l' U- m- // Пакет org.l2jmobius.gameserver.model.battle! T* H/ z. n4 `1 P0 Z2 `5 R0 r- T
- package org.l2jmobius.gameserver.model.battle;
+ e! f d2 b! w8 c+ W - / T3 n" d9 B& O* I
- import org.l2jmobius.gameserver.model.actor.Monster;- A$ x: g( U( {. u' y
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
O$ {4 H% p1 h" _% I - import org.l2jmobius.gameserver.model.actor.state.FinalState;
+ T. P. ~& e% w, d4 T; n4 \: o& w - ) }5 q2 m8 Q) \; \/ N. X) T
- public class BattleSimulation {
( }4 [6 O4 C$ f3 Q - public static void main(String[] args) {
& v" l% K4 W. F3 u) q/ D - // Создаем монстра с начальной атакой
; w F4 u d" V - Monster monster = new Monster("Дракон", 100);
% W/ U! L1 E! e# S- \ - & o( R6 V! H; Q! J2 g' q4 o/ i
- // Начальная фаза" a' i" f( J {$ e- j4 M: K# w
- monster.executeState();" d5 ?; ?3 R+ {4 g( ^& H
^ f6 t/ ]2 l. g8 w4 p- // Переход в агрессивную фазу
p3 A* I, \" o$ W: A1 q! [4 l0 y" ]; W - monster.setState(new AggressiveState());
, W+ D0 y1 u$ T3 A5 u+ I: D - monster.executeState();2 ]' p) x( y- {/ ^6 j; M( f2 ?) a
- ) C' P7 @7 L* |4 V
- // Финальная фаза
/ j6 n8 `. }* C6 O. \2 c* p! f - monster.setState(new FinalState());4 _/ I( a+ s& |' R( b# J6 q
- monster.executeState();
7 u8 \0 e$ f$ N - }
- ?6 v3 A# U- b - }9 Y0 C% |2 t( N0 Y& C- Q
Скопировать код
+ d7 B& z" [; l5 O( O P# v+ F# yКомментарии по структуре пакетов и классов:$ t- p( B1 V' |* U+ c ?1 J7 X S
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.& c/ W2 j: r$ z
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
1 C1 M* g& b$ @! y* b6 lЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
9 s( }( d _/ f) w1 U
6 K' D) a. x# I/ d7 D: @5 o( i& T6 L% n
. X. X L" G6 D3 B# f+ Y3 _, o$ w' t8 u! d1 s/ p5 v1 t7 e8 L5 [
f; c, i4 u" `! O2 I+ e
* X& i+ V: F# n! K" b3 `% T
2 U3 z4 B. m. M6 B, b) c+ L. J
4 X7 t/ L" d" q6 G/ ]* c: Y- [
" A9 ?- a @/ b3 K0 f+ h. y! k: Q# S6 m% o+ B6 k- ^9 ~ f9 e: x
* W2 o" c8 B8 F! v9 m" p
4 ~1 ^; p2 ^; U& i. J
+ g1 X) Q$ {: y1 ?9 C
3 L7 O1 b* W: O1 B5 X. ^: B, w
|