Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). - @4 |& T1 v& Z
# H4 N! N1 ]# kЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.8 n& t3 L! j1 T, R' i: J( W
2 v# |4 B& |5 ZШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
: y1 O7 j# m* _6 I" F+ W5 ]
# Y) I# L% [/ G% h; F1 x( }) ?- // Пакет для состояний монстра
* k! K% |1 _3 t - package org.l2jmobius.gameserver.model.actor.state;2 p1 k8 E3 B; H8 |
- 2 X q) k9 |7 E. m; Q1 T
- // Интерфейс, представляющий состояния монстра
6 h' i/ ]; J' Z: I9 ] - public interface MonsterState {
; j/ P3 F E& g4 m- ` - void handleState(Monster monster);
- M4 k# S/ F! A' N9 A% g/ P+ \ - }8 K3 c1 d1 d+ ~: P) d2 _6 m/ ]
Скопировать код
# b! J: c S; F8 m7 \Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
% T- P& P8 {" y4 U; T- n' |( o7 W1 q, w: T
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
: M+ e4 o/ h/ L1 H5 z& }6 W. O" e; l+ O3 y! @: Q
Класс для начального состояния монстра:
7 f3 e; R9 c6 p+ J. J- // Пакет org.l2jmobius.gameserver.model.actor.state
% \5 `; _6 c$ C, @; U - package org.l2jmobius.gameserver.model.actor.state;/ |$ T, K' a" u S& R
- % k" K0 x, T- }% r) _, R
- import org.l2jmobius.gameserver.model.actor.Monster;; u8 F/ y! ~5 M- N) @2 j
- + a+ ?7 c$ u3 o8 \6 g9 o* @
- public class InitialState implements MonsterState {
+ ~. \7 n5 \" @6 z2 d - @Override+ X. B7 B4 t2 h7 V1 _' Y" g
- public void handleState(Monster monster) {
: ^* M$ O8 K$ ^* W/ ` d - // Начальная фаза боя
/ g0 ?7 Z( g8 y7 R n! G - System.out.println(monster.getName() + " начинает бой с обычной атакой.");
( }0 ^% I1 E/ h: G4 [6 l5 p - }0 \5 f9 q: G) a2 @4 f. ?
- }
4 G: H4 y2 b* {0 `' |8 g: O) R& f
Скопировать код Класс для агрессивного состояния монстра:
4 {6 a8 ^8 e9 e6 `* f- // Пакет org.l2jmobius.gameserver.model.actor.state
% T# V$ S2 @- \ - package org.l2jmobius.gameserver.model.actor.state;
/ N4 P: I+ u# E' s& H/ _, ~
R* N3 O3 i$ R4 R T- import org.l2jmobius.gameserver.model.actor.Monster;
- ]( a* l# G% w9 o4 e - % v# ^7 Q- L/ Q1 D q. l" G
- public class AggressiveState implements MonsterState {7 _% w8 a9 N' @/ |2 |& _
- @Override- y* W x' x, A6 \" @# ]% P
- public void handleState(Monster monster) {
9 B& ?2 c3 `8 l# g7 e( L9 } - // Агрессивная фаза боя
3 _. d( R9 w% v0 b) s# v - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");( }& i8 \' N8 @; z" U+ P
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
, H4 t0 P! V& f$ u5 X* Y* w - }) |4 g, C1 o! P2 P
- }' [# C D, Y0 p
Скопировать код Класс для финального состояния монстра:; \" |' |- `( K
- // Пакет org.l2jmobius.gameserver.model.actor.state. ?) d' ]% X: p2 ?- X0 W+ X& \: P$ S# ~
- package org.l2jmobius.gameserver.model.actor.state;3 ^2 K( A' m! E2 S* h5 y& m
) b9 s u( `3 z2 {# B- import org.l2jmobius.gameserver.model.actor.Monster;
, e+ H2 Y. R$ `7 Z+ G
/ Z9 b: f- d6 O7 E8 x, F% s6 ^0 H6 C- public class FinalState implements MonsterState {
2 `& n) m1 c3 W; u3 _ - @Override
% h' ~8 Y5 b _$ I" d) o, g - public void handleState(Monster monster) {: I6 M3 N' l+ K: q e9 Z5 ]/ _& C" ~
- // Финальная фаза боя
) E7 V# D* c7 z, ? - System.out.println(monster.getName() + " готовится к финальной атаке!");
+ R! K: ^9 o: K3 |# m - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
1 m1 _4 F2 u$ l - }* V& n$ s0 g. i: \" q! ~, H
- }
4 k4 z7 x4 ]& K7 s$ Q
Скопировать код
: w7 W1 u) h9 Z: fШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
2 Y- F! [" Q! u2 o! U Z+ i2 e- // Пакет org.l2jmobius.gameserver.model.actor& L) T# a4 l0 A4 g- V) `9 A
- package org.l2jmobius.gameserver.model.actor;
: Q+ T, h, @8 j% m
* d/ H% R& \0 `( D6 c+ @9 A- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
/ {9 e% L% x6 a3 R0 d2 H8 G' A - import org.l2jmobius.gameserver.model.actor.state.InitialState;% ^- Q! {3 J- c5 ^( A
) r( ^/ |6 [- A- public class Monster extends Creature {
! h' F& a% c- u( S - private String name;4 R0 v3 G+ d" R; d+ D' X
- private double attackPower;2 I) @ r2 s' ?) g9 x( t
- private MonsterState state; // Текущее состояние монстра
) p: Y7 j/ z# C: Z) t. A! K
) V& }. k2 ]. G/ @- // Конструктор монстра
5 V% t" {+ f) }* I" j. ]+ p5 w - public Monster(String name, double attackPower) {; o' P* d9 @' F; W/ g
- this.name = name;- s- \( F, \! K$ d+ e
- this.attackPower = attackPower;: B& P* Q+ \) k3 Y7 V
- this.state = new InitialState(); // Устанавливаем начальное состояние
* D5 m3 W" b5 G( Z' Z1 Q - }- }* |$ X7 T8 ^# r
- 0 o: p) g2 j2 J6 V( @* s
- // Метод для смены состояния
! g% _4 a2 F7 P0 C - public void setState(MonsterState newState) {. ~" x1 R% j7 u
- this.state = newState;2 f& G/ ]& P6 ^2 D
- }3 M1 P6 K- O* C+ D7 [! ]; { C
" n' a8 X% ^# U" V6 W. |1 z- // Выполнение действий на основе текущего состояния
, r1 v S5 @- Y' s" ~' G, D/ j( G - public void executeState() {
( u" U6 ^% P( U$ S H - state.handleState(this);& f, W+ ^4 Z5 B8 l# `
- }
% X1 p; |# H) j1 l, S* d: a - . w. C0 a+ g; W0 _
- // Геттеры и сеттеры3 U& n5 T% c- D+ [4 Z" c* T0 j
- public String getName() {
; T1 \$ d. q5 D/ v - return name;: n5 C% G) m+ I$ ^
- }
+ O$ M9 ]! T7 `& l+ f3 T
3 d# g) a9 Y) l: F: n1 y- n& ^- public double getAttackPower() {% m/ B. ~% _" q/ i m( \' p
- return attackPower;
' e/ c( A- c4 { - }
9 S) {' t( F- g4 I
$ i9 W7 O' s% J3 z# y- public void setAttackPower(double attackPower) {
) \1 Q9 O! |5 M5 [" d; x: w! { - this.attackPower = attackPower;6 y- W2 r1 t# S9 A# K
- }
% B: P" n% `. | - }
" n; W, D: s: \5 S, Q0 ?* a0 D
Скопировать код
4 z+ r+ ]& G! V3 oШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.8 k' l. f' T2 y# _ A* E9 J
: l, H1 D* T/ f. D# m3 W8 \& ~
- // Пакет org.l2jmobius.gameserver.model.battle
p# B* L1 d) a7 z5 W( v$ ^) I - package org.l2jmobius.gameserver.model.battle;
9 j5 K( {% ?- t0 u) r% |7 | B% Q
: m2 p! \( o3 ~& Y2 d- D- import org.l2jmobius.gameserver.model.actor.Monster;& l: R) A3 V( @9 \* q1 J
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState; I$ h- ]* V, s% K+ C8 Q j
- import org.l2jmobius.gameserver.model.actor.state.FinalState;
, k" x4 }1 X& E( I9 [
/ W: d8 G" B! A5 s- public class BattleSimulation {
4 c/ U/ m3 Y5 N* ` - public static void main(String[] args) {( @1 J/ e2 A7 {9 w Z8 U0 h- W
- // Создаем монстра с начальной атакой
4 W% _. o5 v. S" E5 v( A - Monster monster = new Monster("Дракон", 100);) g2 R" i( ^% s/ o! p Y0 \: u/ }
- + ?; k, @# p& `; O3 E x
- // Начальная фаза
/ l; a0 e; e% i7 ? - monster.executeState();
( Z |; E& Z3 C6 e
4 ^" {% {4 p0 d3 L# O, r# a- // Переход в агрессивную фазу: H8 m; W6 y1 O. r: h
- monster.setState(new AggressiveState());/ l5 L% d' [) ^
- monster.executeState();% l( ?% G# W/ X5 x
- , t6 a8 n# j' m7 g2 s/ L
- // Финальная фаза
' h0 S1 ?& E1 x4 v3 h1 N" g, ? - monster.setState(new FinalState());+ S# e$ i/ k$ k+ U8 j1 @
- monster.executeState();5 }) Q4 m* X5 A: |& ?9 S
- }
" a0 m& \5 G5 ^6 b: c; ~+ z7 @! j0 c - }
( S* {6 m, u3 ~
Скопировать код
3 x# u- u* f0 s MКомментарии по структуре пакетов и классов:
+ c9 M1 m" L6 e6 M+ a9 ]- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.8 z4 w5 a0 Y8 O: T$ F$ _7 @
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.9 Y0 J1 r w) I# G
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!8 b- L6 i7 G+ l
5 V7 q4 p0 v' s
( [8 z* m6 }( L+ d
% `- {4 P( I. `4 K4 G
# O$ X* A$ r+ H' C9 ~( C- _; K
4 ?9 [0 ]. I! |, R5 z" P3 z: N) a
# m( j% Q& M) C; R( d- Z- g& @+ b( q1 B; c
; v3 A& b$ o( w9 Y! K) ]8 Q }& b4 O: C( ~2 }# c2 ?
, [" F0 q4 H7 b0 Y, y/ `2 r, V$ F/ q8 \( U4 m
* b# ]$ X8 L' c) i; ^
# `8 G' ]2 G" `5 h8 r& f9 y |