Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
$ o) ?" |' [; B i) B" B. d
' ]# D$ s5 y/ `, b. B4 BЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра./ M$ n- k, v A% E3 O& |( X+ c
2 o' D5 W# s. X" c/ {; t' U8 l$ D
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
" i4 \) m, n/ s3 K. x( d# x, D
- // Пакет для состояний монстра6 K0 {' s+ b \' ^+ _* v
- package org.l2jmobius.gameserver.model.actor.state;5 ^1 X7 u8 @( C, I/ J/ J
% x& Q( K( D0 I$ U! F- // Интерфейс, представляющий состояния монстра. N) `! b3 P3 s2 m1 w, {$ D* P
- public interface MonsterState {. `" @ {" L: q; s# j
- void handleState(Monster monster);) C4 x$ M( {$ Q( b0 M, i `
- }7 _' Z* ~- V9 y
Скопировать код
! |- h- a4 f3 W) p; q) C7 [Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 1 ^& L5 h$ R) @# Q+ C
: n: x/ l# D# Q% bЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.' n" F) a5 n; @/ H; i, f% y
3 y2 T6 \9 s" i7 I0 J- n8 \Класс для начального состояния монстра:
7 L: Z$ I% a7 b6 V' C1 w1 y- // Пакет org.l2jmobius.gameserver.model.actor.state7 Z, s$ b$ a7 v! w3 C/ V4 ^9 b
- package org.l2jmobius.gameserver.model.actor.state;
3 k, ^8 g3 ^- |/ E1 z' n* U - % N, h; F6 [3 f y8 `+ ] @. A
- import org.l2jmobius.gameserver.model.actor.Monster;* J& k5 c* o9 O O
7 J$ C/ Q7 b4 x4 {0 L$ b- r: X- public class InitialState implements MonsterState {
3 a6 Z6 u( \7 i# _ - @Override( p! O' W' G/ |( j2 L
- public void handleState(Monster monster) {
V: v+ ?' {5 m i& v1 h! w d3 k - // Начальная фаза боя+ _& W2 m: ~$ m( `+ b' k
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");- X, h+ r w! D1 _7 f$ S- }
- }5 P1 ]6 g6 R" }/ g3 C* h
- }
6 |6 V( C& M5 y8 J. x& T) |. t
Скопировать код Класс для агрессивного состояния монстра:9 w1 T0 P7 C! H3 `! z) ~
- // Пакет org.l2jmobius.gameserver.model.actor.state* l* @; B* g+ s4 W# Y
- package org.l2jmobius.gameserver.model.actor.state;0 H! q" a/ ~" D0 H7 C* v
- $ J& p! f- m" F# l. p' _
- import org.l2jmobius.gameserver.model.actor.Monster;% p/ X" P0 q9 b# n& W: p+ _* Z* J
& \7 L. I4 {( w0 J0 Y1 b& C- public class AggressiveState implements MonsterState {
6 s, `6 R$ j: M - @Override; Z3 Q! G1 [7 R) N2 c R7 S
- public void handleState(Monster monster) {
8 G4 S+ {, ^+ O - // Агрессивная фаза боя L5 F* |. t* K: c
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
9 e: E7 ~1 J$ c, {( } - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки4 y& n0 P3 G3 _( ]$ @
- }
1 q5 s( @- ]0 z" ]1 `) D - }& S2 [. w7 R6 }. n: t. P
Скопировать код Класс для финального состояния монстра:
8 I3 E Z) P) O" n- // Пакет org.l2jmobius.gameserver.model.actor.state: l. l0 N* ~7 U9 J
- package org.l2jmobius.gameserver.model.actor.state;
' j; a: j; `7 B1 V5 c6 E4 [
4 p+ L# `% a3 r7 [0 r- import org.l2jmobius.gameserver.model.actor.Monster;
7 e$ Q$ J2 ]& t* t9 o( k/ t) N - 1 [' [* b: [& s0 w0 t: X
- public class FinalState implements MonsterState {2 ?( D3 U0 Y/ ~# w( ~/ m
- @Override+ z' K- B A% Z$ e
- public void handleState(Monster monster) {
) l0 O$ ^0 q' K: q1 R+ V9 Y% f - // Финальная фаза боя
: F( y& P0 h( `- ^ - System.out.println(monster.getName() + " готовится к финальной атаке!");
* b$ m3 X. M6 m$ o3 O - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
: E6 R% x# Z+ G' D- \ - }
( S1 z* ]$ o; h8 y$ _7 {5 @ - }+ _2 e( i. O0 H3 o5 B; |& f
Скопировать код
2 w' |$ u% H: }, i1 ~Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.6 |* u2 `$ H8 P" [2 I0 N
- // Пакет org.l2jmobius.gameserver.model.actor
, o9 I7 ~0 [, @9 S1 ?" Z - package org.l2jmobius.gameserver.model.actor;
" [ U- @: Q ?) z2 o: G3 |
! x- G; c p- w+ H8 o- import org.l2jmobius.gameserver.model.actor.state.MonsterState;0 {6 v1 `8 h1 n# \0 s3 z0 o& s4 \: [
- import org.l2jmobius.gameserver.model.actor.state.InitialState;
+ D5 p/ L# ~% n0 v, g- T - ' p. d& k4 v, H+ |) S
- public class Monster extends Creature {
, o$ a( ^% u: E - private String name;. H8 H# j4 o" u- N, z
- private double attackPower;
0 l; Y6 B1 U- m4 j2 w( k/ z( I - private MonsterState state; // Текущее состояние монстра
2 y+ x, L3 g, l7 v/ M
7 e9 x2 C$ n+ K2 G+ p- // Конструктор монстра# b- i$ z N9 V! _/ M* N
- public Monster(String name, double attackPower) {
( _9 t, T% g7 E" f - this.name = name; l5 Z" z9 {/ [: L; h: t# Z! a) d- q$ B
- this.attackPower = attackPower;
`& a; |) Y9 n" N8 u2 P - this.state = new InitialState(); // Устанавливаем начальное состояние6 z" ~% D [" l; _
- }
1 r- v4 t1 C+ ]6 l: `% W' h - * T. }6 M. S6 L0 ~* k! d4 k) ^3 x
- // Метод для смены состояния6 i: Y1 x) a8 C
- public void setState(MonsterState newState) {5 p. p0 b2 k$ R% N
- this.state = newState;, u, m% O/ q$ N: \1 {5 T, B3 `( i
- }
( d5 q& k. L" d( s$ M - ) A# P" X. ~. Q; l
- // Выполнение действий на основе текущего состояния3 {% p* _, o4 U/ V$ }7 p
- public void executeState() {
1 h) f& z2 S4 Z7 ^! A! L - state.handleState(this);
, Q9 v+ g+ z% A5 C: c# y9 J - }' K' e& v6 v2 D2 i5 _
, s" C$ U5 o2 C+ t6 V6 [8 Q( ]- // Геттеры и сеттеры/ Y3 Q: P }, j
- public String getName() {
- L; y! Y- M" g* T, d0 z - return name;' J0 Y9 @& {" O! S2 {# }
- }
: R' F( `' o$ a" N - ) r# Q H, m3 k% f5 g) V- Y$ {4 _
- public double getAttackPower() {
( M* X, H0 \3 n" L - return attackPower;6 u) w" W$ h5 d
- }( p' T0 w% @2 ^# x( s6 s
- . z/ T5 u8 V; I
- public void setAttackPower(double attackPower) {& X* u3 P- X) w/ o L; U
- this.attackPower = attackPower;
' I6 p E! t3 p* y+ y! k - }% [9 o; q* b) ~& d. v% M
- }
3 t, W% y; _8 @0 y$ h
Скопировать код % g9 q8 Z) P! \+ S* Z- b7 [
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра." G; r( F) q" j
0 b6 N0 S; l+ F: |0 \- @# @
- // Пакет org.l2jmobius.gameserver.model.battle5 z. O: N; D$ j3 ~% C
- package org.l2jmobius.gameserver.model.battle;
3 w4 L' F- H: a7 i: X+ m9 N% d0 X' W - ! M7 F$ R, {3 ?1 c1 X( f
- import org.l2jmobius.gameserver.model.actor.Monster;
# q% C# ~ {2 ] - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
8 G7 M7 y9 J: \5 e5 N4 @- E) H - import org.l2jmobius.gameserver.model.actor.state.FinalState;7 Y9 ^/ K! T6 t2 M) o/ w
- 4 q" m, C4 R, g2 ]+ m
- public class BattleSimulation {
1 A: x- F, M+ n6 J% {' L, x7 O - public static void main(String[] args) {2 R+ a: P- S9 f @$ v D' B0 W
- // Создаем монстра с начальной атакой
/ G z' h$ m' ]* C9 G) ` - Monster monster = new Monster("Дракон", 100);6 q9 z+ r: N$ m8 n" l2 E$ x
( @3 q _+ p5 Q! t" X$ E$ c& T% a8 i- // Начальная фаза
$ w7 o3 L D* H, d) q4 \ - monster.executeState();9 X% b& q7 k8 d! N' l3 {
- N: `" o( J* R
- // Переход в агрессивную фазу. b# B( [+ X$ \3 T
- monster.setState(new AggressiveState());' h# S5 X. _; e- R" P+ H9 _
- monster.executeState();6 l2 C# ^7 q* v K$ J* a
8 c$ X7 j2 }2 \' m, r7 k- // Финальная фаза
, q4 G* H" w* A( B% v - monster.setState(new FinalState());/ M9 _+ @. t$ B p; f" s' x
- monster.executeState();1 B& G6 q- c: z
- }
: }) v5 x( _9 G - }
6 x( m* j: Q! E2 @
Скопировать код
( V5 t) f2 m! kКомментарии по структуре пакетов и классов:$ F# S4 v$ R7 E5 J
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.* \4 n) b2 {' U9 ^( z8 n4 O5 D
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код. X$ r4 d) B4 ~) ]
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
" r: h! o& [+ n
. a% a+ ?% s- J; J! `( C4 ^! [' y5 Z' o) O7 `0 X6 s
. T4 R3 t! i( r* r
6 J1 [. D; y: z
4 f; g% n. ^" \; [. b
; ~# [! X- `, o% c. X" \/ I/ p
5 l9 {9 _6 X9 d9 _- [2 ~8 h8 u; X/ `. P
9 K& Q, v4 x `- A7 @0 F
6 ]; p' N8 m* f h
3 L4 X. h9 r- x' K7 [# t2 N) W. t5 T0 {& h% e% Z/ A2 C) W" y9 r
& }( Y: F5 `# I/ f) m/ N1 W/ T* Y& c4 n2 o
|