Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). & p2 ]2 B6 r, \ \& `1 M
5 E( P" h$ Z7 c* `) M7 AЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.) ^5 ? `1 k' G
% ]# u7 U( s% @! U
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.0 C. L/ Z D( p8 ?3 J
, K* {3 y, `; N* l' I9 i4 V- // Пакет для состояний монстра& y% C# e( c, w, I) D( m
- package org.l2jmobius.gameserver.model.actor.state;
. r; R! B0 g- ~9 U4 B; ]% _ - : s* F" O& C4 q
- // Интерфейс, представляющий состояния монстра
" s. s7 F3 T6 U$ s% Y5 N1 k - public interface MonsterState {
H; _- F0 m* d& a6 Q# |4 l - void handleState(Monster monster);5 b9 S/ J# i: m) s+ N( |) E
- }
: g6 W$ \& I7 B" ]* @
Скопировать код
. x( ]2 N7 \. ]4 V' t9 b3 P" jШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
" J1 E# G! P- Q7 R
H/ a. d4 P% j4 u$ b, T( ^) KЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя./ m( J1 _7 w+ Y9 Q$ H7 A. v! p1 X! b
" {7 g, y! I7 z( R. |Класс для начального состояния монстра:
; x3 J6 B: [$ _2 ~$ b% ^- // Пакет org.l2jmobius.gameserver.model.actor.state
0 l- v- A) z7 J4 l- p' l - package org.l2jmobius.gameserver.model.actor.state;
! b: m7 J6 \+ m& O7 }5 K: b: F
$ T3 i5 |7 E- R* X. J& K- import org.l2jmobius.gameserver.model.actor.Monster;( m1 p1 K$ H4 o4 J& m. A
- 8 y; _& p% x! y/ R8 Z
- public class InitialState implements MonsterState {, V t; d5 i: o- ~' W
- @Override
( Q. r5 w. R( X - public void handleState(Monster monster) {7 J7 a" P% S( y6 j! s
- // Начальная фаза боя" K6 O8 |! j" Y# b( C% M
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");
o+ i U4 @) K" l* C' T - }
. z& U) @% s- ^# c - }9 e/ |7 g% V# f% `2 r
Скопировать код Класс для агрессивного состояния монстра:0 S8 A7 y0 w0 u2 b( U4 O- \$ U& Z" O
- // Пакет org.l2jmobius.gameserver.model.actor.state
: ]- A. u& _7 Q! f2 F8 i w( o - package org.l2jmobius.gameserver.model.actor.state;1 I# _5 r4 j' Q0 _! S7 Q
; y( U5 X/ c: U9 b9 {0 w- import org.l2jmobius.gameserver.model.actor.Monster;) x1 U7 k5 S' Y
# v0 r$ Z- A w/ _5 [+ Q- public class AggressiveState implements MonsterState {
" l" _6 ?9 }3 [- j1 W; G9 ^ - @Override
& z1 l! G0 t& F& z - public void handleState(Monster monster) {
. h6 X1 d0 T2 S" j; U. L: h) B- l" [ - // Агрессивная фаза боя
' c" N, G+ u& r# L: T) {9 n4 R+ c - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");! j' W/ K; I. M7 @/ y+ v
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
* }4 K* L4 @9 g [ - }
$ l* c4 S# S/ G: H6 k- J - }
) z! [! X( V& p1 _7 u9 }; c8 u% Q
Скопировать код Класс для финального состояния монстра:( p% ^' t& l! r! @) Z# A1 Z
- // Пакет org.l2jmobius.gameserver.model.actor.state
2 p6 ^7 }; S& G; [% e - package org.l2jmobius.gameserver.model.actor.state;& ?4 m5 U+ e2 M- f, N" l6 W
5 e2 ?7 @/ e: p1 d/ i7 m. n" m) X- import org.l2jmobius.gameserver.model.actor.Monster;! P" j8 U2 V) ^( q1 u* [7 Q d& Q5 c
- 2 ?& H, k! W* d, w2 c- h
- public class FinalState implements MonsterState {+ e; p9 o6 t% t' g2 c# @
- @Override( d9 b, v6 C& \. S, e- h
- public void handleState(Monster monster) {
2 }4 X5 t( }' Y - // Финальная фаза боя
9 P, {- D! g3 G% c; U/ _( t - System.out.println(monster.getName() + " готовится к финальной атаке!");# s" Q; Y2 \3 ~% W, H( [
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
1 e7 W5 f B- G" w3 h - }
% e1 A: v4 w4 @# l: d1 i/ X - }
5 m+ ~( H: R. @6 B- U6 L
Скопировать код
- I9 u( }: L( \ |4 S) P% v' ZШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.! {! Z7 k' e: E2 h: `
- // Пакет org.l2jmobius.gameserver.model.actor
0 F. a. {. l! Z* s6 L - package org.l2jmobius.gameserver.model.actor;
. S5 G. l \, ]; q) }8 l5 K; z, G - 4 ]# q- H: k, U8 R0 n9 _- W+ l
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;! g9 w8 a6 ]' R0 W' f
- import org.l2jmobius.gameserver.model.actor.state.InitialState;
* D4 E" z+ ?1 B
& U- d k6 H: E' M% p7 n- public class Monster extends Creature {
. u; J: _9 Q% i2 e - private String name;
8 F) B; W0 J( m6 G' d - private double attackPower;
6 L ?$ I% p; E1 e/ F; O( v0 j a - private MonsterState state; // Текущее состояние монстра0 ?+ ?3 j A. G: y& ]1 w* ^ W
4 `; @; | [( i* R3 Y- // Конструктор монстра
; y" {$ p; _. _6 z% Q5 h% p - public Monster(String name, double attackPower) {6 x8 x5 w8 e5 C* ~8 z0 X
- this.name = name;0 b) z' ~/ ], \ R9 V9 ~
- this.attackPower = attackPower;; K! N' l' U. a9 ~" i3 e: s
- this.state = new InitialState(); // Устанавливаем начальное состояние
6 V3 I1 P( X m- F2 l9 Y$ U - }" ^+ i2 Y7 g' N6 N/ \/ w+ `
- g* ^/ B. p4 |- X; N/ S. O) _0 n
- // Метод для смены состояния7 ^ W& z, m& R1 Y' p
- public void setState(MonsterState newState) {; i7 W, h4 X, G6 Q" h# z# @
- this.state = newState;5 d5 @3 ~% V5 J. w: Q
- }
: r7 E' _' W0 H' H# g( G) l+ A) {
- P0 v# c% S+ g$ |5 R8 b" {- // Выполнение действий на основе текущего состояния7 B3 w1 o+ u# U; m7 A1 Q# ~+ H
- public void executeState() {
- z" o& ~) H+ Y: B0 N9 R - state.handleState(this);
' n, V/ o( S6 z; A - }
. Z2 t2 N& j/ ^1 v
g) N* [; d1 _; N& r4 G- // Геттеры и сеттеры& [( q# G1 T' C$ v/ b5 v( G
- public String getName() {7 R" i8 Z! R( G$ z8 d: s: V
- return name;5 i" g8 Y" u4 _3 ~1 Q# D1 x# [: ^
- }
! Y4 t" B7 T Y; a5 o - ; n& m9 ?. z0 j: B9 M J% [
- public double getAttackPower() {
$ h$ V0 p; x. R/ Y. ] - return attackPower;! v3 v: ~( W7 W1 C* u N. L/ [* `
- }
7 R/ B* R' M6 ^* u9 J- G% h - ' x6 r8 d" P, y
- public void setAttackPower(double attackPower) {9 N7 d# a% @1 u
- this.attackPower = attackPower;, c0 F+ [* b' u7 _8 ?
- }3 W( X! J9 I/ ~- u% g+ ^+ X
- }3 a/ N$ D4 t8 k: q
Скопировать код 4 n0 T9 I8 y$ f: p5 \. z
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
% N# c/ C/ r4 b4 Z: r5 @
4 J1 F& _0 J* i5 S4 p* w4 G- // Пакет org.l2jmobius.gameserver.model.battle
# X' E' T. K j; V. I - package org.l2jmobius.gameserver.model.battle;
9 q0 S( Z, e1 `! g0 ?; m7 F/ q2 T9 z
e& J+ I3 `) A: x( x2 z- import org.l2jmobius.gameserver.model.actor.Monster;
7 u3 D. O( }4 c) s/ X' h - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;- ]$ L7 M' m% L2 K- P4 p
- import org.l2jmobius.gameserver.model.actor.state.FinalState;& p2 s. T) b7 b* ^2 K' x5 k
- / u$ u( [9 i/ ^# j% _
- public class BattleSimulation {$ ~0 c' |2 @+ Q5 f! m
- public static void main(String[] args) {0 d% J( F* i$ x7 `- U6 K2 x( B
- // Создаем монстра с начальной атакой
* N, `& x$ Y7 r7 u7 V3 w+ d5 Q: d - Monster monster = new Monster("Дракон", 100);6 O/ S% [3 X" t
' {8 `; K5 H9 M3 z% F- // Начальная фаза
8 ], b! n. g, n - monster.executeState();/ m( d1 c# h$ _+ _/ |$ u3 m" a9 {# ]/ `
- - u7 p. [+ Y1 i* p
- // Переход в агрессивную фазу
& R7 V# j0 S! Y7 P. }6 K - monster.setState(new AggressiveState());5 F! l7 j" r8 V0 z; K) i2 X; G
- monster.executeState();
. L/ c, q: T3 M9 k4 |1 m
f# B. g; H3 j: \- // Финальная фаза x+ P4 z' Z7 a# O0 p$ d
- monster.setState(new FinalState());8 S2 C, h3 H! p! @' a+ y
- monster.executeState();
+ I, s8 o Z4 @$ t - }
# I- t. X! p0 [6 I - }
% m" C; _( S z$ G3 L; x4 t' ?" Y
Скопировать код
8 h c# k. Z, o( ?! s6 YКомментарии по структуре пакетов и классов:
( B: X$ G9 {- v/ _4 C- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
" V: T- X) C- B& {( L! t ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
% f; b: |! R- p7 z5 CЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
3 L( D/ k1 R$ U" g. R0 y f" Q) D! q- w( B
^0 u- z8 @& e- d+ H7 i0 ?8 |
6 S0 y( O6 U* U: O) ]3 g
. s4 P. L2 f, F, {- M$ q# ?+ B j, a+ h
$ [$ N. g" L& ~8 S; k0 ~/ Q! L1 p
2 l; y% a( {" }7 u$ ?3 k
$ R' h7 L+ ^5 R; @
9 B7 ^) X6 f4 ?9 g
% _2 d: t0 A" b5 e& E
9 {7 {' P- p! G- j0 v3 B2 u1 Y+ o" Y7 X- e4 e) R
U3 |, U" t) h- |7 \
/ t: O8 B& @7 @; j7 F; m1 y |