Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
, ~# P5 G3 d s9 B: b! ~( r7 n' w+ ?2 e5 {$ l* `! r& H2 a* ?
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.( [; a0 @: Z0 V8 |/ H3 F x" w1 [$ w
' }$ b7 @) C: c* o4 R- g. \
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.* g n3 t: y3 f+ Z( ?$ X
2 z* F/ X v) A+ c8 S% A, H
- // Пакет для состояний монстра3 w6 f( B1 \( Z, p: V
- package org.l2jmobius.gameserver.model.actor.state;
* T8 Z U. c9 j. m1 ?1 t - : O1 ?0 T: b$ i2 Z0 l! A& b
- // Интерфейс, представляющий состояния монстра, u! t9 W9 B6 p$ f1 j
- public interface MonsterState {
1 B2 F! f% Y! A1 C8 A - void handleState(Monster monster);, ]* k1 n6 s0 i& L% a0 N5 Z& W; O5 R
- }. l/ Q [ l6 s1 ^" D
Скопировать код
2 o# q# y: h/ M! p% S- n, M3 G0 C1 yШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
6 F. y' y" ~6 r* _/ N% c5 X" b |1 z' s$ @0 O3 m- w! P
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя. i% M0 P" r8 v n2 p& E8 Y9 z7 `
; S& r% s4 U2 M( Y. ^9 u! @7 s. g- r+ fКласс для начального состояния монстра:
" b/ _: V% R5 \( a% W$ | V. w- // Пакет org.l2jmobius.gameserver.model.actor.state- y, X, B6 G0 m, x R
- package org.l2jmobius.gameserver.model.actor.state;$ X1 |. @+ h7 J# [; I
; @3 O! N: ]' E1 E- import org.l2jmobius.gameserver.model.actor.Monster;
$ S# j/ Y$ f t. \4 [/ t - $ [' Y1 R. A# `2 H+ V
- public class InitialState implements MonsterState {
7 [- ?) _5 X. m1 V, r - @Override
! X! y3 Z( ^7 W7 ~% C; | - public void handleState(Monster monster) {0 ?$ r4 ]. K# U6 w- O) z, S, |7 n
- // Начальная фаза боя \" g/ r" D/ p0 F( W) D/ v
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");
( G+ P6 z% q( L' u+ @# W - }
" j! Z" l3 g2 S( y7 G - }% D8 g1 _, C- Q8 N( L, B
Скопировать код Класс для агрессивного состояния монстра:
: a3 `! l( t- h; M, \- // Пакет org.l2jmobius.gameserver.model.actor.state2 q2 P( J* k) H4 q' X
- package org.l2jmobius.gameserver.model.actor.state; v; s2 H+ D3 F7 a& d6 L
- 1 q Y( o% y8 L" [
- import org.l2jmobius.gameserver.model.actor.Monster;8 u% w/ C+ N+ L, M
- 0 P$ k9 ~$ W1 A" E h6 E
- public class AggressiveState implements MonsterState {1 b2 D" d/ W! k( I
- @Override, A1 S/ t6 o+ J$ t
- public void handleState(Monster monster) {3 H+ J" _" ~6 N4 t* a1 Q
- // Агрессивная фаза боя
9 d- W7 _0 V2 x1 @9 g$ G - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
. w% }/ c2 M3 z$ T - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
9 G5 D4 W3 H0 m" [4 y! _* f - }
# o- {$ | l6 {% \( [5 m; |; d - }
$ v0 U' h9 C+ u! I& E
Скопировать код Класс для финального состояния монстра:
! L* m' B$ N* O1 |8 X; y/ e- // Пакет org.l2jmobius.gameserver.model.actor.state
( Y' R% ^! P- I/ B& E# [ - package org.l2jmobius.gameserver.model.actor.state;
; [0 R/ l" n. ^) l
( `4 `. M# R' I' h+ m# `5 W- import org.l2jmobius.gameserver.model.actor.Monster;) ?6 @& g- Q7 b' z: M M t0 V b
- F( e2 k! q W! c! a. D4 {- public class FinalState implements MonsterState {
7 J3 h C- m& i# ]2 Z* r - @Override
- y* U5 u- m C - public void handleState(Monster monster) {, F! D0 Y* f1 B6 s4 b+ `
- // Финальная фаза боя5 t' i5 O; D$ B- g( E
- System.out.println(monster.getName() + " готовится к финальной атаке!");9 l, C4 w) g C3 J$ I
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
1 ?% U+ w0 l+ j' H2 r# q2 m - }
o' Q* h' ?' V% o i y - }' n/ K& E# i6 q3 x5 h, X
Скопировать код + Z, V8 }9 c* I& `
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
* [2 W- R6 \( ]* v1 f- // Пакет org.l2jmobius.gameserver.model.actor8 n: Z' O) i+ z* C5 J2 K! U
- package org.l2jmobius.gameserver.model.actor;* `3 R/ N! [0 Z8 m. K$ b/ l% e
- 4 k7 |# B9 z/ {. P. ?3 j/ O
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
8 U+ t0 \& S9 ]# J) q6 }0 \( \ - import org.l2jmobius.gameserver.model.actor.state.InitialState;* e, n G" \) M; B( s# I" [
- " h7 d7 [2 u. ` k% i; z3 i
- public class Monster extends Creature {! _$ f6 g: M6 G, r ^) M
- private String name;% o' k9 i- P9 s4 S
- private double attackPower;, ]% Y/ a6 i2 h4 q' q5 R
- private MonsterState state; // Текущее состояние монстра
; d6 @/ a; {& i/ ^+ f
5 H* K# [- r8 B9 _7 J2 U/ X- // Конструктор монстра
6 Z8 g" _5 |& j/ ?: d) a - public Monster(String name, double attackPower) {4 S2 y- A3 h! c0 N) R
- this.name = name;- J, Y1 i( k. f4 M5 Y
- this.attackPower = attackPower;
6 } K8 ?; U7 l! L1 F) b: M9 s* g+ q - this.state = new InitialState(); // Устанавливаем начальное состояние
' p/ y b4 Y5 {( r9 u4 W7 [ - }
8 u! f4 x/ O- V0 l* G. l2 Z6 r
0 `" k+ O7 Q( K- // Метод для смены состояния
3 e( f6 m3 F J# B( m# L" J8 E - public void setState(MonsterState newState) {' V7 \, x4 [8 n9 J0 N
- this.state = newState;1 j9 o+ R, b$ o0 z: J v/ r, W
- }8 u6 O' C0 _* K
, G0 B( ?7 j; {0 Z- // Выполнение действий на основе текущего состояния
, f1 e% t. @2 |* Q" a5 X- X9 } - public void executeState() {# T/ Z7 r4 y$ t8 ]: i2 N
- state.handleState(this);/ L5 ~- F( B; f5 Z( F
- }% k7 J: v+ V+ r. i: v! a
! b- D, j* I k( _1 T- // Геттеры и сеттеры" R) U, M7 c3 j, A. d
- public String getName() {2 R+ g9 Y) k+ Y% _1 v
- return name;1 o2 f* a6 k. s0 [6 r6 B
- }4 p3 F* p1 C( W% M) G8 c
- ( s6 N- ~; y5 u' k2 F8 o4 t
- public double getAttackPower() {
9 R0 Y9 g% d+ | - return attackPower;
; E, ?$ T6 l3 a. B+ T0 C; L; F - }
- K2 o0 \/ d+ l" g" A! r* M - $ w( q2 M, x S) F' I7 G
- public void setAttackPower(double attackPower) {! E# J3 @) T0 V8 k2 I/ H- p7 U
- this.attackPower = attackPower;3 }' r, d# J0 ` L" y& x
- }
3 W5 I4 \% V9 W; u6 Z - }
8 }; p9 E) E; N# ~/ q' D- `, A
Скопировать код - h$ t# o3 [6 c L1 A
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
: j8 h. b$ V+ B2 {) V
/ S' {* q) }6 e1 V- // Пакет org.l2jmobius.gameserver.model.battle
. ^9 y+ G% D5 J* \0 h! j0 i$ a - package org.l2jmobius.gameserver.model.battle;+ @+ k; C: s7 k S5 e2 a% w7 K
& y! t3 W, {/ o& j- import org.l2jmobius.gameserver.model.actor.Monster;# a1 b/ g0 r9 G: R7 C6 A) Z c
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
* a/ A$ U9 l; E - import org.l2jmobius.gameserver.model.actor.state.FinalState;( u# y$ h; G" @& T
- # k2 G N/ Y9 Q, l7 ]
- public class BattleSimulation {
' t$ \! z3 l7 P, { - public static void main(String[] args) {8 o& H- _6 i- t) I/ ]# ] w; ]
- // Создаем монстра с начальной атакой
/ d h. ^' B9 E% u, } - Monster monster = new Monster("Дракон", 100);- Z2 B- J1 Y9 P3 H- F g! x
- 6 z t5 C# _& L) O" Q
- // Начальная фаза( H4 P! G7 L7 T
- monster.executeState();
! i6 S, N2 g1 @" Q/ A4 O
% b( H2 W1 {( i4 l; l1 I- // Переход в агрессивную фазу) K# l7 g' K' X3 d/ T
- monster.setState(new AggressiveState());
) V! }+ K" X$ A# I - monster.executeState();. Q: v. H3 A* o. F2 H* H
- / H$ ~4 K- L6 a! {; b& c
- // Финальная фаза
! I- J& k4 |, `1 s# | I - monster.setState(new FinalState());1 R l2 v( X& t1 A: s
- monster.executeState();
* M* O5 o; V4 h- c% h' u! U2 a N - }
) f" c8 e$ @" a: v$ k - }
+ ]1 T1 p) `( r+ H" m+ k( c" L
Скопировать код 3 E/ P$ F- U8 a0 S
Комментарии по структуре пакетов и классов:
2 L: Q8 y8 B$ Z- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.4 v1 p" K; c9 @8 E
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.% k; k R, z) P
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
8 u. Q5 ? Q' G8 f# u. z8 m. h; t0 j3 q+ c% C; O. a
7 w& \6 ~: q7 e1 F4 n7 N9 G# @
9 Z9 t6 }) q2 X6 l$ [! u# Z' J7 v$ _ J" Z9 o$ }
$ s2 d1 }+ M; p V# |
) M0 m4 r4 L8 D& m9 E
2 c3 m& D9 F7 n L k( d* H0 H
; R! F6 m" {# c* E+ T
$ m5 d# s: z o9 z
# ^' F2 Y1 C2 ?( q
4 e" c x/ C. f
- m X3 J! Z: n1 K
G3 R6 x: o) T- T+ m' x: R* |
* c7 ] | W* M; H |