Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
3 A4 L/ `+ ^. f2 ?! `
- ^( u. c5 B5 D$ T# x E, OЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.' x1 t, E' f, V9 P$ K: o* Q
, F1 d( X( s) b* x# r. {% Y
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
7 N! z8 `" e v0 S& K/ D5 Y% v6 x& d: o6 J; a: c" Y" F% x6 S: P
- // Пакет для состояний монстра
* `* n. ]+ Z+ x - package org.l2jmobius.gameserver.model.actor.state;
5 N' `% e' a4 e7 K( X) f- b1 W - ; b% ~9 ?* @# C2 C
- // Интерфейс, представляющий состояния монстра
) P& i/ x4 m6 t; d: L' ?" m - public interface MonsterState {9 m8 p& t$ u9 I8 ~1 Y
- void handleState(Monster monster);
, O4 T6 K; T2 g, @! N - }
5 H$ B& M4 c0 @/ p B3 a' F5 ]2 N
Скопировать код # k8 U7 \- l3 @5 ?4 A/ d' `5 T
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. % J/ i7 C3 h( y$ N5 y1 C
: p- G( v8 S7 Q# i' V# @9 G3 a# s
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
2 c. [8 u( L2 Y9 C; D& L$ \$ }" X3 s- [# d
Класс для начального состояния монстра:
7 i) I }/ k4 ^% U6 ?- // Пакет org.l2jmobius.gameserver.model.actor.state
6 D F5 _& ^% \4 x - package org.l2jmobius.gameserver.model.actor.state;
$ s9 t$ Y6 m% G# ^! W5 ^' T - , F6 w' b$ a8 P) ?1 o6 Q, ~
- import org.l2jmobius.gameserver.model.actor.Monster;% T" n- a$ ~ q& _1 u
- & T# `7 x6 k+ {! ]# u
- public class InitialState implements MonsterState {" _! K" Y4 B& T6 }0 _# R
- @Override
7 F6 \" M( Z, n - public void handleState(Monster monster) {- l8 V/ u, X3 i. V0 a& j. ^
- // Начальная фаза боя
1 T9 J( C. a7 t( z. f - System.out.println(monster.getName() + " начинает бой с обычной атакой.");; {. A& m; z0 \" P
- }
, v$ J" }+ ?3 s5 \% u9 F$ K - }
! r- \9 a+ n* f. t6 E1 L
Скопировать код Класс для агрессивного состояния монстра:
/ Q& g1 X/ @( `- // Пакет org.l2jmobius.gameserver.model.actor.state8 m3 o2 V* }- p3 L C% v6 x) ], y
- package org.l2jmobius.gameserver.model.actor.state;
; ?& t0 V! v# `8 N - 2 h5 _. {6 j0 a: U
- import org.l2jmobius.gameserver.model.actor.Monster;0 h+ t6 c4 p- B* m/ v
- ! Z& N b7 E4 f* I+ K
- public class AggressiveState implements MonsterState {6 i* F. y' b$ m7 g* K4 l' a
- @Override5 l% }' N" p2 N8 }
- public void handleState(Monster monster) {$ e, Q3 E: m C! M5 ]& B3 e `7 T) k- ?) k
- // Агрессивная фаза боя
- }2 t3 x/ I' U0 d! q - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");5 a9 l: e2 a1 h$ ]" y% Y) W6 A L
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки% ^/ K: o% `3 A) O1 p
- }
3 z4 E W/ `7 N. W; i! R - }. x/ H G. G* C6 }" _
Скопировать код Класс для финального состояния монстра:
1 @* Z, V- e1 D( U& `- // Пакет org.l2jmobius.gameserver.model.actor.state
- Y8 n/ p7 k( ~& R0 w - package org.l2jmobius.gameserver.model.actor.state;
- W) V* A$ D3 v
* ]6 G* ^, A$ Z% x. j9 k# q! S- import org.l2jmobius.gameserver.model.actor.Monster;
# ^5 l: O! c# t/ P% L* p* b
0 r1 `% A& I' r3 p" i& I! M- public class FinalState implements MonsterState {
F1 m+ o+ F6 H - @Override' u. J) P( Y3 E, k- }* S
- public void handleState(Monster monster) {' G& b2 o- y( P% ~
- // Финальная фаза боя
& N5 r- y! O* ~, K: B1 s. d" W; ] - System.out.println(monster.getName() + " готовится к финальной атаке!");3 f0 ?# F: k( D3 E9 `% N6 D: n9 p# u
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
8 u& _* k; a, ^" S, Y - }7 y& b% \& }- J$ S0 V$ ^0 g) @
- }
. w+ W% h( Z1 J/ t7 t: P' x
Скопировать код 0 N- J- N# r9 ] [1 p
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
, {9 A7 G, C6 L4 o- // Пакет org.l2jmobius.gameserver.model.actor5 Q% H' K8 }- h- _
- package org.l2jmobius.gameserver.model.actor;. k3 \* h/ d P. q
+ r9 {" r/ Y3 z/ \, `- g1 M- import org.l2jmobius.gameserver.model.actor.state.MonsterState;. ?/ R; o/ S0 e+ f
- import org.l2jmobius.gameserver.model.actor.state.InitialState;/ s8 w0 X, p. X7 H/ \, Q
( Q* o' k) k/ e/ c4 Y% Y- public class Monster extends Creature {9 u- Z2 S. E$ D' i G6 E1 X2 ?
- private String name;
1 n0 U7 i0 P# {0 q& _ - private double attackPower;
$ @7 B X8 E& W! N - private MonsterState state; // Текущее состояние монстра: ?; N2 }. p" Q4 W: Q
- ! |! v* p, h# E( K! C
- // Конструктор монстра' W8 ]2 b. k* @& H! k
- public Monster(String name, double attackPower) {& |: h. e+ }& J8 G& S) r5 `
- this.name = name;
- U7 l0 \, Z7 {* A3 D" q H - this.attackPower = attackPower;
. t: B5 o ?5 u. P9 F - this.state = new InitialState(); // Устанавливаем начальное состояние
/ q- z5 g3 S! j) \! m - }4 H* R$ \3 T1 z* V0 U( s8 c
+ g; a% X3 K! a2 _, D* X- ^' V8 B- // Метод для смены состояния( R2 ]: V1 ?% t/ E9 q7 u
- public void setState(MonsterState newState) {. O+ B |' [2 l, Y/ i4 ~
- this.state = newState;
! E: n4 ~) i7 a3 ~+ t - }1 e. |% O1 u- z# G2 \7 t! V
5 D& s" n6 g/ o# R' P% b- // Выполнение действий на основе текущего состояния m3 I7 p' D2 Q0 W( M. G
- public void executeState() {8 B) G8 c; F' B. q: r7 z8 ]) \
- state.handleState(this);7 k; ?0 }( V0 J6 }2 \+ U$ \6 W# H
- }* e* R4 }1 g4 ~# F. u
- # t: |) H- |2 w/ u% _! P* _2 Y) L
- // Геттеры и сеттеры) C) H2 D' u8 C
- public String getName() {
: z3 H+ S$ f8 g& v0 G" z# } - return name;
' P) n9 a& b/ l- H$ O2 E - }4 C8 m- Y6 \7 `& X3 z& a' k; H
- + j/ d- Z' a) ~" V9 {. J( [( i2 j
- public double getAttackPower() {4 b0 n) y, g; k& p; m0 b
- return attackPower;% e' r2 U, c( _: h4 ^; i; c: f$ k' ]
- }2 H6 Z. n% {6 ]3 A9 Z
" b* e, L y' Y$ |: F. z$ M+ R- public void setAttackPower(double attackPower) {& Y/ z( X2 W3 ^2 N, F# h/ \
- this.attackPower = attackPower;
, S8 E+ ~6 E% T9 m - }
! D. C) G) H8 x P7 z6 @ - }. ~5 T, d! R2 a' g& a0 j: Y; ?
Скопировать код - m3 z$ m# c9 o! ]: b, R
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.6 N4 Z1 i; V0 b* s/ _) u% Z5 |
: V) ?; E+ }& U- M) Y5 V- Z- // Пакет org.l2jmobius.gameserver.model.battle
! F: R$ l; `6 u$ U9 }3 i p! n - package org.l2jmobius.gameserver.model.battle;
]6 S5 @6 T: s1 S Z4 P- K
, V) k' Z! [& l2 m# w- import org.l2jmobius.gameserver.model.actor.Monster;
) p. V: t6 \. q3 L - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
0 X# o* j- i" G; i) Z. C - import org.l2jmobius.gameserver.model.actor.state.FinalState;; Z7 B& J$ B u' W* X, c
7 C2 q/ }; h% b% V- public class BattleSimulation {9 L/ M9 w( j# A' V8 l. P! z
- public static void main(String[] args) {
( P! C T: F8 i - // Создаем монстра с начальной атакой
. L1 ~ d% N8 |/ X6 _# T& G - Monster monster = new Monster("Дракон", 100);% y6 F% l. o, ]# d
" d* o+ ?) d8 f2 ~8 D- // Начальная фаза5 q; \5 z- m( O- C
- monster.executeState();
8 w' U4 I% _$ ^ K# b# W - & G0 t' {" t8 l0 \6 k$ _
- // Переход в агрессивную фазу6 @& }$ k0 j6 z1 d( e
- monster.setState(new AggressiveState());
" B0 {4 U4 H# U; |8 Z* R - monster.executeState();& H/ }0 Q; `; m& O3 F
- : H9 l0 i! \' }5 r
- // Финальная фаза& a0 Y$ m: u9 _$ x
- monster.setState(new FinalState());' l6 T9 P! ^# @; F8 }- E6 H# v
- monster.executeState();
9 O# V+ L) v# a( [! g/ H% i - }# I( c" b1 P$ M+ y4 [
- }3 g( m& ^# b$ g) k' C2 h
Скопировать код 1 N2 F4 @& T- C: y: b
Комментарии по структуре пакетов и классов:. V2 I. j) t9 t+ }
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.# }2 @+ k& C1 F# M4 j- p
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
& C# L' Q- U, T, X8 PЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!5 n7 X$ y' D2 G- Q3 h, s$ `
) N9 w2 K) p' S( L: o3 {3 s( a4 v: {, ~* A9 ~6 K
@2 T! J9 B8 }7 m1 _
9 |) |& A0 y( G- i: D
6 R# U9 B: f& u& C( }3 A7 {( C7 W
) \0 @$ i' A! L, _1 A, W' V4 M) v3 v6 T
* J! ?$ J8 F- w, `+ i4 L. y$ {# T0 R% y
' v" |9 a& ` e! b$ b$ p% e9 O
) B1 i) b0 s0 `0 b8 t( R4 {3 z Q8 a0 l/ j6 X
0 j3 k5 Y) J* r! a/ ], E" x) {
1 b! C% m% Q6 C1 d |