Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
3 J+ ~# w7 I# J3 m4 z2 ?+ x" r
% P& X7 v, n z1 JЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.: [" I8 W+ f. m, y, \( M2 C. R
h; L J$ D2 ~ C* d3 C; ?Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.# f& x6 R! @' t r% V; q1 r& k0 J
9 |1 x9 Q: ^$ x5 q2 E: S- // Пакет для состояний монстра
# W+ i2 O% Q# `: C) h7 j - package org.l2jmobius.gameserver.model.actor.state;
% P- X% B. v; T' [+ O# _
2 S( x1 k% d/ P2 H; N- // Интерфейс, представляющий состояния монстра
6 S& L2 ?4 g) l# W9 d7 z - public interface MonsterState {
3 d- h, o6 s( {/ W. j( M! m* |6 ] - void handleState(Monster monster);- I! F& x* u- S( c6 ]9 `7 F
- }
; a0 i8 j# \% t5 N, P
Скопировать код
; n y ?5 r b( k% cШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. ~3 U7 ? j; m0 w- h& k. c
0 [: E. C/ X! `7 e gЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.! W) Y5 R# P& C5 b/ |2 }
# [6 i4 q8 k+ R2 G( H
Класс для начального состояния монстра:
( Y; k/ M+ I; {' i6 d- // Пакет org.l2jmobius.gameserver.model.actor.state* x% W% r+ j$ S* U
- package org.l2jmobius.gameserver.model.actor.state;
& v8 U7 ?. V0 x+ \
1 N' _ `7 E- V- import org.l2jmobius.gameserver.model.actor.Monster;* ]# B$ {7 ^# q8 f! D P1 E/ C
D7 w- R/ k, P& t- public class InitialState implements MonsterState {! l! y: _1 @% h5 Q3 a2 I) P
- @Override
. \3 n( W6 M& B - public void handleState(Monster monster) {
$ X z0 [0 \6 s' _# n - // Начальная фаза боя1 s1 C) s) x+ d! B: S% D+ C _
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");( H" D3 b2 b" e
- }% n1 L! I# q; Y" e, P
- }6 f- A0 S4 D3 H
Скопировать код Класс для агрессивного состояния монстра:4 ?- h4 [! R# a: R6 G8 h- v" z
- // Пакет org.l2jmobius.gameserver.model.actor.state
2 A, W/ Z! f2 S- I - package org.l2jmobius.gameserver.model.actor.state;( Q( F4 z/ ^8 ~; v8 ?4 @1 _
- ) S, e% ~9 f$ P/ V( I5 h5 _
- import org.l2jmobius.gameserver.model.actor.Monster;. E0 O3 T: J! p! z* Y! h: F; p
- " C& j# C) d8 Z3 m* F
- public class AggressiveState implements MonsterState {( S4 }1 a+ t7 o1 B- F
- @Override- S& A1 M4 S/ t& R: U: M2 m
- public void handleState(Monster monster) {! M- E) A* H) h$ e
- // Агрессивная фаза боя1 N5 O* S. Z ?: D
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
# n$ Y( k( X" X) S% \; q - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки* ^" M/ u+ B# p. T# M6 u
- }
+ E% W5 z. S+ k* a; G - }6 l7 Z( P! _+ ~& s' t
Скопировать код Класс для финального состояния монстра:
) ~3 b- m; q7 J7 G$ M7 T6 e- // Пакет org.l2jmobius.gameserver.model.actor.state1 P& L. _8 ]5 Y
- package org.l2jmobius.gameserver.model.actor.state;3 a4 S/ f" j% d7 b# r" m% c
- 0 a2 v: x- M- Q I
- import org.l2jmobius.gameserver.model.actor.Monster;$ n8 w& u; E7 V- [8 @/ c5 c
- ( \: p$ b) [& B/ \
- public class FinalState implements MonsterState {
& g* c2 B0 _* E. \5 t1 G; z! J - @Override- X' |( h- }5 X' m* f' n! ]. ?
- public void handleState(Monster monster) {
2 B3 k" S( b+ z) ]6 Z" E - // Финальная фаза боя
. B" Q! ~( q; d+ M6 V& Q - System.out.println(monster.getName() + " готовится к финальной атаке!");" c5 r* W$ p5 ^9 L. P4 b1 j
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки/ a( b' G4 h. Q
- }& F( N% W, _3 s0 M6 Y# j3 I* w) G
- }
2 g, Z! P- U) P0 ?
Скопировать код
! q6 ?5 s! B0 b3 p Y K5 J b" A9 y$ LШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.2 z( B. H' w9 I' p
- // Пакет org.l2jmobius.gameserver.model.actor
, K2 w- ^6 ~& c1 Y4 o8 D, {0 ~ - package org.l2jmobius.gameserver.model.actor;$ b; ~8 N5 e; a) W$ r8 o
- 1 n+ |% s# N3 x9 w
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
6 D, c; Y0 ]* X. X - import org.l2jmobius.gameserver.model.actor.state.InitialState;
4 E% U5 {- L1 Z. ?$ f+ x4 E- i - % o, ]* F% p% D8 k! b" @
- public class Monster extends Creature {
) f3 ?( N) ]5 m4 R, U1 o - private String name;
+ M2 f! n% s- @; M - private double attackPower;
1 t- W6 d5 ^+ `6 b+ n! V - private MonsterState state; // Текущее состояние монстра7 M* X9 R: i6 t: {; [: Z2 b o
, s8 _2 J/ h$ X- // Конструктор монстра
/ R! A+ V" Y5 E5 {& v - public Monster(String name, double attackPower) {
" t/ M' A: A6 y - this.name = name;7 e4 C- S: v1 i8 c& E1 ~
- this.attackPower = attackPower;
3 c! `' p# C; U3 U6 [1 s - this.state = new InitialState(); // Устанавливаем начальное состояние
( x0 C6 N0 T$ o: e# _6 |1 [ - }
) B" \. p% h4 u/ _9 @! o3 s Y - * S$ x- B! n% i0 {# ~
- // Метод для смены состояния# }5 K$ l3 w! e
- public void setState(MonsterState newState) {! ~% l$ P% @7 O& \
- this.state = newState;" n T4 \! q" Z, n- `8 i! C3 x
- }! U! b8 K1 M' f3 ^
/ P1 j3 }. ~% k5 K- // Выполнение действий на основе текущего состояния, B+ H% O! _# [, }
- public void executeState() {
6 D* l& o* x, ?. y9 ?4 S' `" E - state.handleState(this);& {4 P" N( X5 F( | I/ _' G
- }
) F! t# H# `: ~7 ~
9 L P: O$ O+ s) b- // Геттеры и сеттеры) B5 M$ Y" T1 m: Q9 u2 K
- public String getName() {
8 z0 [" P2 |! u9 B) x - return name;
, ~3 A3 [# ?. ]+ x - }; \" @/ D8 r2 }. z# d. s& X
- ) A3 W1 T7 I! V
- public double getAttackPower() {; y/ ]- l U' W5 Q& q0 A7 b
- return attackPower;; R) J" A8 J' u& J5 e
- }
, J# T: O! r- u, w* x8 D# c k6 K
/ i0 B: L7 ~2 G" M% K) Y; u+ e/ Q- public void setAttackPower(double attackPower) {0 c0 u. |1 K5 ~ g0 d+ t
- this.attackPower = attackPower;
3 A, W" ]' ?- r# r - }
, M) G% W5 p- G# O# C5 n - }
+ d: {- N: e! ]3 w+ J# B
Скопировать код
6 p3 W+ d: n/ ]2 e3 ZШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
# Y* e2 f. i" ?8 j' M G* i
* O% B9 l0 o( Q, o: X% I- // Пакет org.l2jmobius.gameserver.model.battle
7 T- a$ n# L0 m9 r% S# m - package org.l2jmobius.gameserver.model.battle;
; `4 E! O7 J6 f6 i; R - * p( \- R0 o& `3 J q) a
- import org.l2jmobius.gameserver.model.actor.Monster;* ^; Q2 G# M! V9 O' }
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
9 S4 I+ G0 ^. c2 ]# [ - import org.l2jmobius.gameserver.model.actor.state.FinalState;
3 ~$ K) R. s) |1 s% _ - 9 v; ?' U& J. H6 h
- public class BattleSimulation {1 C+ I& k$ O$ \3 [
- public static void main(String[] args) {$ w% }- q; D& l, L+ \1 a3 f- s
- // Создаем монстра с начальной атакой0 Q4 n" {" a4 w, Z1 u
- Monster monster = new Monster("Дракон", 100);% R$ y; Y+ d4 Q. K
4 l" P/ H# Y2 v: h/ t$ U2 J- // Начальная фаза, q! H% K0 E4 x) b8 i
- monster.executeState();
8 i5 @2 L' ?- i% ]0 f
" m+ ?4 }, Y" s1 N- // Переход в агрессивную фазу M$ Z0 G1 g& i& c& z1 ~6 S
- monster.setState(new AggressiveState());
+ {' ?7 a4 v6 Y* k- n - monster.executeState();# y: E$ X( J+ Z' O' z( m' L
^) @3 S+ \7 j7 u) u- // Финальная фаза- R6 R: R% i1 c* W
- monster.setState(new FinalState());
3 h u1 o6 D$ O, S - monster.executeState();
2 L8 l- @. [6 q4 b9 R' S - }
9 c6 o9 L3 C9 B9 E8 v - }
/ G! H" G8 r/ O/ x
Скопировать код 4 L: V% R% ?$ g; o' P [
Комментарии по структуре пакетов и классов:; X: b; n" N/ s) p$ Q" D
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.) Z) z. P6 q( ]1 u% \7 K
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код./ Q; H4 ]2 v2 v9 ]
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!. j, f; r' Y& Z: c( [
& D9 G2 R" N/ i9 n; `- S5 C
! L3 p: f! H( m& t% E
& V; M0 @& T/ q |3 `# ^5 _8 u/ f- r/ i: |
; P5 q. F; O) Z9 M
1 t9 v0 c8 Y( S( z, k# T8 {1 ]8 I& K0 W$ Q ?/ C& r1 N7 v
. B5 h( D$ {- y
2 ^5 R; C1 S6 X& W" E; k
7 a V( a# b1 J4 ?) |( D& j/ p p3 Q" y$ b* u/ C
3 N$ ^/ E+ p2 j6 i1 w- G2 m q2 u5 f7 Q7 H1 Y. q& }
! u- `( V4 c3 F |