Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). / h: a1 w& L; \; F8 y7 \/ q
2 m5 V2 n0 {4 G8 a" ]" {6 Y
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
4 S, V! y8 m; p; N" I% t1 g
+ K+ j7 K% D0 |+ Q/ wШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
4 s7 T5 j$ |4 L7 Z- E& @, H9 U, p3 I( l) g# u
- // Пакет для состояний монстра
. V6 w4 D1 i6 N2 I- ?, p4 |% s - package org.l2jmobius.gameserver.model.actor.state;
0 J. h, {- w& r; S% z. ^ - ( x' F1 [4 T2 e$ O9 V2 @% W0 p: ^
- // Интерфейс, представляющий состояния монстра
$ L& U3 J$ P8 M, M% @3 Z - public interface MonsterState {
. h* P5 D ~4 {: M% u& E - void handleState(Monster monster);1 e5 L4 Q% u: E: A2 L& W
- }; c( u) V/ q0 ] q$ B7 ` {: T
Скопировать код
/ r* M% l% x5 z& T( C0 zШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. ; M# B; ?! g ^' U
; b1 J+ b3 j' |4 ^1 _/ _5 n/ G
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.* A6 D2 [9 Z7 o5 n7 r5 p5 W M0 M
. g; }/ B& ?) Z; ZКласс для начального состояния монстра:
% O9 ^ `5 B4 g8 L9 Z/ v+ Q9 l- // Пакет org.l2jmobius.gameserver.model.actor.state
7 o. |0 Z. a' g- g# J1 ^- P6 q" g - package org.l2jmobius.gameserver.model.actor.state; J: v3 l, n% M# D* P
6 F( i7 Y+ k! h" E3 E _2 H+ a- import org.l2jmobius.gameserver.model.actor.Monster;
. ?' B D, Q, D- x - D$ j5 t4 z: M% }5 y- q4 J
- public class InitialState implements MonsterState {
; p2 N+ j' D) g; u - @Override
: ]* Q: ]4 M; N* q- Q - public void handleState(Monster monster) {; J ~( ?2 o0 w0 |' {
- // Начальная фаза боя' R* \$ L8 ~$ P1 t/ P, J. @
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");+ N. H1 m0 f$ P, E9 U% Y% U
- }
; z. d! d9 [2 ?; m# w9 x8 o - }
* k7 R# S+ y9 S. Q) I1 W
Скопировать код Класс для агрессивного состояния монстра:! k9 D, X, i I8 t" S& n% S
- // Пакет org.l2jmobius.gameserver.model.actor.state8 a: v" g- ^3 p5 G! f! D1 c# F9 D! N
- package org.l2jmobius.gameserver.model.actor.state;
2 b2 H- m& s. C/ e* R
: _3 B9 n" N+ t5 H0 h# w- import org.l2jmobius.gameserver.model.actor.Monster;
) Q$ j& ~; N" T. [
3 r6 \ d$ [% ]. i* t1 U$ i! H- public class AggressiveState implements MonsterState {, i+ ?: Q% A$ s: P3 r3 Q7 Q) x
- @Override& _/ f) g: [! {3 D, i+ @% ^+ y- f
- public void handleState(Monster monster) {; ]# n; a2 U) z
- // Агрессивная фаза боя2 z# m" l, j3 W8 u- y, ?! e6 @0 i
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");3 ]- s- J9 W* u' G" I& c$ C; ]
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
* C$ X8 g. K g/ t* \, K+ m1 e - }5 }! C! t1 J7 t) b, c! P
- }- q5 D) \8 q6 b/ P, u
Скопировать код Класс для финального состояния монстра:- E% l' M1 u2 m/ k8 ?! A% h
- // Пакет org.l2jmobius.gameserver.model.actor.state( f9 E0 V. V: |3 `* U
- package org.l2jmobius.gameserver.model.actor.state;4 X0 w- }3 v9 s; c
- ) a; }- D; u! O
- import org.l2jmobius.gameserver.model.actor.Monster;
& Y7 z+ X* Y) g7 y
" k9 _' G2 u" u" q' t- public class FinalState implements MonsterState {& M9 U. z& y/ N q2 N4 C; Z# Q
- @Override
6 G7 q8 T' t( N% A7 q: m4 _$ w - public void handleState(Monster monster) {
* V, U; I) C3 z, h2 n1 J - // Финальная фаза боя9 {* y9 A% u0 R$ Q$ ?3 }, G. z0 o
- System.out.println(monster.getName() + " готовится к финальной атаке!");: m6 ?# `/ c: F! a( f3 \0 n
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
, r+ c8 A; C+ `! G) o - }$ _8 y: v) X7 `. ^/ A: ]$ S7 L7 V
- }
9 U# E) B$ {6 D3 q3 w
Скопировать код
- F/ S# T4 j: x UШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor., y$ i6 ?1 w; P
- // Пакет org.l2jmobius.gameserver.model.actor4 t( B" t3 d* m2 t
- package org.l2jmobius.gameserver.model.actor;! W- b5 ` T$ L r/ C
4 G# U* N. z! x' V- import org.l2jmobius.gameserver.model.actor.state.MonsterState;' i5 e/ R" l$ ^
- import org.l2jmobius.gameserver.model.actor.state.InitialState;- g4 ]( u, X0 Z5 f N
; @6 A Q W" l- public class Monster extends Creature {6 U j0 o7 w N$ g5 G5 S
- private String name;+ A4 K3 W8 \ `' Q- I
- private double attackPower;
0 b* ~0 [; ]. R - private MonsterState state; // Текущее состояние монстра
$ ^. y; m d. F f+ t4 W! H/ c6 U6 u - P" s; G) M& v3 Z- g
- // Конструктор монстра% U3 q) G# u% b' g2 e5 T
- public Monster(String name, double attackPower) {5 ?$ N1 U ~; `6 B6 L0 N
- this.name = name;3 n; U* f% e' e( `0 ~5 F5 ~
- this.attackPower = attackPower;# E6 _" @0 p* U* h! X% q- v
- this.state = new InitialState(); // Устанавливаем начальное состояние g& e* n7 S4 Q2 u" N
- }' ~7 o- {9 |/ A& V4 \
- * ]4 t+ i- `- v- \- P( G6 b! F. x
- // Метод для смены состояния
7 M8 U$ C; B3 P" Z3 Y) X6 H. M - public void setState(MonsterState newState) {0 L# A; `$ T) M9 `3 H
- this.state = newState;
, Y, p/ }9 L$ c B8 I5 k2 [5 f - }( w+ N5 v% u2 W4 D, \$ x
- / u0 M6 w+ \5 `( |" a
- // Выполнение действий на основе текущего состояния
: P* u+ d9 |" m7 ~; | - public void executeState() {
( @( z4 }: F2 Q7 [7 }1 T - state.handleState(this);& @3 M( n6 X( D9 ~$ s
- }
: ?+ J; I- n5 O+ w2 ?7 Z
7 `1 Y3 v4 F, ]9 N) t' f- // Геттеры и сеттеры
8 Q8 S9 D1 z/ N2 p; W& C - public String getName() {
$ `# y: ?" P9 c - return name;" q7 i) v( I0 q3 ^ o- y
- }
! D* k% S9 n4 e4 f* a
, N/ _0 e$ ]- Z" K7 l9 C3 u7 K- public double getAttackPower() {
- k2 ^9 H" [- G7 T3 r - return attackPower;( G+ t: v6 Y8 ~4 x4 ^
- }
. V4 a$ ]' e8 B
" D( w7 H6 l) T- public void setAttackPower(double attackPower) {( Z. S) a) \' H" f9 ?
- this.attackPower = attackPower;) a5 f3 O/ F, P2 {& Q
- }
1 E& E; J# K; x3 s" a7 U - }
, a, u- ^ o0 D7 f' l$ W3 ^9 J p
Скопировать код 8 x6 m) r- i0 e$ p( J8 B2 i
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
6 j) n/ t0 J% i; S( a* N$ ]
7 h3 k' G- h1 m- // Пакет org.l2jmobius.gameserver.model.battle/ _/ o1 V4 t+ L( ~, T
- package org.l2jmobius.gameserver.model.battle;% q \- K* |2 I) ?
! C8 l6 L1 Z) b5 F* H/ p- import org.l2jmobius.gameserver.model.actor.Monster;
, t1 ~- d8 E9 X5 n3 W. P: e - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
- `5 g- G$ ?. u, `* L. {/ | - import org.l2jmobius.gameserver.model.actor.state.FinalState;9 u. j4 r/ s# y$ P
* U6 S/ q* U8 O& F* N, R- public class BattleSimulation {
0 F7 b ]+ p, i$ ] - public static void main(String[] args) {1 S5 `! K0 I7 Y$ G$ k# Z( y
- // Создаем монстра с начальной атакой
5 @% F2 R0 ~2 f; S9 _ - Monster monster = new Monster("Дракон", 100);4 |( V# [# z5 V1 T
' f6 n0 k3 N/ v+ E9 M: |' V1 O& I- // Начальная фаза
4 l% A, u g1 _ - monster.executeState();# F8 H3 H8 D3 d7 {1 k( q
+ I+ Z. J9 k) L, D. o9 T- // Переход в агрессивную фазу) X) W! C" X6 ]# G( G
- monster.setState(new AggressiveState());, J0 t4 z, C# {7 i/ X1 L9 l
- monster.executeState();
% G: A1 S3 V) q
5 p. N2 \3 _0 `- // Финальная фаза; K8 r: V' h1 p2 c9 P" h7 J- f
- monster.setState(new FinalState());
9 I9 e2 {( Q/ F$ D) [ - monster.executeState();
' m1 a7 R* K& z3 Y0 S3 ~; y - }
2 c' q" N' ^ k7 E N, ~ - }' Z! ~! i3 q# a: v2 v9 N
Скопировать код 7 C7 d+ W6 ~( m T* x1 b; f& b
Комментарии по структуре пакетов и классов:
& o" X$ L* r% ?5 F1 h9 |! s- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
( ^9 A. d5 r# J, `+ x ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
( {* P( y, J- P; N( b! c ^Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!7 Y( G. `$ I6 {% a1 `* o* v
5 B# Q3 u1 b8 b' ]+ o2 _& c' ?# u% H
, v) z* T# D7 O! Z! W/ T2 T
8 w5 ?. `5 S, c0 R. M* {5 ~0 F
9 o% w' r3 |0 l' g9 k# R& \
g& R: F" c2 f: f3 G& Q7 ]0 M/ D e3 t, J4 h. j) b
% ^6 b( D" L4 p/ k: |
1 ?$ G0 k \! l- X
3 h2 f8 e" Z. u& Q8 U5 A
% P8 P! R1 w' e/ g, h; d3 V/ D+ ], L5 s4 P
1 y6 Z% w: l4 H }5 a2 t/ f$ M* m
g, X! K5 [/ |9 }
3 _: x: U5 V, }* T( i7 U7 e0 q1 @4 P) _
|