Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). / `( p3 l" P3 h/ a( W
6 O2 N9 {" s1 K* G: i) }+ R6 j
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
* T2 \- V- x- D% O. N3 O8 N! d* V: T7 s: S" T. Y6 \% A- S% {
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.: m3 ~% ?+ X t) X$ L) p% q
1 l; d) ^2 O4 q% i5 {' z6 Y0 I( G
- // Пакет для состояний монстра) c" u8 |! h1 K0 o( i# n
- package org.l2jmobius.gameserver.model.actor.state;
" y9 r: M8 n- R1 P6 P& [; }, y - $ o7 e7 j! b- [& a3 n
- // Интерфейс, представляющий состояния монстра
' T+ A/ W4 o3 Z$ F% i3 D - public interface MonsterState {) c/ J8 N$ M5 e1 P2 F* [
- void handleState(Monster monster);
) v; y* ^7 X9 H& [& q4 Y7 C - }0 ?" }, q6 [$ B- |0 H! j
Скопировать код
$ k7 Y( t0 }7 b, |! gШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 9 m% R' E) ]" S# V) l
6 e# C8 k+ l+ f: K
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.! V9 I& r( z9 u3 H- o" p R1 U
2 b. `+ @; a8 C9 D$ m" o
Класс для начального состояния монстра:; L9 Z9 [( \. u, C) l
- // Пакет org.l2jmobius.gameserver.model.actor.state1 a8 |3 H% T9 O( J
- package org.l2jmobius.gameserver.model.actor.state;
6 l( W% |# Y8 |; Z# _ - ! |+ a$ y8 b/ B
- import org.l2jmobius.gameserver.model.actor.Monster;3 |' x0 M8 A' g/ l8 I& {& C" m
- " r- }, X+ q6 j% u1 T% h6 v* O" R
- public class InitialState implements MonsterState {6 M% H! T1 z2 a" _! V
- @Override& M1 G# K% d) ?$ s5 J
- public void handleState(Monster monster) {
. i3 O3 B" r) e9 f8 l4 P" \# c - // Начальная фаза боя
" f( l& Y" Z% L+ d/ J# W - System.out.println(monster.getName() + " начинает бой с обычной атакой.");
( G# D: M! n7 K( x - }
5 |- d0 m" ]( R% b - }
3 ]- g% d* j! `5 v0 @
Скопировать код Класс для агрессивного состояния монстра:
. u+ `" _9 c N4 }7 t- // Пакет org.l2jmobius.gameserver.model.actor.state7 @9 o& B9 F) k+ E/ ?
- package org.l2jmobius.gameserver.model.actor.state;6 k( i1 _/ J# A. z
" s ?: m B, N4 j$ z; X9 u( B- import org.l2jmobius.gameserver.model.actor.Monster;
' O# q" L' j4 S( T7 i, ^! p
' u4 H& o8 q1 Y- [ L- public class AggressiveState implements MonsterState {# m$ L" \/ r2 m) \! w* c+ C: P: S. M/ Q
- @Override
9 u, G: ^+ j o" J! u8 ] - public void handleState(Monster monster) {7 |0 Y5 d5 ?& V* Y
- // Агрессивная фаза боя
" K+ p# f5 T' \( @1 r - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");! X" ^3 K _- P3 @# W1 N
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
# x8 u: [* s5 g - }
. m5 x% c a2 _$ h - }0 F5 S6 Z8 e+ N$ X
Скопировать код Класс для финального состояния монстра:6 h. m- S/ C! Q9 k
- // Пакет org.l2jmobius.gameserver.model.actor.state6 k* ^& m/ J- H* R1 |: E& f6 X
- package org.l2jmobius.gameserver.model.actor.state;
- M. {5 y. Y' Q1 T; o. l( R% A+ b - # d6 r, z$ S: G9 O9 G
- import org.l2jmobius.gameserver.model.actor.Monster;
* O* d) {/ b+ N( I* N - 4 U6 d# y; K% q1 s
- public class FinalState implements MonsterState {
8 t; v4 B+ C* d) g% b: M - @Override. L5 @; ]" P" ]- ~
- public void handleState(Monster monster) {
' C# z( i3 K* @' `- k* w5 A - // Финальная фаза боя
% }/ O, o+ S4 K/ L; K7 Y5 ]$ R/ N% r - System.out.println(monster.getName() + " готовится к финальной атаке!");. q/ V# {% b0 R2 y! d* {5 [! E
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
& G: D( S8 d4 p) O+ ? - }* b2 `) d; ~ ^4 E( i* X
- }: B4 u1 R, J6 @. l* P
Скопировать код 6 ]3 z, Q/ o" u
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.5 u! G. M- Z) k+ ]$ Z Q" }+ Q
- // Пакет org.l2jmobius.gameserver.model.actor/ n3 J: B" i! o8 ~
- package org.l2jmobius.gameserver.model.actor;
% ]% g& ] z. I- ^% _) y - 4 Q9 q% X& I8 c2 M+ F; {# Y$ H
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
7 X4 z$ j& f3 P% k @. ? - import org.l2jmobius.gameserver.model.actor.state.InitialState;* Q- s3 g$ z1 _- C. A
- & U! K/ @; i0 n' G/ w$ X' b4 f% j0 ~
- public class Monster extends Creature {
+ U* J' B o( z - private String name;
6 J( X+ v5 d% U. P4 a; u7 B1 e$ `3 f - private double attackPower;/ \; S' Z6 L* ]5 U
- private MonsterState state; // Текущее состояние монстра: R2 z, O2 ]( [4 b
- * v; E# W$ n/ ^% b6 u9 I
- // Конструктор монстра5 ^* A- w: B& D9 J( Q( o) T
- public Monster(String name, double attackPower) {( X" S( f+ N! m6 H C/ J/ U c
- this.name = name;; s4 Y$ k7 U$ B6 y( a) _
- this.attackPower = attackPower;) T; |5 M. W2 ]0 @) M
- this.state = new InitialState(); // Устанавливаем начальное состояние5 e: g: I) h$ u5 N$ `8 k
- }
, l8 k7 u9 F( `8 o1 z" l
7 _, q3 h3 W2 V& x' k- // Метод для смены состояния V3 o+ x- q" A/ f0 e' d
- public void setState(MonsterState newState) {
& |, h# {6 J0 [6 @9 I# ` - this.state = newState;' g' a4 l3 Z3 @1 J, K
- } l( i- c, L" R3 z4 B* X. A
, j A$ T) j5 `. z& p s) K% e- L- // Выполнение действий на основе текущего состояния
3 @7 q# V O# J6 S5 Q3 c. I# t+ G/ b( H - public void executeState() {9 s' E2 y: |8 F
- state.handleState(this);1 p$ _/ z9 j: M4 c+ H3 G
- }
& @2 t% ~( s" O9 O0 w; s: y) Q* ] - 1 x) z+ V2 j/ r( t* [$ Z! o
- // Геттеры и сеттеры
@, ?' G" t |0 Z+ H - public String getName() {
& J" ?) \* q& x( I" E7 D2 f - return name;5 P0 C8 ]# \3 B$ e
- }* E: z/ O( A+ d( ]/ w
% ^! Q7 u! p5 I& y& l; q- public double getAttackPower() {) ]" ^7 N) J4 }! x T( }; v
- return attackPower;1 n1 y a' ?# X* j7 Y' H' v
- }) G1 T& C6 M% O" i
- 3 m7 A( Q8 [6 z1 W% x8 g
- public void setAttackPower(double attackPower) {$ W* L+ S" e9 {; |% @
- this.attackPower = attackPower;
; V! {/ s" G# [. G# n0 t4 b, A - }1 W2 p& `" \' b6 Y
- }
$ H" C6 R% y% Q. W* e
Скопировать код r) v; U5 ]9 c. E: B' \
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
6 l( ^: [. {. E, ^" E! ^) w
- N7 G" D% u' D' W- // Пакет org.l2jmobius.gameserver.model.battle; m' S' r$ Y O7 Y2 _1 ~
- package org.l2jmobius.gameserver.model.battle;
7 k6 F$ G8 O7 R9 m# {( ?
9 U: Q' j0 M% d9 a5 y% v( f5 h- import org.l2jmobius.gameserver.model.actor.Monster;
9 q6 x# ]4 R) n) n3 i: U - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
g6 E: x: i: f1 L; `5 K. {. a" A - import org.l2jmobius.gameserver.model.actor.state.FinalState;
, N5 t" e$ [/ M& z6 t - ! @/ ? i0 b1 D1 S3 P7 e3 P5 u
- public class BattleSimulation {1 s, r1 v! G7 c, d) s1 Y% b
- public static void main(String[] args) {
1 e' O) F9 {/ ~& ` - // Создаем монстра с начальной атакой/ q3 z5 u/ H6 ?3 X3 T+ ?. Y
- Monster monster = new Monster("Дракон", 100);6 c2 i& l# C; t( @! I: W, k
- 8 X0 c6 A6 \2 d2 r8 _" L
- // Начальная фаза# T$ c' ]6 B5 L3 k3 P$ v. T( J. `
- monster.executeState();# h4 |! j+ [1 C" z" c* @3 T2 s
* g: O: X- R4 Z, i( D, n) n$ `, }- // Переход в агрессивную фазу
% s" f2 U2 u7 e; y+ Y: w1 w8 N - monster.setState(new AggressiveState()); u3 Q3 H" W7 y# ]- R7 r
- monster.executeState();9 p$ S) b, x. R" z, K: I$ c
- : D4 z3 O) X; t' g9 l/ \6 z3 ^
- // Финальная фаза0 H. [& O3 F) O. D3 T
- monster.setState(new FinalState());5 q* Z3 V/ L- T( `
- monster.executeState();
1 o$ j/ i! S$ _* D - }
7 C& a+ ~" z$ R3 d J: P$ X - }, E5 L& k! D! a# [/ _, F
Скопировать код
2 n. Z4 [6 a& bКомментарии по структуре пакетов и классов:
- R0 D+ m2 f3 g- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
% ?7 Y/ a a5 b ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.7 Q$ [' s8 z. ^( i3 z8 ^ T
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!9 k( a6 R% N4 N( E3 m9 |
1 T( ]8 l2 p7 Y( i( s
- u3 a+ e% z: T$ j
C A" a: e& \# L! w3 L3 I; A; Z% k, `! c& B
8 V& |& J9 r- V0 A. M0 V
% r0 B& u" T+ n0 B- R* ^% t; o9 T. g# ^
- M: A3 ^1 e5 z6 {, D
% ` C5 e: T! k; M' Q+ \, ^
* x2 L/ a1 S; t2 q
+ N% Q& o/ V4 c1 E0 w2 j+ L
$ X* L+ X1 u' n" ^
6 I9 L* E, c. T0 `% [( J6 h3 i: P/ }0 Y' o5 W f# B
|