Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). & Y/ w5 q& ~+ @; i2 @
/ l% O6 X+ @6 n: ]0 G7 O0 Q% ~Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
9 A2 Z2 i. T9 L$ ~' O! y" _2 h+ s2 O4 g! _
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.! o3 Q; K% _$ I# l2 U* o
# k" P4 Q) Y7 @" I
- // Пакет для состояний монстра
6 r1 t& [ G V9 \7 m - package org.l2jmobius.gameserver.model.actor.state;
4 E1 Z7 u2 j. n5 W. x
& w& C4 `' H. K- // Интерфейс, представляющий состояния монстра4 ]- y$ v( Q0 E+ v
- public interface MonsterState {
8 u& a3 _% F) `+ ~( F r - void handleState(Monster monster);
1 @- F+ A+ L; L, W - }& G. h, x3 q" m' I4 [
Скопировать код
* [( @" V& B# S; ^! H: q; wШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. " P& F1 `* f2 u
3 I z% F: T$ h1 d% s9 D8 ~! iЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя., n0 E, {$ ?- C" {! i, j% e
0 y3 B( W: R, y* {+ C# e" w! T- L% q
Класс для начального состояния монстра:! q9 R! f0 R) ^& x
- // Пакет org.l2jmobius.gameserver.model.actor.state) X7 [+ _' i/ @( {* y
- package org.l2jmobius.gameserver.model.actor.state;
" n# I! R0 a! W' l - : m8 ]* T! t: {0 J1 {8 ]0 a% \8 d
- import org.l2jmobius.gameserver.model.actor.Monster;# X% m) E5 I9 _, R
- 3 ]/ d5 I( K' v( u& [6 ]% U1 t
- public class InitialState implements MonsterState {
# k d# q, H h- f - @Override
5 t" U' O, y; p% O ^. g# R+ b J) M - public void handleState(Monster monster) {! \& ?, [: V" v+ r# g$ A0 [
- // Начальная фаза боя) g6 u* h: r$ J9 e6 w6 W1 \2 d, c$ ^
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");
( A) E% R% a) g9 R1 H - }# c4 Z' X& V$ _+ u# y2 w
- }
& ~/ W. ~. S+ T; K9 |5 Z! E* U
Скопировать код Класс для агрессивного состояния монстра: O- z/ f8 O" U8 ]
- // Пакет org.l2jmobius.gameserver.model.actor.state" N2 u7 a- b; w0 B0 Z. e! Z
- package org.l2jmobius.gameserver.model.actor.state;
) a% S8 Z2 w+ L) z: r7 w - 4 r& R$ O) w9 x# \
- import org.l2jmobius.gameserver.model.actor.Monster;, i1 }- j& t# j& v- [
3 U, B- U, o4 m& h: E4 _: ~* ?- public class AggressiveState implements MonsterState {& y# x2 p8 {( a: C+ R
- @Override
|/ a8 |3 F" a* K2 U: ] - public void handleState(Monster monster) {
, ?$ o. `8 T5 D! M3 m - // Агрессивная фаза боя
9 s1 t/ ?/ |+ k* }4 E, y - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
. x4 h0 y. i: m - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
, o( p3 U2 ]; G) G& } - }
/ P, r, {# ]% W9 J9 @5 B# w - }
2 Z' H( V# U+ n
Скопировать код Класс для финального состояния монстра:" a9 B# H7 J/ J1 }) o% Z/ c
- // Пакет org.l2jmobius.gameserver.model.actor.state& o% \, b1 S" Y" o9 s$ [
- package org.l2jmobius.gameserver.model.actor.state;$ s+ l f# }: {8 x# A8 s
- % @1 ~5 ?! I5 ?4 f9 n7 E
- import org.l2jmobius.gameserver.model.actor.Monster;
) p! i) M) P5 ^: ^) K2 B - 6 E+ Z; x* k5 M- {: D
- public class FinalState implements MonsterState {6 d1 ?! `: e2 M F& J
- @Override
( J& B8 g, k/ A0 R) x - public void handleState(Monster monster) {' P& _* Q7 g7 E/ P0 E- j/ P
- // Финальная фаза боя7 V @0 }9 a S; l3 u! H
- System.out.println(monster.getName() + " готовится к финальной атаке!");7 I8 w8 F4 p5 N- S( Z% P
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки- l" V- j. C( P# c) y/ v; `8 B
- }
$ m* L! v- X% V; P3 J/ W+ E - }
. h# \) h. z6 y4 {3 H
Скопировать код
& ^( i# S' V e$ v' m* G% A8 O( k) ^Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
) @! M# E1 y7 J. ]1 d4 c; L" Y- // Пакет org.l2jmobius.gameserver.model.actor
9 [, c0 O3 m- h$ i* _( G$ H' \0 q - package org.l2jmobius.gameserver.model.actor;7 G# H: R. \2 P% t% E4 g
- % q- H5 I; |8 b
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
k% v& `) P/ q3 g) E - import org.l2jmobius.gameserver.model.actor.state.InitialState;
8 q) z( u& p$ v
" d" H: B9 h m/ a. f- public class Monster extends Creature {
: B; U3 W! `- w8 ]4 Q - private String name;3 U. a1 E# u m* r. Y. G
- private double attackPower;2 o9 T* Y; l& z1 S
- private MonsterState state; // Текущее состояние монстра6 G7 t0 F# C) m0 J. J. {
0 ^3 ?! E0 {# k" q! N* a7 z2 g. z- // Конструктор монстра
# v6 L2 \5 v L. k) j3 d, k - public Monster(String name, double attackPower) {* p$ z; D& G/ p
- this.name = name;
* b6 L8 a3 ~# D' U& H5 q- k" t - this.attackPower = attackPower;
$ @# L7 ^' b% T2 @9 Y - this.state = new InitialState(); // Устанавливаем начальное состояние
' m, Z$ v9 r- a, F - }- q; h# s4 p& b [7 @1 s6 C( ]+ h" b O
- . {* ~$ s/ r @) g; O4 O+ U; E3 \
- // Метод для смены состояния
0 \2 n" I8 z) y" Z- O* l" C - public void setState(MonsterState newState) {
S0 E, |" I4 ]( |. [# h" h" R2 ]* K - this.state = newState;! H" M5 `+ S2 J" {
- }3 L3 R, Q: u2 s& U2 N1 {! x5 F, f, J
- 7 b, G6 g+ c& b M; {! Y, e
- // Выполнение действий на основе текущего состояния; V. ^9 V" ?5 V/ E. U, J
- public void executeState() {
8 M6 G( }4 k5 Y7 Y7 i* V1 y$ \ - state.handleState(this);$ q( ~$ h+ Q( y; }& t) G0 l3 [
- }
) ~) j: U6 l2 a7 V
}8 {1 ?3 A+ Z: M- T' j' ]- // Геттеры и сеттеры7 e& Q+ l7 C# E, X, \
- public String getName() {
% G# \8 F& m7 @: |5 ~ - return name;% N9 U, j) N0 J2 K
- }4 f! `# `6 @9 L/ l- h
- + p! o7 i$ M, Z$ ^; E9 M
- public double getAttackPower() {
2 j, d J7 ^# G6 f' ^( Q1 s* b - return attackPower;
; M3 Q$ ]4 z: _ - }
6 _8 n8 h3 j6 T1 Z) a$ J
& [# }/ u/ x# Z. }. S1 m; V4 C3 o- public void setAttackPower(double attackPower) {
; \4 X$ N( |* \$ |6 z - this.attackPower = attackPower;6 Y0 f+ {9 d6 e2 @
- }7 D5 \1 f2 X' f& w
- }& P8 @/ H- H4 Q6 J0 w
Скопировать код
& J+ X9 |$ k. k8 hШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
* L- l j% s7 R# l
& A" n0 D$ g4 V4 F( @- // Пакет org.l2jmobius.gameserver.model.battle
+ i0 r; Q6 q1 M" t9 p0 b. ~$ G - package org.l2jmobius.gameserver.model.battle;. V' ]6 p0 H% l3 {/ T
& q8 x& U0 _+ g1 i1 n- import org.l2jmobius.gameserver.model.actor.Monster;. Y, p! p( c- O8 \
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;: e. @* d3 g8 K" E8 Q1 H1 [
- import org.l2jmobius.gameserver.model.actor.state.FinalState;
. a8 f" P B- u) U# j3 B1 q, z
8 h" K z0 p6 q- public class BattleSimulation { h& t9 k4 N- O5 T C; }
- public static void main(String[] args) {9 ` K1 b# k2 ?! N+ E$ |( E
- // Создаем монстра с начальной атакой
" R( U% G, v1 p8 q4 ^9 e" x6 B - Monster monster = new Monster("Дракон", 100);% p# @7 O# ~% P* X8 I$ A8 h" ?! @
* d* Y" m7 L4 v7 ~( r6 w- // Начальная фаза, l: o6 y4 z4 s; Y, G' y* x' V
- monster.executeState();
2 M% e& ^' ^; T# @% T. E - 1 H, d2 Q. n3 s' |; K# _
- // Переход в агрессивную фазу9 ]7 P% @$ t, k( Z h( f {9 K# e
- monster.setState(new AggressiveState());
! `& c5 a2 e- ^6 M2 O - monster.executeState();" ?1 L8 X$ H/ R0 M; p, Q9 x
: q# i0 i5 V5 [$ l' E- // Финальная фаза6 m" V3 ~- J- C1 L- ^
- monster.setState(new FinalState());
8 {/ S. S- i, M+ ^0 q0 r - monster.executeState();4 H9 e8 Z: F& R i0 o/ h
- }
& Z$ T8 j5 P6 D - }
7 y6 L) x! Y7 H6 C. [1 o2 d
Скопировать код
J9 {* F* G8 n- r s u- XКомментарии по структуре пакетов и классов:) K ]: x3 [* B% [+ y
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.. a7 f7 N0 o$ o( N/ E
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.+ H: t$ T$ q4 d. E0 Q
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
6 `% V$ e9 n* V4 t1 D
. q1 d7 Y0 L9 _! m0 G
4 o+ O; `1 U. |
( ?+ V5 y) V1 T6 [7 s; h
0 Z* ^& h/ d5 ~
" U: u) ~, l# V: Y1 m1 }! r! h. f" a% H9 v+ d! g+ r
9 o6 \% {7 l, _' e! n+ L
# F, a( H; u& p
O. x' ^, Y$ t k8 U# {" H! A5 f; z0 G9 n7 [
; d: a! v+ |: W' L4 g7 |+ w' W. s/ O# {9 o( ~/ e
' t7 j/ P! r S) N8 l
6 |3 i5 _" k+ p
|