Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 7 X& w; A4 V6 `0 w, K( c' M
5 T( _7 u* x+ Q$ uЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.4 O+ w2 t5 S z( n0 }7 z
4 T7 ~. o5 y; y8 a7 d3 w j
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.1 l- r" r2 g8 e( A
3 C) o, h$ h+ K" Z/ v
- // Пакет для состояний монстра- i+ o5 a1 i& k9 _# j0 I9 s
- package org.l2jmobius.gameserver.model.actor.state;# `' o! E, { h# w' F
# b0 b) R! Z( T C7 U/ n- // Интерфейс, представляющий состояния монстра
; [ q6 e# X7 E' C/ A t- p - public interface MonsterState {
. C% Q4 t# Y$ L5 } - void handleState(Monster monster);# d1 V- |8 l m0 b- n
- }5 E6 a Y( |8 R
Скопировать код
0 |% e3 `* Z: K+ PШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. . O. |7 ]3 C e! h- j
$ F z4 w& t' u
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.1 F$ D, N2 k3 }$ ~3 h7 P( Y: o; {
& V% `- o' a6 y3 `Класс для начального состояния монстра:7 ^/ G% W# K( ~& u
- // Пакет org.l2jmobius.gameserver.model.actor.state3 _1 s! V7 ?. Y) |6 \# ^9 h
- package org.l2jmobius.gameserver.model.actor.state;
4 ?, V6 d/ b% c7 P* v
) I- ] K# S3 p- import org.l2jmobius.gameserver.model.actor.Monster;
( ]7 y a9 ~' H6 ]! L - 2 x1 ~0 y) k% d+ y
- public class InitialState implements MonsterState {
' i6 D) u4 O: D1 `8 G8 f' M) c3 m - @Override
2 D% D- R b* i& ~ - public void handleState(Monster monster) {
/ V" `+ O4 Q, @ - // Начальная фаза боя
5 M! m- V3 c' h+ v& Y/ ]1 {& e - System.out.println(monster.getName() + " начинает бой с обычной атакой.");+ L+ ]. Y+ t* G( E3 ?- K" x
- }- e5 j) s0 X+ E9 P
- }
7 R5 p$ J' P# X1 t# C
Скопировать код Класс для агрессивного состояния монстра:
a$ M( j! G9 R6 C- // Пакет org.l2jmobius.gameserver.model.actor.state
4 V. M- p- A" P2 U8 m# ?) L - package org.l2jmobius.gameserver.model.actor.state;
9 M; I: d( N6 D9 G; y$ s
) F1 H2 K! v0 D# o. g: _$ p/ \- import org.l2jmobius.gameserver.model.actor.Monster;
) p; V2 a5 ^2 c# t B4 ]# l - ( @. t, T0 A5 [- q6 l" Q: p
- public class AggressiveState implements MonsterState {
4 k" D; S; `9 d$ A5 ~% Q4 x - @Override
6 H& s- T/ L$ m4 D7 p( w) f - public void handleState(Monster monster) {: H5 f. p! S6 s
- // Агрессивная фаза боя
0 A% S4 n) V6 i/ N; X - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
# X/ f F& d; _& U* E, F$ L9 L - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки$ b: T- i* U0 w! V& Z$ x
- }. t2 Z6 N5 ^1 z7 C5 K( C) W0 n
- }8 t1 h: g( r1 b+ R* g8 Z
Скопировать код Класс для финального состояния монстра:
9 m0 O/ g X6 ^! I- // Пакет org.l2jmobius.gameserver.model.actor.state# [ B2 X' ^1 V- z8 X1 W8 Q9 C! R
- package org.l2jmobius.gameserver.model.actor.state;
$ u" Q5 F* H6 w' Z! |- u
4 B( r0 Z+ X; o. @& o% A7 f4 l- import org.l2jmobius.gameserver.model.actor.Monster;2 s; q- M2 L1 G. e! m9 A* g4 F
% S. ]2 x/ [; i6 B" {- public class FinalState implements MonsterState {
3 t; u' L% L, q - @Override6 s, p9 Y7 |, \# e2 x
- public void handleState(Monster monster) {- l6 B4 m# I7 r
- // Финальная фаза боя& p7 Z$ i3 r( z9 r7 R9 ]5 W$ S
- System.out.println(monster.getName() + " готовится к финальной атаке!");
w$ N/ {1 H* j7 Q' e2 r2 Y - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки( {/ d, g7 D! p; U! w
- }# _( r6 l% ^5 G- V- [/ d$ Z
- }' {$ f4 g6 k- v
Скопировать код
: W. X$ F. @, T6 X" PШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.' I* g) ` Y5 B
- // Пакет org.l2jmobius.gameserver.model.actor
M/ Q" T s+ r4 N! B" v - package org.l2jmobius.gameserver.model.actor;0 ]5 A6 ~7 X, v2 y+ y }
- ' \/ ?9 ~# s. M7 X6 G, I
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
6 }' p, {' V% I - import org.l2jmobius.gameserver.model.actor.state.InitialState;
! N1 t: U# G8 s7 P
. C7 K1 r. `8 b, l7 J- public class Monster extends Creature {! _# U9 Y2 K% ?+ Y/ }& _# k
- private String name;7 w8 p# V9 {! F n4 w8 B9 Y& I
- private double attackPower;
0 W8 t. ?' x3 H: o q/ `( O* |- _ - private MonsterState state; // Текущее состояние монстра! D3 g* ]7 l+ l/ Z( v: x
/ w, X0 L( `3 R/ p. h* c- // Конструктор монстра; \7 `3 K e( b6 A% h
- public Monster(String name, double attackPower) {& d) m( M* X$ Z
- this.name = name;
: W( a. [! u5 K I - this.attackPower = attackPower;
# T L% f( y" R( I& ` - this.state = new InitialState(); // Устанавливаем начальное состояние
' C6 Q/ r3 w5 z' u/ q2 S$ s5 L" m - }
! \, D/ @& n3 G5 u
% [8 Q& ?9 M @! w- // Метод для смены состояния
* P9 l4 U+ \+ F - public void setState(MonsterState newState) {9 A; F$ V. `0 z2 A, |4 u9 Q' M
- this.state = newState;
9 {3 m! [9 p1 P" U0 ?5 B* `3 ] - }
1 G6 [3 f7 n9 O+ x/ x+ X - ( ~: u' k) \, i$ j7 C
- // Выполнение действий на основе текущего состояния
% L/ m: W& v, [* y: s, A! U - public void executeState() {6 i! e, f+ U q- \. b; ~2 {
- state.handleState(this);3 T2 } m1 H( N9 @
- }
0 B4 T; Q' o8 o; q$ i
* W1 ~( z$ r" y, M0 J4 k* }- // Геттеры и сеттеры
1 G) R: p. [6 {9 S4 l8 j, B - public String getName() {
7 v2 ^) \, o0 R: l7 X - return name;1 q8 h- I7 B3 ^( _0 Z: s
- }; ?0 W% l3 ]! t
1 E. b6 w# `2 x/ N2 a8 a2 u! @( y- public double getAttackPower() {
% o+ T6 I1 S. Q- X - return attackPower;3 d+ Q. g& `! w! N
- } P1 P9 A) B* e5 [- n& ^+ u
~8 E6 Q! w2 c% V- public void setAttackPower(double attackPower) {1 J6 F# b6 q& I6 ~: ^' T) O: l a/ Q- i
- this.attackPower = attackPower;+ s3 u' K6 w# r. j: E$ T# Z: A* c
- }
5 f, V9 l/ X V6 g" U" {& C; g - }
) n J% l5 U, b+ }
Скопировать код
# \$ }) \% f2 m. v0 Q5 fШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
6 s$ F/ Z$ [! m, N5 x8 D8 U- m! y4 a% z% o5 O9 d% A+ D
- // Пакет org.l2jmobius.gameserver.model.battle% G. [; Q9 X7 |- p' R
- package org.l2jmobius.gameserver.model.battle;
$ W$ h/ ?, S6 y" l+ G2 l
* ^. P1 X8 U a; V9 t8 j- import org.l2jmobius.gameserver.model.actor.Monster;! F; G+ v( d6 T) A
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
; O7 l- b' ~. ~ - import org.l2jmobius.gameserver.model.actor.state.FinalState;
% M( t7 m9 R3 n) ~, p6 R5 L - 0 u! M' {3 X; a; Y) o% h
- public class BattleSimulation {
) S$ x: M! [: A( t' N3 t* P! W6 ] - public static void main(String[] args) {
2 L n9 O: w9 _5 y3 w8 Z - // Создаем монстра с начальной атакой
$ t: P4 r# p+ X - Monster monster = new Monster("Дракон", 100);
* f- |, t) V3 } - 6 b, A; D) W6 t0 g+ ~' d9 A
- // Начальная фаза
# k; r! J6 a) F - monster.executeState();# J9 R2 W. k$ g
# Q' |1 n+ _5 h8 L9 x2 e# V+ W- // Переход в агрессивную фазу
" t* }7 A& y9 O+ R d$ K3 v - monster.setState(new AggressiveState());0 [) ]3 ?6 b Z$ M$ r
- monster.executeState();
5 I# w; u+ n' A3 H% D: \! J: Y5 H
, W! Z8 s. V! c9 N, r Q o4 {2 M- // Финальная фаза
, B/ `( l$ x4 f/ L/ R# L2 K. b - monster.setState(new FinalState());# b% s$ \" ~+ L a
- monster.executeState();
0 O8 t7 f1 i5 G1 s& r - }
: P F; ~+ s$ i5 q! X P$ B - }
6 [ `8 n2 h5 h% ^; A' I1 Z
Скопировать код X8 y S( B) S+ D) Z
Комментарии по структуре пакетов и классов:- P& a- ? Y( `" F
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
u7 O$ g1 ~( ~0 n2 S3 [ ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
$ `* t, F. U9 r/ `Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!7 P% J8 J" g0 N' K0 `& Z
# E! p, }. `. f( [, j; R8 k
/ E N) U# G8 \# C7 Z3 S- |
) {$ [0 d, P7 e+ r
! S% y; b/ t0 j1 X& F
/ n: J ]% i9 K, d0 @. Y+ P% v- w+ F( Y# L
$ L8 b8 T) h' v; j4 ?
0 O+ P; W" A- E L: C
2 L/ h$ r* {1 f* c. m! f0 `
" z& h# J4 k/ n5 S) `! a
: P2 _8 z: g! {* x
9 a9 L) |; R+ ]4 l2 M
" g9 @9 P4 b: ?: a5 m! q- {" M) \" c( ]5 P$ n8 C
|