Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 8 t! |( X& Y5 e3 n% ^
. R" B: v5 Q6 A d7 h
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.! Z+ S: q& {, y% k* d- `
, {9 ]; o$ U6 Y3 ^. UШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.! |+ B8 L( u( A( @4 l1 b) K
% N' b( \# o9 C/ l4 R2 q
- // Пакет для состояний монстра& F/ Z8 T: C* p2 Z9 ]1 {8 Z3 r6 g
- package org.l2jmobius.gameserver.model.actor.state;
: l4 D6 M+ X3 T! Q) E7 G, H
! N& l7 j' b7 N7 G- // Интерфейс, представляющий состояния монстра/ g0 ~' h9 e) _1 p' P- b* A
- public interface MonsterState {5 D6 ~" n, J l
- void handleState(Monster monster);
# ^+ L! W$ ~2 a* J& n6 s - }
* o# ~+ X( v6 Y; |
Скопировать код - _! `8 m4 p' H: e7 g" M
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. & J0 T. t' W1 k* R5 r* F8 ]4 U& M
9 O- u) l+ h6 m% N$ S) j* LЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя. _# S5 _9 X0 G4 l) r; r$ G# J
6 k1 v/ w% ?7 {( n+ }Класс для начального состояния монстра:
# [7 s9 X+ @' n5 k5 @: O- // Пакет org.l2jmobius.gameserver.model.actor.state( \# e& ^5 ~# g# ^, S
- package org.l2jmobius.gameserver.model.actor.state;4 Y% [9 G" d+ K4 f) P+ a/ Z
- 3 j9 F; E9 B, `. _: T% f
- import org.l2jmobius.gameserver.model.actor.Monster;
n k) Q4 G: N, ?
% E+ E- W9 q t5 J- public class InitialState implements MonsterState {
* c9 E6 ?) |8 K; J6 v4 l7 x - @Override
6 x' H1 k [+ A9 Y - public void handleState(Monster monster) {
2 ]4 ^1 T% w9 |# [9 r - // Начальная фаза боя
/ X) D9 Q: V% N; i - System.out.println(monster.getName() + " начинает бой с обычной атакой.");
% {9 ^8 X( O$ \: W" q - }
0 t' b! k4 Y D, ]. Z+ h) L$ ] - }: O# ?* {. t/ e9 o6 i4 T; V; @2 E
Скопировать код Класс для агрессивного состояния монстра:: K* ]7 _% ?7 F* `) \) V& i- a
- // Пакет org.l2jmobius.gameserver.model.actor.state& i. C9 d, S: H( o$ j
- package org.l2jmobius.gameserver.model.actor.state;
9 L, c9 W% G* |. r' M3 v! r - 1 {2 J& X4 v+ e. W
- import org.l2jmobius.gameserver.model.actor.Monster;6 Z7 q$ U/ S; G N
& P0 o) t: H7 h- h! _0 C6 V- public class AggressiveState implements MonsterState {
/ r" H( f" q+ E - @Override
4 e" {" k. o- x; g1 }: u - public void handleState(Monster monster) {3 o ^3 a' f. h8 |/ E+ i5 v0 _
- // Агрессивная фаза боя9 |* |& c7 Y# O. K
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");! w& ^8 {0 Y) P0 l9 h
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
# D! d! |' I# m7 q. k! t$ |- w - }" d7 p! q7 S- o- I2 y) m
- }
3 u! l( P6 T {6 o( k
Скопировать код Класс для финального состояния монстра:" C- I! u) G- F+ a7 }/ k1 \5 S
- // Пакет org.l2jmobius.gameserver.model.actor.state( U9 f! h; J% ]
- package org.l2jmobius.gameserver.model.actor.state;
' z/ K! j# I- r7 s4 ]8 C - 6 s" ^9 ]; v! J. \
- import org.l2jmobius.gameserver.model.actor.Monster;
$ q+ b: o4 I7 O( M: f - 3 Q. W% E* M2 {
- public class FinalState implements MonsterState {
) c: x; e2 Z3 [ ]( ~ - @Override$ N% A# c7 _9 i2 e' F9 ]% W; r* D3 o
- public void handleState(Monster monster) {2 q7 T5 h% p3 B" v% u7 e
- // Финальная фаза боя" F! U8 h+ [& b
- System.out.println(monster.getName() + " готовится к финальной атаке!");' [7 d" ]# `" T+ D* `
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
2 x5 h3 K0 U* U2 U+ x - }
1 [( Q+ a# P/ i r' N+ A, W" | - }; a) w7 l% Q8 P( B
Скопировать код
1 a' ]8 S1 K" H( M2 kШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.# w7 c" L: g2 l* l9 |* y
- // Пакет org.l2jmobius.gameserver.model.actor
8 j; s: h1 W7 @. g# N9 m - package org.l2jmobius.gameserver.model.actor;
' M# Z) ?4 y. I+ t) l" Z( W5 i
. ]* W( T. Y9 c: e, l U- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
8 n- S9 _# m2 n: ^, K - import org.l2jmobius.gameserver.model.actor.state.InitialState;- V# i/ e; F( M5 ?& ^- Z
- . R7 H+ t& M5 q/ y* [& r) ~
- public class Monster extends Creature {6 r) H5 z# T/ a" G
- private String name;) T6 L& I5 E3 p% d
- private double attackPower;
7 t. B1 o. x; p S - private MonsterState state; // Текущее состояние монстра& g+ Z7 ?- h8 s. s1 B9 i$ d
8 K* L: j5 E* a8 H# Y3 a- // Конструктор монстра: T( A- \- T7 w
- public Monster(String name, double attackPower) {
: |1 J; J$ c* C, f/ P ^ i4 | - this.name = name;
7 o/ Z) W2 [! \/ a% f4 x - this.attackPower = attackPower;
& {$ y9 v- Q2 U$ F0 ]' Z9 t0 r- \ - this.state = new InitialState(); // Устанавливаем начальное состояние! U$ g1 B& S8 y$ ^7 B
- }
8 D7 D) d6 O1 k m
0 x# @$ v$ `0 p' e3 F- // Метод для смены состояния* x# f& F' a4 f$ P
- public void setState(MonsterState newState) {
1 S, Q% ~& ~- V# @ - this.state = newState;5 w- |. X* [2 x" ^6 c6 ~; {% U4 q
- }
! o) [% ?/ w+ c, R7 N% Q - # G# o4 {6 {; y5 H) C, ?
- // Выполнение действий на основе текущего состояния
$ \* `6 Y; c8 ` - public void executeState() {
8 Z$ |, d, s/ Y- Y* [* S- Z" @ - state.handleState(this);3 R- Q P* c) R/ G( C# W& o5 [
- }8 Z$ {) m# U6 {0 v
- . x9 C% Z, U0 H' ~- E- o- K2 }' E
- // Геттеры и сеттеры
) a8 D& @8 }, _* P2 R$ O. d" Z3 r x - public String getName() {
6 G" J) V" [- ^ - return name;
- r1 k6 j9 C! Q5 q) [ - }- d5 E/ J; y7 ^" o. {! l
- 6 z" \+ k0 p9 c. n" ^
- public double getAttackPower() {
* [ f& V' Y( a) [' k0 Q0 E - return attackPower;" `+ X) \( y+ _1 G* `" [
- }
8 `. \. [# `% y5 S - - S8 Y6 `$ c. \; t- K
- public void setAttackPower(double attackPower) {
/ a& n% F: q: U% f4 K - this.attackPower = attackPower;5 k/ ]4 i( \. {8 s, L4 f" n
- }/ [; E/ p& `8 l/ a+ I, ~
- }
2 V; g: R i: m- I
Скопировать код
+ ^5 ]- |9 i5 M, s5 f+ zШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
* p# ?7 m8 ^# h" [( v; C' y* l) F, N$ p0 o2 K
- // Пакет org.l2jmobius.gameserver.model.battle
- @% t* J% f. s6 L4 y! s8 A% c! p2 f - package org.l2jmobius.gameserver.model.battle;
3 h- d; ?! i; l; l0 i& e5 j( p - % |) s3 g [* A+ p5 n2 i. {$ r
- import org.l2jmobius.gameserver.model.actor.Monster;
6 O' f9 L# j P& b& p3 k1 v5 j2 S - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;( F- k, {) b- Q% V& j; y
- import org.l2jmobius.gameserver.model.actor.state.FinalState;* @$ J! k5 Y% k
* l, ^1 t7 k7 B+ o- public class BattleSimulation {; P ~ b$ F% O! r- |8 O' c2 ?( [
- public static void main(String[] args) {
7 k6 _- ~) y% I7 Q- e - // Создаем монстра с начальной атакой
% K* R( [0 Z1 {( } - Monster monster = new Monster("Дракон", 100);! k4 {9 ^8 t+ N4 u- O
V4 q6 m7 F; z6 h/ K7 R0 y- // Начальная фаза+ g) M2 m7 [4 G' @- G5 k* U
- monster.executeState();" n. k+ p# h$ J1 J* h
- - Q! i; s& W) m: g& s% O' R2 N! Y3 P
- // Переход в агрессивную фазу
: U7 d k5 q* D" r" M: X- n8 a, f - monster.setState(new AggressiveState());
; b+ k8 F# b- D* a: Y) |% L* j3 h. g% \- R - monster.executeState();+ O) L9 I V; N
0 Y" b. ^ a8 E2 h- // Финальная фаза
) v# \" X7 O5 F - monster.setState(new FinalState());. {8 `/ o, I1 c5 C" z* ^
- monster.executeState();
! p3 ]2 F" ]; p8 s - }# v+ |; z1 {/ \6 B
- }
2 R7 z4 \$ b& X0 y2 o" p
Скопировать код
+ ?' r$ R \2 v% B! O; u: q: s+ [Комментарии по структуре пакетов и классов:( P2 ^. D3 v7 _5 t2 W7 G- b! t* Z" p5 O
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев. X- h2 [, }. X7 t8 j
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.; k0 J4 @; K$ O: g8 u3 g! F0 {9 V5 M
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!+ j$ j; l9 i) V& W: s: d
9 X$ I8 w/ k, Z8 L! I6 y
* z) O* b. e2 e& S7 H6 N0 q) u7 w9 J5 E" v# g
% i8 S% ?* g$ h( p- ^) C- E8 s. s* b( `" }% J m
. G" S, t. H3 P. z2 n E5 N4 }* m1 q+ I, E8 A0 Z: A0 _
* \& X5 C _; E
' T8 n5 k0 X" {; M; c* G4 f5 o1 v0 K
7 I0 e& X. m5 x+ \. v- V0 l6 I- u7 l6 i# B" p! L; T1 p
1 C9 L0 h" T% H1 d' g) `* }$ [
; W* V8 f+ g" B; S1 }: U, ]& f9 A6 ~6 w
|