Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
. {' q* j3 u- F2 Z
1 \' `0 m( S$ w6 JЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.+ s& M/ i; b& e
4 A3 @; A3 O9 j* j8 w+ f
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
- V" x( t: q4 u/ {( \" E
% ~% L, U9 s- P* f- // Пакет для состояний монстра4 L* `, B' F' X. Z+ B' } i
- package org.l2jmobius.gameserver.model.actor.state;3 ~) @( V+ |! Y& b$ {" |
- + a- H. r- \8 E* r# A
- // Интерфейс, представляющий состояния монстра1 m5 B, B! Z, t$ a# v* j2 @
- public interface MonsterState {
0 p8 _7 S, R5 H! z3 W7 V - void handleState(Monster monster);
4 p J ^4 ]- J - }
! b9 Y/ j+ g" T8 r; Z
Скопировать код
5 y! W* T0 Q' mШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
# g/ s2 R7 P. _4 Q+ D4 P4 @2 O3 b H7 P4 `% Q* S5 l# R
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
& n4 W5 G1 D' F2 V9 Q: ]+ M0 V$ G- X6 R$ C) Z
Класс для начального состояния монстра:
. M4 c) D: Y8 Q% D9 s- // Пакет org.l2jmobius.gameserver.model.actor.state
' `6 s; A3 [. }; ^; S - package org.l2jmobius.gameserver.model.actor.state;* S. Z8 H1 N- @, j% h- |
- ( Y! K! h% v( F& G
- import org.l2jmobius.gameserver.model.actor.Monster;; c3 F3 P! V* F# }, J
- [* w9 @1 a( U0 ~1 O
- public class InitialState implements MonsterState {
6 j/ Q c. g* S6 ^ - @Override8 I, k7 }. q( k5 g
- public void handleState(Monster monster) {, @% g& ^8 H% T; [. b6 Z ^
- // Начальная фаза боя
( N" e" v3 U5 G$ H; a$ a1 Q, g1 z - System.out.println(monster.getName() + " начинает бой с обычной атакой.");
: b) l/ m2 q. H( C - }8 c! L" q7 {9 r& F% F ~. {* L1 H
- }! D; P: G8 x( e
Скопировать код Класс для агрессивного состояния монстра:
0 J$ L' ^' H1 U! x1 S/ {- // Пакет org.l2jmobius.gameserver.model.actor.state
. K& P3 K% h% f4 x9 D4 F4 c - package org.l2jmobius.gameserver.model.actor.state;+ J+ i/ w' D7 ?: s
% {/ F; p" v2 b7 Q& h- import org.l2jmobius.gameserver.model.actor.Monster;! Y/ _" u7 j# J2 a' b- G
' j. ~; l0 r4 O# u" A$ v' S- public class AggressiveState implements MonsterState {
* q$ S, ?" w z* E - @Override/ [0 W8 O% \1 H4 q Q4 q# X
- public void handleState(Monster monster) {
" _! @ r+ ^& `7 _. O3 F - // Агрессивная фаза боя
$ h# `/ e; O5 h - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
' I- |9 q% T- h i- B - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
; i7 w) L1 p1 J4 _ - }+ H* a8 i. B8 @, W6 ~
- }
0 y0 @! u" l/ C* Q
Скопировать код Класс для финального состояния монстра:" A5 `; O- t0 g+ n" N
- // Пакет org.l2jmobius.gameserver.model.actor.state
, g4 [' s. U$ E+ M' E7 ]& c8 j' O - package org.l2jmobius.gameserver.model.actor.state;' E. a9 |- s4 m
1 t$ \' m1 z& n. ?5 Q0 {" Q. [- import org.l2jmobius.gameserver.model.actor.Monster;7 L2 [3 N5 f2 a: o& |6 `* E4 n( K
- 5 {# S, I1 ~( k, N9 T) U# _
- public class FinalState implements MonsterState {
) G: ^/ a5 g' G2 s* I) S5 V% n; A - @Override* w! N* s$ m! l
- public void handleState(Monster monster) {( N3 W* G& |# x# w7 l" |" y
- // Финальная фаза боя
/ c6 j t6 y/ C3 Z- M" f9 J# ?4 v - System.out.println(monster.getName() + " готовится к финальной атаке!");, \, q( ~6 R- Q% F9 K+ n
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки9 O+ T, M* w: _' g* Z0 @* X
- }
' i) A6 b8 n- @3 X4 `( K* W - }5 T$ j. w5 I2 y G0 M& [
Скопировать код
$ ?9 P+ L* p& h6 e7 Q* nШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
; a" v9 N4 E5 z- // Пакет org.l2jmobius.gameserver.model.actor; B' V0 o0 Q+ H; b8 ^
- package org.l2jmobius.gameserver.model.actor;
( \3 @! v0 b, U/ Y: c
1 T- y) q! g4 J- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
9 A& N2 G) h5 N/ t J- v - import org.l2jmobius.gameserver.model.actor.state.InitialState;
& a( l2 r& u3 D' A3 p! t0 e$ m' s - , Z4 @& {/ d8 L g
- public class Monster extends Creature {
+ _/ g9 w$ n1 H' ?9 R5 H - private String name;
- z `) o0 T$ v( a! T - private double attackPower;, q% q# {4 ^: q$ U2 _; C
- private MonsterState state; // Текущее состояние монстра
8 V$ a8 g2 n R+ R! v
) T7 t& b/ o F' Q# s- // Конструктор монстра
7 m2 `) H7 ?2 x3 V! V7 m - public Monster(String name, double attackPower) { G5 d! W5 w# P) l- T- B8 n
- this.name = name;# s/ I1 a& I: y/ [ u; F8 T
- this.attackPower = attackPower;
0 O4 ]7 U( i, a7 L% z - this.state = new InitialState(); // Устанавливаем начальное состояние; O: B5 h9 Z) A
- }
: V" Y, E o% u - + T8 i0 ] N0 M" M
- // Метод для смены состояния
" o: C6 p& R! ^" J' y: d3 F5 [5 F/ d - public void setState(MonsterState newState) {
& M! i u* G% X; s, B - this.state = newState;
1 i/ k' M( N* m L" v; _ - }+ P! l6 V( }3 }2 p+ C7 D- b( |
- ) A" N4 `: r. k8 a* @
- // Выполнение действий на основе текущего состояния6 u7 ^) _. h5 z5 k7 r3 _! q
- public void executeState() {
+ G3 G4 t# q2 I1 w: U! L - state.handleState(this);$ I, K' S2 W4 V0 Z' u
- }5 Q) }: j6 U+ P. i. L1 z
1 v2 e: c5 D+ G+ g( {" m. l- // Геттеры и сеттеры4 j! c/ w z, O! l; k* o5 h p
- public String getName() {' Z# j. ]9 p- w- {1 k
- return name;7 r$ H9 Q1 j) P/ X# F' X N: w
- }
. K! f: c' l! S; s, P+ E( } - & ~# O. x O2 `. T+ x
- public double getAttackPower() {; P" p% _1 J8 E3 z* c
- return attackPower;
4 [9 \; |6 E& R/ J+ V - }
( p+ ~$ T; P! L& n' G
0 g0 v" H& m$ a8 h$ i+ o- public void setAttackPower(double attackPower) {$ k) s- T* D" r' s+ c
- this.attackPower = attackPower;# @1 K& ^# D( ` G; X5 o
- }
6 B8 w$ X% e9 [6 u1 j8 j9 U - }
% J7 ?5 I% Q" e1 G
Скопировать код
1 X4 Z. x* c$ G: o' {5 H8 }Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
, I9 z8 v: l9 t4 S* o! o6 P. h z# n" _- q% V$ q( b, u
- // Пакет org.l2jmobius.gameserver.model.battle
( a+ [* a$ d2 ~+ ] - package org.l2jmobius.gameserver.model.battle;; g2 H3 G8 y8 Q; [, S" J7 C3 m
0 }5 J+ q: j& `5 y* z# R; y3 w- import org.l2jmobius.gameserver.model.actor.Monster;) p3 P& B8 k, F' d: C* e, t. v
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
6 b. d7 n4 f) L- s - import org.l2jmobius.gameserver.model.actor.state.FinalState;. q% S4 C, n; v6 G
- D. R& N, K0 F2 Q6 R* `# a2 _& l- public class BattleSimulation {) Q/ v$ \3 P7 u* H
- public static void main(String[] args) {
- L# F0 p; G0 O" x - // Создаем монстра с начальной атакой
4 q5 m- l7 E1 K. a( v - Monster monster = new Monster("Дракон", 100);2 w1 A4 r X7 X4 F/ S) ~
% k. W) _& @, |4 C- ~- // Начальная фаза
+ T& u4 ^8 i3 w8 p# U& D; k - monster.executeState();
4 T, z2 C( p# W6 F/ o* ]! w
; ^( n4 {; B: U0 j7 S6 ^9 y$ o- // Переход в агрессивную фазу
" H6 J% ~/ H8 g8 X7 u - monster.setState(new AggressiveState());
1 H0 g0 D z- {5 D; k - monster.executeState();
1 F& e2 N6 W, K/ c/ F/ v8 h - ! y4 T$ d- g# y0 c: M
- // Финальная фаза
4 A% W9 T( y1 S+ K - monster.setState(new FinalState());8 k1 }( G7 u0 }
- monster.executeState();
5 {# A5 j( ?5 Z/ E# I+ g0 ] - }4 j. I" N! k2 _7 d, g& S0 F
- }8 C/ H) X1 ?0 e% ?
Скопировать код # z8 \# j' Y1 ~
Комментарии по структуре пакетов и классов:
! J- u( G3 q2 g- w3 V- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
% t! x+ g0 {2 Y" |" r ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.! W$ P! R5 [+ Y+ ~% B5 ^* H# a' A, f K
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!" d3 q) G, \& d) o x% l; b' J P
' `2 F4 v% x; A2 J( i$ [
* g# c; G- A8 b. O6 s
* S# g8 \3 m: g% p/ I( |
& m' c: ?, `, @
2 |9 X# o( t5 j' Q9 T9 v! e- w6 Y! `4 S1 b+ ~7 i. a$ w+ \4 Z5 I) ^
# @1 p+ A4 n- ^! I
d9 s# ^* q% |8 M5 E: v" f; G9 @$ m0 {. a. @! e
- c o3 d2 }# x
8 v% c2 q2 J; ~: y$ \. F" A) h
; k x- V( K% b3 Y5 y) N
+ T$ X7 h( k* W i. N! l7 n6 n- k6 b6 h8 c- J/ _
|