Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 4 K8 b* K$ ~# D0 A b% b
8 P% L6 s- a* K7 u' b2 PЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.% r8 v, q4 {7 e9 p% n' |" u
" [* e4 x$ |* C8 q0 W; N
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
" b& y0 n/ e1 H# p
8 d6 k7 |' {+ \6 \, p% i9 W) T- // Пакет для состояний монстра
) H. z% W7 V Q) N4 F* ^ - package org.l2jmobius.gameserver.model.actor.state;
6 Q2 M( Z0 W, w6 t& A+ s" I - & @3 H- r6 l! A
- // Интерфейс, представляющий состояния монстра
O7 F$ R6 o9 D - public interface MonsterState {. R L# s( S* S/ o$ z( B# o
- void handleState(Monster monster); c4 `+ t8 J5 F0 k
- }
+ y9 R5 h. F% U
Скопировать код 4 U6 A, B2 ~; r6 B/ }! V
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
+ A, J0 {1 ]# B" X8 t0 Q! Z* l% j* b8 Q4 ~+ w8 o
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.5 Q; c) W) t+ f6 z! K N4 f" T; G
9 ]' `! y) r* ~+ w0 Y% yКласс для начального состояния монстра:
( d, N( \7 o0 w: n' c- // Пакет org.l2jmobius.gameserver.model.actor.state/ a/ m9 k! \! B& D! X
- package org.l2jmobius.gameserver.model.actor.state;' n& b& [; h4 g w
- 6 u. {: S" `. J
- import org.l2jmobius.gameserver.model.actor.Monster;
+ u" g# z2 P' ^& p" s6 |7 I) v" b% ~ - 2 Q1 h* @$ n2 h5 X
- public class InitialState implements MonsterState {: T' i. N( A+ P s7 s) x8 M* ~
- @Override* D3 J8 Q8 X5 o3 n y9 P" U0 e5 Q5 }
- public void handleState(Monster monster) {5 e! G) W: M) J8 k
- // Начальная фаза боя3 Q( R3 J$ j! W2 A) a% t
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");8 Q$ N! y# `8 z; R6 ~
- }
+ t8 O# v' o4 ^ - }% @- t( c/ ?% A9 m
Скопировать код Класс для агрессивного состояния монстра:
0 J @* b, Q/ l0 w( l1 P- // Пакет org.l2jmobius.gameserver.model.actor.state
4 h- G) A3 }9 l - package org.l2jmobius.gameserver.model.actor.state;8 r( c% Q! [5 | t5 M* N o E
M4 ^5 F. i/ k; F$ Z- import org.l2jmobius.gameserver.model.actor.Monster;
# b% j8 J/ A7 B! C* N J* \3 ?: B - ; S9 e# B$ ^' C0 Y8 K/ P
- public class AggressiveState implements MonsterState {; s2 K' ~2 W' e
- @Override
) N" |, ?* n& B6 S - public void handleState(Monster monster) {
) }, x8 \- Y( o# c' ] - // Агрессивная фаза боя
) n4 W+ @- `+ U - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
6 Z! c5 P' [% Y6 P( c3 Q - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
' K& B! |: }0 X2 i" [4 s+ q - }' r3 q# w0 ~1 } Z
- }
" `4 ^; s x4 v$ o/ Q; V5 Y3 I' [: a
Скопировать код Класс для финального состояния монстра:
$ w" g* T/ g3 E1 ]+ j- // Пакет org.l2jmobius.gameserver.model.actor.state
) [& S% N! S) J1 B8 E: v8 H: y - package org.l2jmobius.gameserver.model.actor.state;
3 s& [6 w' P4 a4 { - ; w2 f8 F0 d" i1 r5 p; o
- import org.l2jmobius.gameserver.model.actor.Monster;. B3 l! T. X) ~# [! p
- - a0 F$ N$ W5 W7 z4 u8 n
- public class FinalState implements MonsterState {3 F( K- S9 J4 B1 W& Q
- @Override
& t+ ^( |4 z$ Y* v' M - public void handleState(Monster monster) {3 d2 i5 Z9 N! R* J1 f& k0 G
- // Финальная фаза боя# F% j0 E4 ~& T! S2 E7 i9 ?
- System.out.println(monster.getName() + " готовится к финальной атаке!");
( Q" @& z# `: B8 D - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки' \# j9 A) C& _
- }
$ J/ F, ?% G$ G6 m A6 u2 z - }
+ X$ S0 {7 w; [" B
Скопировать код 3 A5 H' q" [; Q/ H: {+ [" Y- h) \
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
# u; x# g7 G5 y! D- T- // Пакет org.l2jmobius.gameserver.model.actor7 f Y Y! G$ ~8 c7 X# ^
- package org.l2jmobius.gameserver.model.actor;, ]5 Z; h+ j; R! ^6 [, b6 @: @0 _
& F. R. G/ e$ E) _' G, o( Z0 q- import org.l2jmobius.gameserver.model.actor.state.MonsterState;( p4 O' L$ V( W ^
- import org.l2jmobius.gameserver.model.actor.state.InitialState;
5 t) E2 e7 z! O, l& T
) H# J! l' D) u- public class Monster extends Creature {6 A, d. Y: p# ]+ [) u/ y0 Y
- private String name;
# [# j+ H c% l B) y- ` - private double attackPower;# S, r1 G. m! k) S
- private MonsterState state; // Текущее состояние монстра
' U$ r$ n' m% { - * h* Y% U2 }# y) [: `7 h
- // Конструктор монстра8 Q# h/ b k4 @4 F5 P# t
- public Monster(String name, double attackPower) {
, O7 L8 w1 C, @ - this.name = name;
$ {9 G$ d# k! n0 B" ^' ~- t - this.attackPower = attackPower;
) U2 R' x8 [! j& Q" ]$ T - this.state = new InitialState(); // Устанавливаем начальное состояние
1 ~& ?7 f7 J1 Q - }, R5 f _, h5 y: m7 S$ n
- 1 f) }: W4 Q. @
- // Метод для смены состояния
* }2 K, N3 M; Y - public void setState(MonsterState newState) {
. ^' ^3 L; ?" D, v+ E& T - this.state = newState;
4 k0 c4 T, o# R8 I) k9 ]7 V' Q j - }3 t3 n( o3 R' {" |* H
- : k% A0 @% y* l2 S4 W: c. ?* B
- // Выполнение действий на основе текущего состояния# ]1 P1 R4 j8 m j4 f
- public void executeState() {
5 _5 A4 C0 }! G1 F - state.handleState(this);
( s; P# P. h( r# D - }5 E, K3 W- {$ w* z1 ]
. A" Z$ `+ k! o- // Геттеры и сеттеры/ Y& k4 \) g: C
- public String getName() {
: ^6 c+ d5 {% C9 r) D - return name;
8 `0 g8 _' v8 v1 Z; X: G, | - }
* Z5 W/ J) z/ T1 P Y: A
2 j- [0 `5 ^$ H8 K7 P: H+ {- public double getAttackPower() {
: a0 \ z3 q# H - return attackPower;; r2 l9 }$ }& _% {. e6 Z$ g5 N( W8 F
- }
8 _2 t, P6 J& F! o6 P
% N8 ^ e, T6 u+ S' e- public void setAttackPower(double attackPower) {
P% ]: }# h. |" | k - this.attackPower = attackPower;
( v r) P! V" g - }+ v& w# M+ p/ D, s- X) W: ^
- }7 A5 b% Z/ C K7 c
Скопировать код
: N/ E( a! I: {Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.. {3 U6 e6 V1 E3 S4 L [* s* D
3 w+ k' b7 _( V1 d) ]- // Пакет org.l2jmobius.gameserver.model.battle
& @2 B! a, T& w! p; y - package org.l2jmobius.gameserver.model.battle;5 e7 C6 Y! D" ?$ z W, W* C( s
- 2 y) C6 u" i* s: D
- import org.l2jmobius.gameserver.model.actor.Monster;* B2 e8 [1 T% V
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;# i- [ k9 h$ q) m3 k0 j7 b
- import org.l2jmobius.gameserver.model.actor.state.FinalState;: X6 a; x/ J: M3 |
# v6 v* G; Y# d" G; ~1 `! v, N- public class BattleSimulation {
% J9 k0 |1 T2 h; l/ } - public static void main(String[] args) {
; d( S3 t% i! c( b& V* g+ Z) O/ N - // Создаем монстра с начальной атакой
9 V2 k h0 W( J5 U - Monster monster = new Monster("Дракон", 100);
' |# q6 x6 v2 Y; k, Z9 N& u
- Z6 h$ _$ X3 F+ Y- \+ j+ Z2 _- // Начальная фаза: B5 j9 u, J) ^2 ]( S2 {
- monster.executeState();! E6 z5 Q; u) R& K2 \' a
- $ ~: u& {8 D8 ?3 \: s
- // Переход в агрессивную фазу
' b$ o6 }0 m1 W0 T! d4 d1 r. Y - monster.setState(new AggressiveState());5 M% r3 e9 N( m9 n
- monster.executeState();3 ?% \- f/ i/ o: @
% u0 D2 w0 N3 R$ h& z7 o- // Финальная фаза' `9 x. G+ h5 V$ j+ j
- monster.setState(new FinalState());7 E( f# K o# Z( {& F1 Y" }2 C" X- J: w
- monster.executeState();1 D% R9 p3 A+ e9 v6 I% [6 ^! T- r$ _2 v
- }4 L. v2 j$ F: v4 c' F8 ]
- }2 B! `5 R2 ?& f" ~; Y$ i8 B
Скопировать код
* z$ e1 N$ r$ C. {Комментарии по структуре пакетов и классов:8 N, x% j# v3 i/ ?1 n% ~' f0 P
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
+ W3 J& w" ~0 b' o0 A3 X& [ ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
2 Z" ~* Z2 u7 v) D) o R tЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
; ]$ Q5 ^3 } b& u5 C [- P# g
! l6 y* M7 e6 j/ Z% d$ `, n, L: N1 R4 _8 N% t, g' O
6 z8 U# S7 w N7 k7 U3 F% L- ]! _( }2 T/ V6 Q. j
* v+ P* d: n2 \- W( j. i' C# |' g! }* r
" ]) A1 h/ ^8 r' ~( s# |
$ u1 ^- K+ h7 M: }- u5 c1 y# Z: c; |" v4 D( h
$ y- k5 N5 }; W/ d5 x" o ?1 W5 o8 z- n) E
* Q4 P6 ]' X% \- E* N! k: B' A: g+ Z2 r: k+ @
6 U% O$ d) h5 u2 x8 c# [$ ~
|