Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
3 y8 ~7 l5 d& D6 L9 h: z R0 a
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
" }- N5 Z( ~* f8 B" F
* I: M* v1 i, }" `* M$ ZШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
6 ?1 d$ t( ]+ `8 d2 l" V# I+ T" B7 i. H8 N4 ]* H
- // Пакет для состояний монстра
" ~. r' L3 o7 O7 X+ R7 U1 \ - package org.l2jmobius.gameserver.model.actor.state;
. O! ]4 U, c- |0 q
5 B$ \' G1 ?) M, A- // Интерфейс, представляющий состояния монстра- t F) t$ b; `8 f, b/ K0 c: k
- public interface MonsterState {. K3 Q3 W4 e/ G1 h6 W7 U0 i
- void handleState(Monster monster);% N& y: K! R# v
- }
3 r3 K4 O4 y) L
Скопировать код # ^7 u% V6 _& T
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. ; c0 N x6 r0 E3 A* D
& i b+ q. i( z% `" {# C
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.% j" r; |1 i; u( M" a1 L
0 t8 j3 p2 @' G2 }5 o `Класс для начального состояния монстра:+ \+ b) Z. }% V8 ^ E9 @
- // Пакет org.l2jmobius.gameserver.model.actor.state
) s7 |) ~: E; w. d E - package org.l2jmobius.gameserver.model.actor.state;) p5 F6 h W) h+ S, {3 l
- 9 W4 h7 _$ W+ N! g
- import org.l2jmobius.gameserver.model.actor.Monster;
' }. h, k8 X9 p& u' O( O) N
! B: r1 T. g- L6 M! J0 n# f/ K- public class InitialState implements MonsterState {
d9 ~9 Q" r x: V; A - @Override
! z: i3 d2 V( _. R) G, P' R) X+ o7 T - public void handleState(Monster monster) {
0 i) ^% O8 H. Y) p( O - // Начальная фаза боя
( u9 k) R" T% ] - System.out.println(monster.getName() + " начинает бой с обычной атакой.");9 b! V/ X0 W" x) }: v
- }
: k @1 }& h/ W: S# n) N! x! l- G - }5 U; p; u0 Y' t. n& e" u- f& R( y2 J% M
Скопировать код Класс для агрессивного состояния монстра:7 u% T3 `1 {6 l5 O0 w& ^
- // Пакет org.l2jmobius.gameserver.model.actor.state& b- ^$ n2 _( A' Q r8 l
- package org.l2jmobius.gameserver.model.actor.state;9 X; e: e4 D+ G; o L
- 0 z1 V/ `# y X7 Y
- import org.l2jmobius.gameserver.model.actor.Monster;
( K6 K( `7 h* d
' S, f$ f" g: z5 S3 c- public class AggressiveState implements MonsterState {: X) B6 U Z$ N, Y X
- @Override7 q( \5 D. L$ x
- public void handleState(Monster monster) {
# M' F; q6 `1 a3 ?$ U) x+ e8 V - // Агрессивная фаза боя
i. }4 O& u% s4 @& w/ V/ Z1 v - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
~/ Y6 Y2 q. ]* e9 A% b - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки+ j, r' H) y% k
- }
% s! W, y( E* C u) F% H3 N1 u - }
# R: y( B/ h: q% b& k/ X
Скопировать код Класс для финального состояния монстра:
% c4 i& W" x; A' B, e/ z8 v( t- // Пакет org.l2jmobius.gameserver.model.actor.state* W) D% o7 V) W* p' e5 T) t
- package org.l2jmobius.gameserver.model.actor.state;1 `0 g+ Z8 N( |2 B0 t9 U: I
- * X& i# U4 j) _+ m$ L- f/ |) e! H
- import org.l2jmobius.gameserver.model.actor.Monster;0 l- }5 f1 J! d5 u/ [) O! O8 ?# c
- 5 Z) P3 [# ^% ~3 s0 v* q
- public class FinalState implements MonsterState {& m1 W: A. c. s5 P" [
- @Override! z6 `+ b7 a, ~% K; e8 V' R
- public void handleState(Monster monster) {3 |) t. q& W+ d: J
- // Финальная фаза боя
4 D! B; }5 N8 L) s+ F - System.out.println(monster.getName() + " готовится к финальной атаке!");. F* R- I) B9 T1 P+ X5 o
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки" y4 A! Z3 _# g1 t
- }& Q/ ^2 `& t2 W* _
- }
( r. w5 s& l. q0 F2 _: D
Скопировать код
' M9 b. ?4 p' [3 a. gШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.) G; Q' d4 J& g( f: o8 O0 L4 |
- // Пакет org.l2jmobius.gameserver.model.actor, V' T/ [8 g: `; V5 L* u+ o0 u
- package org.l2jmobius.gameserver.model.actor;, _9 X" v5 A. J% m5 k3 v" J7 l) H
. R' C: g, s8 ~9 a" f. |- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
/ ]- E2 Y$ J3 U - import org.l2jmobius.gameserver.model.actor.state.InitialState;: E6 n5 f: K2 ]5 K0 D
: M% P8 c* L% H8 Z: D- public class Monster extends Creature {
$ d4 Z. ~" l7 A% @ A. R9 ^ - private String name;
7 o% ?4 n x y2 r, b - private double attackPower;
3 X6 y& j; [6 s. U6 Y1 a/ b7 m - private MonsterState state; // Текущее состояние монстра
5 O8 `; p7 a' }/ @ - 3 p S' }% q$ P4 r" d5 j+ K
- // Конструктор монстра
% t' B) {" G, i Q1 d - public Monster(String name, double attackPower) {2 H. G3 F; b$ x% h& \' \# V; y3 }
- this.name = name;1 m) W4 g+ c) G5 r% e: u$ t& ^
- this.attackPower = attackPower;) M5 d' c8 x/ p( B! e0 W/ q
- this.state = new InitialState(); // Устанавливаем начальное состояние
: G$ |& p# t' o - }- l8 j% V Z/ @( @( A2 ? p! P) j
- ; f5 O2 T- k. S& D9 a7 u1 g
- // Метод для смены состояния
0 M: v: ?" u! ]4 C+ ~& `) Q6 b - public void setState(MonsterState newState) {
" k7 P4 [3 h0 |6 ?4 m' A - this.state = newState;
6 m" P# d/ v8 _5 _ - }
v# Q. d! ?- n9 e T7 n6 S - / P: W* l# C8 w4 Q/ x
- // Выполнение действий на основе текущего состояния
* n+ ~; b i- P5 U( @ - public void executeState() {- Z/ C H& ?/ }4 d; \7 O
- state.handleState(this);
4 `3 D+ A) \) d* _ m, P4 S - }
0 `9 a: a7 j( o - . a* ~6 D# J' T
- // Геттеры и сеттеры
6 R$ a% T8 ^. A/ y - public String getName() {) ]; H [% ^( q2 D
- return name;$ M9 }4 u% R) d3 |4 y
- }2 r3 u; g" X/ f+ i- l
: T+ }) B# C4 L3 i- public double getAttackPower() {. L+ H( E+ ?$ E! D! r2 T. g" L
- return attackPower;, C$ `% \% Z$ b, {& @8 v- V$ c
- }
9 h# Z; w4 d, c
8 ~* S1 O" J6 z$ [6 w- public void setAttackPower(double attackPower) {; t2 V) Y/ l6 N C$ X
- this.attackPower = attackPower;
1 J( _( a5 L) B - }4 |9 A) q9 w* Y; I! t( x
- }8 P% u5 S2 u8 l+ V7 U
Скопировать код
: ?/ w0 ~ @$ u1 q. G: A' }0 uШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
! w# V1 b" F5 [, x R2 V" T$ [$ @$ B+ A F
- // Пакет org.l2jmobius.gameserver.model.battle
9 @' e! s' L+ y% V" `5 F5 t* p - package org.l2jmobius.gameserver.model.battle;
/ `4 I' b W# C6 x5 f" j; @9 Y - . r" I; y, d. F1 R" @1 V
- import org.l2jmobius.gameserver.model.actor.Monster;: Y; _, ], N( i9 s& v' N, ` g
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;2 A# d# h$ S2 G, k% [1 o0 L
- import org.l2jmobius.gameserver.model.actor.state.FinalState;
' W* c+ w( {% Y$ Y6 D - a2 ~# S3 g- O3 X
- public class BattleSimulation {% _# o1 G3 y: @2 `; a
- public static void main(String[] args) {* z+ o% m% ^; L- ^* l: q
- // Создаем монстра с начальной атакой
+ o3 ^5 z- a* v8 P3 m3 f - Monster monster = new Monster("Дракон", 100);
, Z" E! W6 z; @5 ~$ c
8 R7 [# r1 B, F" k5 J; z( q4 k- // Начальная фаза
: @1 M4 t. j Z$ A) Y. {; U - monster.executeState();
3 l: x7 c9 i/ p2 F
: {6 b2 Y" t- c/ r- // Переход в агрессивную фазу- O' I3 l' h2 p8 p( }
- monster.setState(new AggressiveState());
a6 ]3 j/ n7 z. F - monster.executeState();# s7 v0 R- G, u) n- P. b
" E7 N) l. h g% N& Q- // Финальная фаза
$ h, M5 u: r- e; n% C - monster.setState(new FinalState());
" f: f x1 M6 \; D1 o+ G - monster.executeState();3 r0 o% q8 A9 P. I+ B$ \6 o- p
- }
# H6 i8 I5 B: O5 B3 w6 P - }# Q( ^- B0 W! c
Скопировать код `) \& L/ ]1 y- w4 j2 c" f
Комментарии по структуре пакетов и классов:0 u/ r7 Z# O; N' |$ S& ^
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.# E! d: a: ~. i. p9 t8 F7 v' B
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
/ O$ n$ X* ? d/ EЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!7 |2 b# P! |; r' Z" M X
2 }6 x' G8 s1 s" }6 A' N0 S E
( M# } T& r+ w- P1 q) A) P0 N$ a; W
% e) |( y1 Y- A2 h$ a! E8 |
2 A4 S: G- V5 {/ i _ B8 X9 e5 ~
; a0 l" R( S5 e3 W( a9 Q. G9 c0 q9 \4 U0 P; q; W3 M( U
8 W6 `7 ^3 g; s; k+ e
0 W0 D' v9 _0 k
r- n4 m- H6 f
" e/ Z# A/ M8 P/ O0 I$ a& ~" _. S/ y! B- n6 b
% v. a( u- o& Q# `3 J3 P9 F0 h9 w. x
0 e. w0 ]4 U$ z1 f5 ^
|