Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). * L' f" P: ]+ @) f, O' f/ z
/ L7 M( `6 F$ Q9 g( j
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.% W* K7 d4 X. T* G, N$ P5 Y; x2 s
' F- I2 T7 y* Q, Y M* O5 y, J; I
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.$ a7 ^/ s; u0 q9 P+ I2 D6 O
2 l) n6 B# q- r9 [$ X ? c
- // Пакет для состояний монстра
7 j1 S( l, f4 N& P( U3 u - package org.l2jmobius.gameserver.model.actor.state;
; \8 G+ @. ~0 K( Q/ {4 |% W
. F* t a0 P- y- // Интерфейс, представляющий состояния монстра
8 S6 o- L5 @! [! ] - public interface MonsterState {
9 g% D$ W; T* X* ~) F% ] - void handleState(Monster monster);
9 M- G- @' R8 O: [+ h; X0 \ - }" `6 G; e, T- K. t6 S# \1 G
Скопировать код * U# `. _& U/ m' ?
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. $ ~: [. t9 j8 o# C
5 m4 V6 g# s! D. w! e- XЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.' { z) J! L2 Y5 D
4 V2 n, B# l9 D9 W4 v2 S
Класс для начального состояния монстра:$ K) L$ d+ e3 K
- // Пакет org.l2jmobius.gameserver.model.actor.state
+ y5 I7 d0 `1 F' i7 ] - package org.l2jmobius.gameserver.model.actor.state;4 b# {) b5 Q( t; Q" _( z
5 E! A0 q$ Z7 a; K- import org.l2jmobius.gameserver.model.actor.Monster;1 ~% F9 [" ^$ ?. R/ z
' \9 h3 \. L" J+ Y0 [- public class InitialState implements MonsterState {3 d& ?; G L$ m" Y9 U
- @Override; y6 c& h! l$ o. S0 g G0 ~
- public void handleState(Monster monster) {
6 Z: x; K/ [, g# u8 B# w8 k6 w3 F - // Начальная фаза боя
1 ~1 h( ?* g4 s - System.out.println(monster.getName() + " начинает бой с обычной атакой.");7 G0 f2 Z: w7 S3 S4 }
- }7 T1 W* J4 ~3 M( q9 c) v7 X
- }
7 \5 c# D% ?0 q: ?! `
Скопировать код Класс для агрессивного состояния монстра:
, P+ r& P# r: `% N% c; m- // Пакет org.l2jmobius.gameserver.model.actor.state
( k8 O3 E) Q% C) v2 V/ ]6 e3 U8 _ - package org.l2jmobius.gameserver.model.actor.state;3 J- `4 Z0 O% U0 i' {5 C
/ \& g G7 i3 A9 `- import org.l2jmobius.gameserver.model.actor.Monster;# L% M5 w% v5 e' S9 c" k& D& ~
- $ l& C$ A; J$ B2 t4 G7 l! T) n
- public class AggressiveState implements MonsterState {1 z* v/ J/ E: E
- @Override" I; W& V, H# N/ i8 S% x+ F
- public void handleState(Monster monster) {
- a* ]3 x3 s7 J8 t$ O# L - // Агрессивная фаза боя7 G+ } u0 P5 ^( H, z
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");6 E6 |9 i0 ~/ H% C- x
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки. J4 Q* s. v2 v+ w8 ?1 p- D
- }
0 ^# N5 ^% O4 m4 r4 i - }
9 g; j+ J+ R7 B4 M% n5 F
Скопировать код Класс для финального состояния монстра:
. D; ?# {% _* [! v: u- // Пакет org.l2jmobius.gameserver.model.actor.state
$ I& u: \" X% l$ V/ Z' n8 G- X - package org.l2jmobius.gameserver.model.actor.state;
" J, {3 x. w5 V& d0 o - % v9 _' w }+ v
- import org.l2jmobius.gameserver.model.actor.Monster;
7 J0 u+ C( e5 X( i' W
3 z# U1 ^$ Y, M3 o; x6 Q- public class FinalState implements MonsterState {5 @% {: i3 s8 f) O# G9 ^2 \
- @Override- d" e9 ?3 \0 ?8 m h& C
- public void handleState(Monster monster) {
( E" {( p* C$ w" m" a3 E - // Финальная фаза боя
% L* L( P- O. b; ] - System.out.println(monster.getName() + " готовится к финальной атаке!");/ R5 Y. U" P4 v- ]9 m& m4 f- Q9 v& \
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки9 A; d3 E9 Q5 s. a- J6 u% d
- }
3 t! [% A, m5 u - }+ N4 {: {: x/ @2 {# c4 w& d9 ?
Скопировать код
9 Z; X! o) {* e7 h9 LШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
0 G% q$ I5 A" a/ @( E- // Пакет org.l2jmobius.gameserver.model.actor
% ^) B/ S0 ~+ N P6 x: t. ~ - package org.l2jmobius.gameserver.model.actor;# x, y: ^3 y; T5 y/ x& c* O
5 e" n7 n% m& n( z; A- import org.l2jmobius.gameserver.model.actor.state.MonsterState;9 B! l/ q8 k$ J% s# k$ ]% I2 y8 U
- import org.l2jmobius.gameserver.model.actor.state.InitialState;
_8 a0 V" }, R% e& u; N6 {8 h - 1 N% g/ s# S! \& I. K9 F
- public class Monster extends Creature {
1 B1 T6 q1 ?% `, ~; ?: v( S# U - private String name;9 |- G; w% Q+ \8 T
- private double attackPower;
& }6 E# S# K- ~ ~5 u; i- |* Y - private MonsterState state; // Текущее состояние монстра
& D; [% Y/ N# Z; T( K$ n1 l' k - & j+ U5 k4 `8 W V1 G3 O
- // Конструктор монстра
. z5 J- c1 @! Y: p) o. | - public Monster(String name, double attackPower) {7 C8 L: a3 F8 T1 p2 T3 E
- this.name = name;
5 q4 B( L* L2 C5 K - this.attackPower = attackPower;
: R- p% M$ _& _ - this.state = new InitialState(); // Устанавливаем начальное состояние+ {, N+ M% {" M
- }
1 s0 F# } m$ M. O1 {
6 k, ^! w P$ x- // Метод для смены состояния
4 V' Y9 P& c: r$ i! r - public void setState(MonsterState newState) {; A6 G* D. R; Z' j
- this.state = newState;, T* [# g# c/ x/ o$ E* v% g
- }
3 f% O0 n) j" T6 L; a - $ a. s1 q! f7 |5 U& x1 c
- // Выполнение действий на основе текущего состояния
) n% F" m5 _6 s7 F/ I - public void executeState() {
3 B2 p4 |6 M. A( |7 b0 K# n6 D* ]) t - state.handleState(this);& h) k1 o) t0 @5 T/ ^. g
- }" l9 A' D; @( k k' W! n0 P/ _: l
- % z8 I: S% Z, w
- // Геттеры и сеттеры* J; _/ L3 V0 o# ]
- public String getName() {, n$ ?4 d( U H. m% ~1 c0 g: K6 R
- return name;
E# A( U% }& N, b( k1 _7 u1 p - }
, m. c2 j% q( o# D/ `
) R. x7 J i$ [6 d8 m& u- public double getAttackPower() {' h# ~/ @ g# V6 f
- return attackPower;; C/ ]8 K: U3 g8 i: T
- }) `2 e6 G9 v0 j1 k# m) B% E
$ _+ ^$ { k! Y) f* H, W- a# k- public void setAttackPower(double attackPower) {; a/ I' O+ C! A1 Z; b/ S" C* c
- this.attackPower = attackPower;$ U( r9 w x5 x# `
- }
/ q# F6 T! V5 O- Z; |7 x: l: j - }" t3 x6 e5 e6 L; I
Скопировать код
7 h, {: x2 D5 l5 h. s: x. tШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
8 U9 A" i5 m, y, J' |
6 I' h, Q; p8 |: M) x! P% {- // Пакет org.l2jmobius.gameserver.model.battle
# I8 W: s0 `7 M: G d# t* z/ g - package org.l2jmobius.gameserver.model.battle;+ }& k( R" g6 [" q2 F2 e+ v5 [
3 k. Z2 ~; s. M/ M- import org.l2jmobius.gameserver.model.actor.Monster;
/ V: k! c" n6 q3 A8 ?! v8 z) x - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
. W% ?. C3 b# h% X: Y5 a6 O - import org.l2jmobius.gameserver.model.actor.state.FinalState;0 a! b9 n. ` p" i1 ^" |0 K
- 2 J& ~+ T4 B, h6 e3 F; k
- public class BattleSimulation {5 B0 R, H& n8 V) W
- public static void main(String[] args) {) w1 f, n& a3 w) p; z
- // Создаем монстра с начальной атакой7 k4 e! H+ i+ G
- Monster monster = new Monster("Дракон", 100);
' ^# _2 T n! V: S2 i - $ `6 W. m% ~) s% s. F# @
- // Начальная фаза
! K& S w1 L9 k# b2 h: r6 @ - monster.executeState();: E" l- }$ `0 q
' _, x( A+ S: E: e- // Переход в агрессивную фазу( j. U; n. A& v* R
- monster.setState(new AggressiveState());. o* O! i1 H8 T4 ~: {9 s) Z$ @
- monster.executeState();
3 Y" `/ s7 r: u6 y$ Z
% {+ l' Z; @% d, |7 }2 B3 F- // Финальная фаза
0 H+ R) _2 n9 x$ p - monster.setState(new FinalState());
3 C7 j- M: F* Y( g - monster.executeState();
/ m3 A# C+ i( S; y - }1 Z% A3 W8 l6 u$ C) x4 r8 v
- }
& I" q; M/ \0 j5 E1 a7 c
Скопировать код
, E# t: t) h; Y: ~Комментарии по структуре пакетов и классов:
- B8 H* K: n& j5 Q: o- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.& X# D$ N9 a( H, a9 g
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
; m& Y- J0 ]" vЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
' M2 R& V% R0 [1 s8 W9 x
' v+ U3 h4 y$ D( b+ G
0 [1 n% k4 B# n5 N' C0 K/ |3 ~$ |6 Q# v$ U
* E* q' @9 L3 g9 ?
3 c2 v1 f8 y4 g5 o" h, r8 `2 F5 R' o6 ~7 Y9 \/ V- T! n. X7 H6 N) ~5 L1 `
# O' X* Z/ @1 l) Y7 A1 a
' E6 A3 _3 @$ G$ D9 P( G/ W8 `
G" v. P9 N' R1 K: O
- R/ W. T/ v2 Z/ f
/ m& C/ v2 ^) D- r! j9 H" _' I
2 o ^. h: {/ b# `8 i G; K a. g p% A2 w( s. g [2 q' M* S
7 X9 H2 _6 s* D- y+ q) i m' |
|