Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
3 \/ |: C r' c# \2 B
# \8 r" g" j6 B- _Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
- i3 L6 n" Y7 R# q; F1 `
2 b& H- L+ k2 ^6 R) uШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.5 b; t* E. I7 g4 {9 O; J' j
5 @, R2 X1 l& r7 h' d8 w& ?
- // Пакет для состояний монстра
, S" r6 s3 s* [ - package org.l2jmobius.gameserver.model.actor.state;
% @0 x# U4 \5 a3 D - . I. r' u3 \! S; {6 D1 t3 z
- // Интерфейс, представляющий состояния монстра
/ L% i1 [& n7 S* _; T, N - public interface MonsterState {2 L0 y* E: x7 j5 \0 m
- void handleState(Monster monster);" a% v, a) C( d- R
- }' q! l/ s+ e. Q: a
Скопировать код
' i. c1 t4 V* Q0 H" MШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
! i# P6 {! `: k6 V) D9 b! E+ L# {# Q
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
4 a$ o v& i9 M0 l/ J
8 b4 q0 q' I! F: \Класс для начального состояния монстра:
) y' G8 ?. h0 c/ g9 I% | n; N& P- // Пакет org.l2jmobius.gameserver.model.actor.state3 E$ \: x$ }5 J, m& U% a- b
- package org.l2jmobius.gameserver.model.actor.state;" U. k- D: F- t% V
- - U' C0 L/ _7 n* B- { e O
- import org.l2jmobius.gameserver.model.actor.Monster;
3 W% O6 ?5 E7 r% \) Q4 Z - 8 o: U/ ~2 ]- _/ z5 W0 H: S$ u
- public class InitialState implements MonsterState {# b: X. C% d$ E( H5 O6 Z* e0 H3 [/ `
- @Override) ]# R8 c- v2 g/ v9 z4 {, b# Z# T4 K
- public void handleState(Monster monster) {
T9 P& X" I' N3 _ - // Начальная фаза боя7 d0 ^0 @6 w1 j4 o, L8 Q, Y/ S
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");
& x$ a- q- o" Z8 s9 T/ M - }) }$ w' ^8 t& B% J' |7 J
- }
0 `* j R( h' L$ V' F! j# y) D: Z5 [6 P
Скопировать код Класс для агрессивного состояния монстра:
; L$ d2 N% n( f& Y' B" o0 j; o9 J- // Пакет org.l2jmobius.gameserver.model.actor.state
, q- M8 ?; m+ d - package org.l2jmobius.gameserver.model.actor.state; h: _5 j, i0 Y, C3 D; v D
% s' w4 L& Q* X2 \- import org.l2jmobius.gameserver.model.actor.Monster;3 C. \& h3 J0 ]+ P9 n, M' I
- 9 q( `0 m7 A; O% L8 K
- public class AggressiveState implements MonsterState {
1 U9 X4 I- K* @% o4 i' K0 t5 c" A2 w, Q - @Override
3 |4 J, F! N" w2 n7 P9 P' E% Q - public void handleState(Monster monster) {% _6 h" Z$ n! c( p) D! `
- // Агрессивная фаза боя1 W2 q- D5 w7 h, x! w, r
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
; e1 H& L# x2 }5 i8 O0 m, i - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
# G- M6 F; F% b, O8 y4 h - }
, Q% R' |. u0 ~, G - }
' E+ A0 }' r U9 U! e T
Скопировать код Класс для финального состояния монстра:# B9 l m U% F6 b% [! B$ D
- // Пакет org.l2jmobius.gameserver.model.actor.state
( V# D& Q9 q$ P. {) ? - package org.l2jmobius.gameserver.model.actor.state;2 a, y4 O. G& x) j1 x* p
2 c1 a# |$ l7 b+ S2 M; g- import org.l2jmobius.gameserver.model.actor.Monster;
( @( R. n4 [( |. j( g& |
* N5 ] E" n6 [9 d0 M2 n7 k- public class FinalState implements MonsterState {0 D7 }# E$ S5 m8 u* r1 P S5 M
- @Override. c3 Y/ B4 _2 ]7 i {- e3 M. e5 G
- public void handleState(Monster monster) {. k+ ], d5 G1 W, A" K
- // Финальная фаза боя0 a; X: g. ^, K9 Z, G( P3 `6 Z5 q5 n3 F
- System.out.println(monster.getName() + " готовится к финальной атаке!");
- l6 z. ] Z( X' M" @3 p+ t/ X$ B - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки0 i3 E+ b1 t9 i" H
- }8 e8 X& v. w5 C' U
- }
7 ?; @' N+ _9 `7 u" Z* } X. e$ N
Скопировать код + S+ Y9 N& x! Z4 v& I
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
* [, J% j+ ?' u& Z- // Пакет org.l2jmobius.gameserver.model.actor
- D) o' Q" l. p" X* t) r, {* S - package org.l2jmobius.gameserver.model.actor;
9 y* G- p6 V' t n - 0 k1 o. D [2 }' |
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
' @: A u5 g" r) k - import org.l2jmobius.gameserver.model.actor.state.InitialState;
3 V# p* U* P7 K& H5 ^
' j; {8 f+ U. F& D1 c- public class Monster extends Creature {
8 K& j8 d: J9 j* N) h - private String name;
) ^# ~' s/ ]( J8 ~& j - private double attackPower;/ j0 m6 L- S. v' y; D \
- private MonsterState state; // Текущее состояние монстра
, Q9 N2 e3 _3 k8 ^ - . K! o/ t- H: N3 L3 B
- // Конструктор монстра! \* j" Q0 w7 o$ h! D
- public Monster(String name, double attackPower) {% x, I& B* z3 `# Y
- this.name = name;; h7 r2 f9 I! b$ N6 W! J
- this.attackPower = attackPower;
2 q& y* Y1 n% s. X - this.state = new InitialState(); // Устанавливаем начальное состояние
8 r' e) D9 D2 T - }
% L+ t% t* {( } L
4 q0 V4 s6 q3 \. n1 I8 E- // Метод для смены состояния
9 y0 U" M: a) S0 V/ | - public void setState(MonsterState newState) {; W9 R& q6 ]" p& x! q
- this.state = newState;5 o! k9 a/ R6 _8 L2 @# n
- }
) Y6 I& J$ y" y
: w7 U L1 m, e. s7 Q3 j; V- // Выполнение действий на основе текущего состояния9 s: D: Q- b2 s- Y; I$ c2 ^% T
- public void executeState() {
5 `0 S0 b$ l) V8 y8 ` - state.handleState(this);
& W1 D/ S7 v* Y: n* ]8 w8 u3 q - }; c4 A ?* W6 \8 X
- 1 H8 Q# ?) j- `/ U L
- // Геттеры и сеттеры7 B( t! i+ w6 s- F% ?- N
- public String getName() {
5 s0 g4 Z* b2 f2 b - return name;
1 [, i& G+ b# E. P - }3 f- d9 d! u+ C' a6 ~& A1 t
. v& o% K+ t" t/ d7 R- public double getAttackPower() {
5 ` t' r8 r% w) N# M: X - return attackPower;2 r% O1 Y# m- y$ c Y
- }; q7 y7 `* z6 C$ ?7 W; a1 g# t4 j
- 1 |6 G! _) b% U
- public void setAttackPower(double attackPower) {' f1 s: Q* A5 I6 r, C& X) m) g
- this.attackPower = attackPower;/ d" M7 q0 e8 @: p* r% p Z
- }
z; n: j3 b4 Z, o - } k/ Z$ s/ u8 g
Скопировать код 0 w3 D" q' m7 B/ Y" L
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.* h+ e. c8 w6 n$ _
+ d3 X J9 |, A# n5 m4 h6 V
- // Пакет org.l2jmobius.gameserver.model.battle
: y0 |3 K8 a; r2 Y+ B& a - package org.l2jmobius.gameserver.model.battle;
1 A' d' m2 [4 y - ) {* d1 Y' T( W
- import org.l2jmobius.gameserver.model.actor.Monster;
8 N" I& l+ Q& m. h$ N2 W/ b - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;5 n1 i4 a8 A; Y. U7 M
- import org.l2jmobius.gameserver.model.actor.state.FinalState;% B: Q q5 [2 X
- $ f9 o) d5 y# y1 ]7 H
- public class BattleSimulation {: a0 v- F5 t3 s
- public static void main(String[] args) {
+ p) x$ l! b" H) B2 m - // Создаем монстра с начальной атакой
" J5 L5 i% @& x& h& p - Monster monster = new Monster("Дракон", 100);
) | h4 Y6 s% H - ) O* M8 v6 U0 i( R3 ^
- // Начальная фаза
) Q! `; F; o. r - monster.executeState();
0 g: T2 J- Q; k, ~8 _ - " K; [' w4 ~6 h* W9 O% L: F, p- s5 M
- // Переход в агрессивную фазу
# P, ` b. U& A# s1 R" v9 n - monster.setState(new AggressiveState());. ~' a+ _# I% U5 ^2 u; {
- monster.executeState();: f& N. @/ T$ t/ d$ b# B1 K8 u
- 1 ^; _ E4 S0 Q8 n1 ^
- // Финальная фаза: P) x0 y5 R' I8 z1 a" F: L3 Q
- monster.setState(new FinalState());
9 z( q( k. v( {5 i* b - monster.executeState();+ ?' ^) r# C: }9 ~" ~+ f% [+ T
- }
. C) q! F9 i7 K) S* }2 C9 o; W& O - } L/ b4 }; i+ a
Скопировать код 3 P/ @# a, i( v$ D! u$ P! E5 t1 j2 {& o
Комментарии по структуре пакетов и классов:; ?, q8 w( b6 \! i. l
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
5 i- j, M$ o5 U- i5 ? ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
7 V6 A, F+ H a% D, ~3 z1 {Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!. `/ Z. O! f: ]) k
- e. o6 O q! |
0 ]2 G/ n/ i$ [- V& X; n; v
& R x: o0 x( J9 h+ h6 b0 ^' t: D6 n' G1 ^7 L3 _# b
4 ~0 w& V. i- l# \5 V2 y
1 r9 T- i0 S; J1 K% h
- s8 ?5 `% r4 r" o \4 f" W j5 v8 v3 s- d. W3 a1 J
3 y% X( M9 b6 T4 c; M) T
& p9 \+ H8 \5 m# N8 k0 Y- T8 k& Z* C
3 L! E+ h. R, ~6 ^2 e8 B1 Y: y; o. Q7 W7 B
$ Y+ Q' d* m. y0 K4 Q9 r
; B. i5 f5 R- q+ Y# B
: t3 d7 @( }2 K+ U |