Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
o2 ^0 Q8 Z6 R; V1 \" J/ |# {. G- g( ?0 }+ w1 V3 u3 T
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
" M- P# N" X' {& b) E( c9 E* P
) Z- j+ H5 ]/ Z$ {- B, M, ]; e c" V. wШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
! Y* W9 @* f4 K c
; b2 j9 X4 @$ l8 n0 x- // Пакет для состояний монстра
% t4 ?- s' S% s3 s" P$ L0 N - package org.l2jmobius.gameserver.model.actor.state;0 ~0 |4 w7 m9 |3 C2 I- ?2 K U
- ; r$ k) ~% `- ?$ m
- // Интерфейс, представляющий состояния монстра
( s/ M1 S/ s: _ - public interface MonsterState {
' C! W$ e3 [& N: g3 j - void handleState(Monster monster);
' ^7 B6 A( f8 K! f8 n3 L - }9 ]/ _% q$ G# t5 \% N
Скопировать код / c$ f) A: b+ `+ E
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
0 d. C% z. E& [- q/ f" y& |% Y m6 Q! v, l& k
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
9 J9 t/ ]1 q6 [/ W- b! y- m8 ]$ k2 B5 }, H
Класс для начального состояния монстра:
% K# ?" D5 _4 n' o- // Пакет org.l2jmobius.gameserver.model.actor.state; x+ z- J9 Q0 A/ R, y+ z
- package org.l2jmobius.gameserver.model.actor.state;
% N) w5 E9 w: r* F$ o( I# j
: n9 J. m- U" M" | m- import org.l2jmobius.gameserver.model.actor.Monster;
& U4 M8 A: @. x/ _: s& @0 z - 6 H" V( G7 D( s
- public class InitialState implements MonsterState {
7 e- s: c' M2 n% O! b# ?) E - @Override
* {/ `( d. w }2 A - public void handleState(Monster monster) {
$ H Y3 Z1 B; ~) G. [- f. v- a - // Начальная фаза боя/ Q) N1 `/ R$ z3 ~& ^) m
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");# p! ]/ x% \8 H+ [8 C
- }
I, ?! K2 h" g g9 u1 G9 ^ - }( W1 D: I) @' q! ]% [" q4 N
Скопировать код Класс для агрессивного состояния монстра:
# _) I+ P& ^. ]! x Z; p% Y- // Пакет org.l2jmobius.gameserver.model.actor.state, G, k9 H& Y* O) O/ I- U
- package org.l2jmobius.gameserver.model.actor.state;! c* P, `3 d' j( H( q
- 8 ? t! C, C2 M: E7 g* `
- import org.l2jmobius.gameserver.model.actor.Monster;% c, H% } Z1 i/ N, I" d7 L
- 9 f ?7 W, c/ Y# Q% v! U* q
- public class AggressiveState implements MonsterState {
- b& ~9 U. ^' f* z2 j+ u# n0 b+ K1 K - @Override8 K- l9 h# _1 s* y9 j: O0 O
- public void handleState(Monster monster) {
' G2 q8 @0 q `% I; Z - // Агрессивная фаза боя5 J! ]) [) Z: T8 i
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");1 S* `0 n! T: n1 Z- h' @! T
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки6 s% y2 u; l2 H0 s
- }. l! o8 ?, K7 i v3 O! E* N1 `, W
- }
. @: y, v( u" }/ |/ E/ `
Скопировать код Класс для финального состояния монстра:
, A! d( E8 ~0 }9 K3 v, D% i! x- // Пакет org.l2jmobius.gameserver.model.actor.state
, b) M% J7 {2 [ - package org.l2jmobius.gameserver.model.actor.state;: [+ ~/ P9 J, k/ m+ q
" r0 Q; @) t& l% L* |% q5 w* R! J- import org.l2jmobius.gameserver.model.actor.Monster;4 y+ m# o1 V. r6 e. w9 K
- $ M2 o" O' F: S- M- M( s# k6 y
- public class FinalState implements MonsterState {' E* x" r3 C) f
- @Override6 p. B" \2 H" q) f6 _! X
- public void handleState(Monster monster) {
$ b( n! `& _2 J, h5 r - // Финальная фаза боя
- k( E6 `, t1 }* L/ V. }$ d, Y- g - System.out.println(monster.getName() + " готовится к финальной атаке!");1 S' o4 D T* F. L; V
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки" D3 z2 Y' q2 U
- }
$ q' ]; K V' r - }2 l6 |3 V* m3 m9 L6 ]$ A
Скопировать код
' j9 B# h9 _# X; WШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.! Z% D0 P5 U) q% r; P
- // Пакет org.l2jmobius.gameserver.model.actor
. R8 X+ i2 U/ M* x/ R7 @2 b - package org.l2jmobius.gameserver.model.actor;
; w5 [9 n9 c2 J - , k# G3 a$ U+ `9 X; ^# M% _1 S7 f! Q
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
# U4 i3 Y2 i- R- i8 D I/ F1 b - import org.l2jmobius.gameserver.model.actor.state.InitialState;
) K* P% B# K, O! I
6 U0 e1 C( h( j1 p/ O. f7 r- o- ]( F- public class Monster extends Creature {
: {. `1 I0 G1 j+ u - private String name;1 x9 f+ I2 o& V$ P! }9 I
- private double attackPower;
0 A5 y! E# }6 S- N/ i - private MonsterState state; // Текущее состояние монстра
! q n, p6 }7 u6 c* n
7 p1 Y) m8 [1 _' `- // Конструктор монстра- v* j9 Q* `: p& S
- public Monster(String name, double attackPower) {
; s6 H+ ^( c# [ - this.name = name;
4 s; O9 g. {; j7 x" t: P& ] - this.attackPower = attackPower;
* i8 T, Y* |5 X2 S - this.state = new InitialState(); // Устанавливаем начальное состояние, M; X: v5 g& L5 V/ q' m2 Z* N7 }. f
- }
& N6 F1 K& y# }- }( W - ( C7 v7 J5 B4 f0 K
- // Метод для смены состояния
: O" z7 Q- \8 B: i+ x" G+ ]3 S/ I - public void setState(MonsterState newState) {
# g. W2 h9 D# K. Y1 l* h3 v - this.state = newState;
D5 d( ~; x' T8 @ - }
+ P! o$ K9 P6 G: b* }; J
" O- y4 f. m; _- // Выполнение действий на основе текущего состояния
( ~: M* d1 K1 V( M - public void executeState() {
% }: W( V, h/ O1 i' U - state.handleState(this);
" c7 n& u$ N& U# [- E3 H - }
. w) s) |, I" ^/ ?) A% k - 1 u& f% U( c) Q2 u K% T- D
- // Геттеры и сеттеры }$ ^% a: J5 u2 j/ q
- public String getName() {( q7 w: {: h: z% r, n- X
- return name;8 e/ s2 w5 D* [+ \$ n8 `3 Y
- }
! K7 r) _& }0 Z3 u' \5 O4 A
& y, ~& H) U' `. T+ R) S; i- public double getAttackPower() {' i1 E& |8 Y. [5 Z7 q. V6 c1 }
- return attackPower;! r+ J% }: w" _
- }
- h' ]: F1 p Z- Z+ |: V
" [, K- ?8 u' m8 J% g/ w' o& B1 @- public void setAttackPower(double attackPower) {9 k" ~1 H. S+ E6 I6 C) m
- this.attackPower = attackPower;
3 w" J1 w0 ]% i& J - }: f+ a* G$ T" a$ |( D9 a# j
- }
+ F+ X" e8 F+ W$ r6 ?* T! D
Скопировать код
& Q2 n& Z+ v v# g2 b( SШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.& r `# v( ~& ~5 ?. u, r
8 C/ L% N/ W6 I; U* M9 a" Z
- // Пакет org.l2jmobius.gameserver.model.battle- ~3 F6 S. P: h1 H t2 U
- package org.l2jmobius.gameserver.model.battle;
3 r+ N7 [5 B7 R, Q& i
$ ~: O$ Y/ s# H1 L. Y: p G4 |- import org.l2jmobius.gameserver.model.actor.Monster;' A" Q$ o# \3 M5 C; b3 I
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
# b, _$ e' j4 s7 v - import org.l2jmobius.gameserver.model.actor.state.FinalState;3 S) a- Z4 S! J6 c3 b* s
0 p- O( m2 L8 b- L! v. E4 b- public class BattleSimulation {
, H' z5 p- U5 F: l+ {# w& H - public static void main(String[] args) {
9 _5 p* ?# T: H4 @7 U, i( W% ]1 b - // Создаем монстра с начальной атакой
3 c# P: K) F1 n& |/ ~' ~% `- P% H - Monster monster = new Monster("Дракон", 100);
2 J3 C0 B% D7 b
& K& v# d1 U0 q5 ~- // Начальная фаза! a1 b C' i& e4 A4 L9 ]2 _4 V* `
- monster.executeState();4 q# ` g. }7 p7 G" w3 g
- - X1 H: Z$ }. O
- // Переход в агрессивную фазу2 Z6 r8 W6 b: Q3 I* _8 ]
- monster.setState(new AggressiveState());
! f# j# G. U% Z+ K - monster.executeState();/ A$ h7 Y# e8 w, _
/ ?6 {" g+ Y8 U1 C" @- // Финальная фаза
; r! A( m, s7 V8 `3 e) f$ ?$ T - monster.setState(new FinalState());% d9 G, f6 h% \
- monster.executeState();
6 }; S9 D$ S5 K7 [: p - }' W) R& ]- |3 y
- }" ]4 y8 a, g* P& ^9 o
Скопировать код
* o# ^: _4 X: w; C, L$ BКомментарии по структуре пакетов и классов:4 `1 \4 k! }9 W Z
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
5 f2 }3 L# w, O0 @: I9 m ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
. q" m }0 X9 G% H. VЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!5 i% d$ s0 B0 o* ` s `9 v* s, E( v
3 a9 v6 B& p/ D. i. ]
& }, M& C( @- p; i0 D
3 F- [9 j& d" k! M$ k3 {" L1 f, B. k6 \* N! |5 P9 i2 s8 |, X9 }
% T; L5 _ \0 g h5 [/ {, W: K
7 v, @# a# c5 Q! |) f; I' @6 c
$ y6 k. K0 `- W! H# _
6 t, G! q1 X# j. y6 z
. j r" W; L# F- ~
% h: a4 f! e7 S
" D y) a( x% Y. F# d! h c$ k0 W! ]; ` z, ^. R) ~
( n C7 X) A, X$ e
2 Q4 u; F# c9 P! \ |