Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
2 X$ |) b3 m0 i$ b- b; n V: |
. R8 i, H9 q5 s NЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
7 @8 O& M6 V3 O/ U' |9 @5 E$ Q- Q; B' k
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.& |! z8 c) W( v! U
' y3 |5 ]( Z* n. i1 _7 h, G9 [- // Пакет для состояний монстра# s) ^6 I0 I4 H) ?5 ^/ H8 N
- package org.l2jmobius.gameserver.model.actor.state;* U, _% m& }! O6 n/ b
* Y' c5 G' R: r. ^- // Интерфейс, представляющий состояния монстра1 I: Y; C, X$ h/ X7 F: R
- public interface MonsterState {/ ^7 T* h* _( q O8 \
- void handleState(Monster monster);. T1 f& t. p& P! K
- }0 x# a4 i$ {7 [3 D. _
Скопировать код
* l8 a: C1 c8 a- e% r6 ]Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
2 V; i) M8 p! Q: ?: G) c3 V7 m% t) o' |. O/ x$ `% ~: T7 a/ \4 Y
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
- Y# }; h L, e; y1 O5 f: G0 {/ L$ z1 `
( P3 Q9 \' m" MКласс для начального состояния монстра:
1 e0 v4 }) {4 @( p5 G F( r- // Пакет org.l2jmobius.gameserver.model.actor.state( L% v W& [+ y2 p; `* B
- package org.l2jmobius.gameserver.model.actor.state;. t5 e; A! Q( P3 z2 u- |
- , u% a! z' y9 n8 D" x3 s
- import org.l2jmobius.gameserver.model.actor.Monster;" M$ k1 } F) y( B
- ( g! p5 w( c$ I- |' b9 N
- public class InitialState implements MonsterState {
6 N) O2 d( a! X( C y - @Override
1 U; X9 k! x4 q. Q - public void handleState(Monster monster) {
) `, m5 M( v6 u- q - // Начальная фаза боя4 h% \2 m0 a& Q0 S& @& ?% X
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");& l; [3 t+ f: t
- }( \$ Z6 X1 q0 B" z
- }
P; k, y& ~ E9 U
Скопировать код Класс для агрессивного состояния монстра:
# }. ]* \( q) A" n- I, e$ {) f% G- // Пакет org.l2jmobius.gameserver.model.actor.state
O! A% R2 \6 e9 d( O - package org.l2jmobius.gameserver.model.actor.state; `9 m: O! ^) v8 j' w$ z
- 7 Q0 T0 Y; u/ P4 d
- import org.l2jmobius.gameserver.model.actor.Monster;
) J6 q2 W' P' K2 {9 O, z( R - 2 l7 ~5 F' `: ]: u) g
- public class AggressiveState implements MonsterState {
`# [5 r# Y: b2 l: T - @Override
- g1 H0 m) [$ A. |: a+ P% J9 [9 B9 u - public void handleState(Monster monster) {
) i+ @) ^ L7 P1 [5 ? - // Агрессивная фаза боя$ p" j3 @8 d# N8 U/ p& H
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");$ g9 |9 C& c' K% q) G
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
) H" ?8 ~- k7 _ - }
' [6 J& A" o- o+ a4 T4 P - }
) k; N+ \; {- P
Скопировать код Класс для финального состояния монстра:
$ U" i/ t3 n$ i- n0 h3 d9 |- // Пакет org.l2jmobius.gameserver.model.actor.state8 ~- a0 B3 R' d# A3 F- u2 B& w
- package org.l2jmobius.gameserver.model.actor.state;
* v3 E$ ^; c# Y& M! u' e6 N# t/ j! Y
: t9 H0 H7 l0 G; K- import org.l2jmobius.gameserver.model.actor.Monster;
. \. H3 a! Z. s& t3 N+ {
; Y b- B F# w- public class FinalState implements MonsterState {5 o0 z7 h8 u. G, s, g/ p
- @Override
9 V+ g; g3 |5 h$ g - public void handleState(Monster monster) {
! \: v, t! W! i) l% v6 [ - // Финальная фаза боя% | m9 D$ |! U: |, h
- System.out.println(monster.getName() + " готовится к финальной атаке!");* Z' @5 @7 I4 x5 b
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
( ]# t9 L3 ]6 [% ] - }: _" W( e0 s% D" p# U3 E
- }
2 ^- n! i1 ?7 r# x0 T# @
Скопировать код ! j& a7 z C T& J% z
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.( h. _: e9 U/ m3 J, ^
- // Пакет org.l2jmobius.gameserver.model.actor9 @. y% R# C+ d9 C
- package org.l2jmobius.gameserver.model.actor;! G0 _) A; o+ `; p0 A2 U* B* Q
- & l. \" [8 ^7 d# x
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
& A0 A: E P5 K4 G# v$ i - import org.l2jmobius.gameserver.model.actor.state.InitialState;
/ l J) H& z7 t" H
+ h& c5 t/ {# i4 @8 H, Q3 ?- public class Monster extends Creature {% a# F$ Y' s: ?: R, w% s. ~
- private String name;
* b! U8 i* [ k m - private double attackPower;
: T: V* n+ u# {6 ?/ L8 [7 { - private MonsterState state; // Текущее состояние монстра
2 u7 Z6 Q s) w! p& x - $ {/ S! i( B; W& s
- // Конструктор монстра% f' y9 l: g" U. ]
- public Monster(String name, double attackPower) {
8 A, o+ k/ n$ Q/ m - this.name = name;
, z I5 f0 p( z' s. k0 w; c* n - this.attackPower = attackPower;$ n, M' A9 }8 B" J
- this.state = new InitialState(); // Устанавливаем начальное состояние
# f4 V- I$ a; f p - }
$ Q8 G' S4 c; a. K% {$ v- p
! \) d2 p; d$ P. h- // Метод для смены состояния0 L+ v" j8 _) {& _ d3 Q9 I
- public void setState(MonsterState newState) {
; G* N% y0 Y2 |5 s+ [2 s - this.state = newState;
5 Q8 c# m9 m! _' F- n) ]0 A - }
3 Z. m7 ?+ n& ?/ _2 _. @0 K' i - 3 i3 t1 g% P; J5 ?4 ]7 K# k" M
- // Выполнение действий на основе текущего состояния
3 O5 q ?3 E7 ^6 f$ v K+ l - public void executeState() {4 b2 K, P. y. Y0 T$ ]5 B
- state.handleState(this);9 k* {9 {7 [# O' t' K9 E. _0 Y
- }3 C! V0 |7 U- Y6 g0 a2 W
2 m/ Z7 p9 z" l3 F: q- // Геттеры и сеттеры
- l5 e( Z: e# m( j9 J - public String getName() {
8 j" F) W$ ~% q2 X - return name;! E" z- _0 N" z, l; r6 {
- }
" \& y8 `* s' a* V* K - - U8 R; z" J( x$ l; v. r
- public double getAttackPower() {! s3 b# `" l% ~
- return attackPower;
1 d- s8 W1 ~# @ - }
3 x2 k# N( d9 [0 F; C; r$ Z - : N7 u- u# Z! h9 _6 {
- public void setAttackPower(double attackPower) {
) k0 h0 `& l5 L0 m - this.attackPower = attackPower;: @# C- o! C8 Y) k/ A
- }
4 Z& K; W8 L# R4 P& V' B - }' D& n* r: e. O) [# X5 D) f, v0 z% a6 g
Скопировать код
~; r2 K! C- Z" v' l9 G9 e7 ]6 PШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
: ?9 [4 ?/ E( I! \* J: g i/ i0 _% h. O0 a
- // Пакет org.l2jmobius.gameserver.model.battle
6 V& | ]( W, e% |* J - package org.l2jmobius.gameserver.model.battle;
; B i+ B8 b, y$ B1 c - $ J( L1 E* j, v+ K
- import org.l2jmobius.gameserver.model.actor.Monster;
) O# l, F6 k5 U0 n4 Q& w - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
& ` A* u$ m, \+ z0 k - import org.l2jmobius.gameserver.model.actor.state.FinalState;
7 O5 @* W/ s( A( |) `9 F# n3 V/ n - 2 X N9 U* z" c r, Y$ E9 K/ t0 ?
- public class BattleSimulation {
" |# X4 f+ i0 ` - public static void main(String[] args) {
+ J7 X3 A, U/ R7 T0 A. r) y - // Создаем монстра с начальной атакой8 w0 A1 h" B- K0 R9 v0 i
- Monster monster = new Monster("Дракон", 100);
2 M" }$ [( o$ T. s% h- v* M; ]
" I1 g1 s6 n( h, g8 V- j5 ^- // Начальная фаза
3 _& N* o1 m- W& [ I& U* @ - monster.executeState();
' X. _6 W! b3 }' r* a
k. P8 z/ E) i: ]# l/ E) m5 d# N- // Переход в агрессивную фазу/ f3 N$ x6 G+ S, Q
- monster.setState(new AggressiveState());: X6 O1 s# G6 h
- monster.executeState();) ~7 g. P7 b2 I, b# `; F, g
/ j' {' c$ T+ g2 X- g9 U; A2 g- // Финальная фаза
/ g2 K1 ~# ]/ a2 S2 R* G' b- [ - monster.setState(new FinalState());
, ^6 e& g- H5 h% I - monster.executeState();
9 C, `2 W2 Y8 o+ e$ h - }
! _$ J- L/ Q9 Q& Q* }$ o+ s: Q# h! Y$ J4 V - }
2 j* _6 J0 `7 n$ y# ^: A$ k% x
Скопировать код 5 p+ f( E& F$ E
Комментарии по структуре пакетов и классов:4 w# ^# ^6 Y0 O8 c4 K' M' g
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.: \& B; J9 X) K7 T' J3 @. u
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.4 a9 Z+ ~8 F i# |- R
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
. }/ i5 D+ y" Y4 N( D. w5 \2 {! M( _. J6 Y
4 x9 v, i4 R! X( h0 q1 d9 w, h9 F7 {( N7 G- ?
: f$ d" i2 M/ t* ?- ] U+ Z
/ a0 h9 @, \. f% p' [
8 `3 y' T6 ]5 ^; r+ W
5 l4 w; |. w. Y, m9 a5 ?# |
% H' i0 _+ z. u8 w
; }6 C8 j& z0 u! [+ z6 q
6 j- o, c0 r/ {3 H2 d
1 s( d. r$ f. x+ `0 U n0 R1 ?9 ]8 g1 a& P6 L0 g
$ V$ |9 [1 i s) \/ C4 B6 q
; u I8 f0 r+ }: E. u w |