Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 5 e' }2 O2 \1 h( {
7 ?0 `1 n2 k" N/ ~/ J3 y6 nЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
4 L: ?' ?& O0 R2 g' `
$ y$ n/ L5 w$ ^6 J" l: P0 CШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
2 C4 ^! {& c* l* e# N6 z2 y$ m+ \2 T7 ?5 t3 q
- // Пакет для состояний монстра( x' k/ C) s1 m9 u/ e1 D7 K1 z1 j% n
- package org.l2jmobius.gameserver.model.actor.state;/ Y9 a1 y' v' h3 l/ X6 `4 i6 C) T
- W# c* n: o4 s3 J
- // Интерфейс, представляющий состояния монстра
3 ^1 |+ R, @, p8 r - public interface MonsterState {3 i0 `, f/ l* v1 q/ D- W
- void handleState(Monster monster);
* l/ \4 ^% g k4 L2 d. n6 T, { - }
3 x" Q; A0 l/ b5 [& V/ [
Скопировать код / \. R* g5 J; D! G9 X
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
& X6 a5 f. W" v* o( A
9 A; x3 U8 _9 L, v' }0 BЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
3 P* J9 f |4 d) s) O! d/ {. {' y/ F8 v3 Y, @# p
Класс для начального состояния монстра:2 o3 Y% l6 L7 \$ K1 I) k0 H
- // Пакет org.l2jmobius.gameserver.model.actor.state( R, e7 k2 d* V5 {( Y8 j2 I
- package org.l2jmobius.gameserver.model.actor.state;; b2 J8 c$ J; [: w8 r% V
- 1 C; Z9 v9 R# ?) e/ ~' P
- import org.l2jmobius.gameserver.model.actor.Monster;
' k2 I: R# w+ P; j+ p) L0 u L
; V8 T9 H. P! w' v& C- public class InitialState implements MonsterState {0 H; \5 }4 L6 ]% [+ ]
- @Override
( B4 G1 y9 I# R# W, M! W - public void handleState(Monster monster) {! e; P9 p) c! ]3 g: R
- // Начальная фаза боя; z3 T: _) [0 j! k* ^3 L( R& J
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");/ e7 M; N- h- A X5 r7 n
- }
) S5 C5 d( L& b3 p - }
/ d! C1 f5 N+ W0 A. ^
Скопировать код Класс для агрессивного состояния монстра:
/ K9 u: p9 e! K% e5 c2 h- // Пакет org.l2jmobius.gameserver.model.actor.state$ z+ p+ u" Y. m7 |8 s. v
- package org.l2jmobius.gameserver.model.actor.state;
. n" r X) w. n" O; I9 D6 n% O
: V2 T6 T* R( s9 E- import org.l2jmobius.gameserver.model.actor.Monster;
' `/ o/ h: b! ^+ J- h( V- l8 Y
. C! K9 P% Y) q$ k7 V2 B, h- public class AggressiveState implements MonsterState {
- D- O- T$ S# Q, d - @Override3 v9 d8 `! H* B& J3 d
- public void handleState(Monster monster) {! {& y2 Q. d. d0 u/ J
- // Агрессивная фаза боя1 ~4 R j6 W% D' S
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");8 p, x0 U1 K2 s3 {
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
p Q: t- f. O# a0 x - }/ W( y9 p) d6 J2 \9 K! R
- }' t3 Q: I2 t5 g
Скопировать код Класс для финального состояния монстра:! ~1 t6 O6 O6 G D6 _
- // Пакет org.l2jmobius.gameserver.model.actor.state, u2 h4 l7 G! k0 n5 A
- package org.l2jmobius.gameserver.model.actor.state;
4 }2 M; ]6 f/ E" e! R
- F) O3 P. A% ~* X4 D" Z- import org.l2jmobius.gameserver.model.actor.Monster;, @5 a9 P" v% O& R( g; B: X. h
! ? n$ O4 t2 o- public class FinalState implements MonsterState {
9 C: K+ w3 k* H% O - @Override: _- e1 D2 K5 p8 [! O6 c9 W$ E3 P
- public void handleState(Monster monster) {- r% C1 R. ~5 S% G; z
- // Финальная фаза боя7 ]0 Y- N. }, [" `# ^/ }
- System.out.println(monster.getName() + " готовится к финальной атаке!");
/ r2 @. W# I4 D3 G - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки/ C4 o" P2 d' D' N# s7 q' Q! _
- }
9 t; Y- e8 m! r+ N; q. y n0 j5 G - }
1 g0 B; z3 z$ V
Скопировать код
) e) C O$ ?& R9 s% tШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
% C. s6 P" G. v* W# t) s. W: P- // Пакет org.l2jmobius.gameserver.model.actor
, M2 C6 v# _: ]8 _/ w2 n - package org.l2jmobius.gameserver.model.actor;3 e" l3 i! |' R+ k% }% M" y
% t/ r% y2 w) h! X- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
4 d/ a# k9 _9 @/ U - import org.l2jmobius.gameserver.model.actor.state.InitialState;' @" m! v% ^* j
4 z3 y0 m. z* `$ R, y- public class Monster extends Creature {
* f% @ J) K" L- y3 v - private String name;& [( Q M2 `+ c4 n
- private double attackPower;' t5 o$ F) q+ ^4 S z& u* j
- private MonsterState state; // Текущее состояние монстра$ Z5 E+ l- P' `* D+ l- G
( C8 U% d; g% T* P- // Конструктор монстра0 Q9 ^7 z3 g/ Q$ o6 q
- public Monster(String name, double attackPower) {
; @, B( M6 N& l& @; E - this.name = name;
, M( q( }) [! l" y9 b2 o1 [ - this.attackPower = attackPower;( {9 c% |, h; x# f& x
- this.state = new InitialState(); // Устанавливаем начальное состояние& }4 q" y7 ?' f6 q$ p
- }3 H( l' R3 J9 O" P
- ! q$ s. |4 i! N, J
- // Метод для смены состояния- ]5 n& ~$ b$ s$ z4 z5 {' O
- public void setState(MonsterState newState) {
7 l t5 V1 V2 \/ D G4 ^ - this.state = newState;3 }. ^# f- z) Z6 [- O
- }4 N2 `+ ^! f: J
( D3 C) I+ G: m7 a+ {- // Выполнение действий на основе текущего состояния7 J8 d s; t! V! `
- public void executeState() {. @- i2 ?) H; ^! B
- state.handleState(this);( ]5 I, ~# l8 M, a, K
- }
' D8 d; u; M3 ^# v6 I- b - K, \! Q7 A3 F) V& c, U
- // Геттеры и сеттеры
6 B z2 {( }/ B/ \+ q$ {$ u+ u! ^ - public String getName() {6 i( [/ G0 L* q3 p) n8 i% C7 n
- return name;8 y4 p% W9 X5 r$ N, y E/ X4 Y! ]7 M
- }9 e# [' r9 ^ p1 f
- + O2 R8 D1 _- D7 h9 p2 H2 W
- public double getAttackPower() {
/ `: y* V7 N4 p5 @0 ^6 v) N - return attackPower;6 \+ K# C% \4 k
- }
$ b+ g! b& R' M% l
; J+ M# ^( O$ Z V3 t2 i% W8 D- public void setAttackPower(double attackPower) {! X( k5 T8 J5 z1 H9 L5 H* O
- this.attackPower = attackPower;8 g* m! b- d. X) X( o* A
- }, a4 a: T" o$ v7 B/ R0 c; U
- }% d/ B9 H- m, G( J/ i; h
Скопировать код 6 Z, B( m7 G" p; M- x9 n# v( w
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.3 U. M; y5 \3 I. V6 ]
. X/ S" N; W! Q- y0 Z7 ^* y
- // Пакет org.l2jmobius.gameserver.model.battle
7 F5 p* P; i) |# W3 t8 d. z - package org.l2jmobius.gameserver.model.battle;
6 o6 ~5 @, f+ A% ]1 N9 _- n" Q
- D9 }8 O7 Q# s: K$ d* ^- import org.l2jmobius.gameserver.model.actor.Monster;, K: Z R+ O2 P# J& R0 ~
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;% W+ p6 U( ~( A' N7 L6 }
- import org.l2jmobius.gameserver.model.actor.state.FinalState;( Q! |" h4 T; }! }# q# E/ F
+ b: e% H0 o+ D- public class BattleSimulation {8 c7 ]% A; j( ]" n6 v; s# s8 T: {
- public static void main(String[] args) {. U/ m; Y) p( R, g' H' {% k" D
- // Создаем монстра с начальной атакой" i, X' \3 ]$ n; \1 }6 x
- Monster monster = new Monster("Дракон", 100);1 ^2 y( |9 T+ b# b2 v
2 t! ~9 ~( F: r5 y* [" h$ ?- // Начальная фаза
5 @7 l+ C- V. h; M& x& t5 y - monster.executeState();# ^9 F2 t% S& u6 h. X3 v
* G- }. w( g- k; Y k- // Переход в агрессивную фазу. D1 k$ |& _+ I" A6 i
- monster.setState(new AggressiveState());
6 M8 s3 [1 E5 O - monster.executeState();
: g8 r3 N8 j2 b' U
+ w. I( u G$ {- // Финальная фаза" a2 C$ R. O e# m7 ?
- monster.setState(new FinalState());5 N$ @! |9 I+ Z1 D0 ^9 _
- monster.executeState();& E; f8 f# S* O5 l. s! j6 r
- }
4 t9 d7 H: L' P- \( H - }- }8 s9 X, \' z( B* }, q* d
Скопировать код . _4 }1 r, G$ c8 y) _5 {/ E- w
Комментарии по структуре пакетов и классов:
$ z; {! {. H: b' `, ~% l- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
# { ?$ |! o1 T+ P ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
/ h7 H7 [; y6 N/ F. ?( hЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
* B! J8 j, N; G2 |2 n/ S1 j5 _/ k, X
% Z8 U- a# R2 a3 @2 \6 T- q9 u' l& `
E& B. N* D: [6 w: g0 B6 v6 j) X b- E. \2 _. ]& [
! C5 j( W8 Z+ u* ^* [
# L* L5 v1 @# w; o! p) B* x1 l/ Y; v4 E3 l" n8 z1 m( L
& N! m$ w$ `: n: C
$ v- V( U, T* i% w1 k( A& N, m. x8 f' U
. y% F0 x ^4 a4 g% p3 }- T0 r& f2 F- s
! \1 J) P9 x+ \
5 ?' L. C' v! N2 U8 U+ w |