Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 1 ?9 M: W: P, }+ Q" N% k) y( i$ Y
% p4 @* O0 D+ R5 Q2 V
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
- {1 |( y6 ]4 j/ j# d; o8 k# f2 C* f5 m& Q% |; s" X
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
- ^/ Q j: k+ B7 l
; W F, `- l0 c* I' \- // Пакет для состояний монстра4 c% U# ?% e( X* C
- package org.l2jmobius.gameserver.model.actor.state;2 l% i! b% Y$ j! t% x) d
. N3 a. X7 Y5 y" s- // Интерфейс, представляющий состояния монстра
" k% \ O' R5 l6 T# o - public interface MonsterState {
4 x) l! O2 _* F. E - void handleState(Monster monster);# T# w4 V, p" y9 U) }1 {8 G1 ?
- }
; q9 G% T0 x9 d9 G2 o# k4 t! ~
Скопировать код
7 f. @- }% [) s6 V% ZШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. , V( L7 k( ^7 U: k( `4 R
9 x: i9 F1 h8 F4 b5 H, |; TЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.+ f1 M( q& C$ u* C' z
$ \/ S: `/ R3 `3 C* K
Класс для начального состояния монстра:
0 t! e: g8 A8 n; `6 x- // Пакет org.l2jmobius.gameserver.model.actor.state _- s- T _8 T9 A/ U* I' ?2 |
- package org.l2jmobius.gameserver.model.actor.state;1 ~/ c2 _" R9 i7 e
- ! n+ z+ N( |; C3 K# K: r' n! j9 ~
- import org.l2jmobius.gameserver.model.actor.Monster;
5 l- o" R: ^; m. E2 ^ - # U! t- C9 S R' X: B) H6 X& }7 I
- public class InitialState implements MonsterState {
" K2 e/ S# D6 q( J, ~ - @Override
, W1 Z6 G% q) B1 w - public void handleState(Monster monster) {
) j( t8 ?5 f6 R; b$ f - // Начальная фаза боя
5 j: C5 u8 @+ Q0 ?" [1 R) _# `1 Z - System.out.println(monster.getName() + " начинает бой с обычной атакой.");
( g$ U/ L, s% j0 z3 x* h( s, j - }; O! w6 o3 Y) ^( t1 o- c
- }
; a7 I" I/ {$ _4 `
Скопировать код Класс для агрессивного состояния монстра:) K* q' K* ~6 L1 w, \# X
- // Пакет org.l2jmobius.gameserver.model.actor.state
4 x7 m% E6 }0 ?7 y- m. \5 f - package org.l2jmobius.gameserver.model.actor.state;3 A$ d. a, Q3 D7 j: l# {, c
, q* U) n. B! l; O9 U- import org.l2jmobius.gameserver.model.actor.Monster;
. v5 s. l2 i& a7 l( @ - 8 G9 D9 ]+ Y- m: V8 q/ |
- public class AggressiveState implements MonsterState {3 J* e: i- z" s9 I$ F2 d1 Y4 ?
- @Override# \" u) a) T) A F3 l7 t
- public void handleState(Monster monster) {
1 o" z a* N L+ m' h/ I - // Агрессивная фаза боя6 z. c3 q, [3 t- v w
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");5 C6 x9 N. F6 W9 W+ ~! D6 {
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
& y8 g; t6 ]3 ~& h& \ - }
; j- f& z! D1 F& G# @ s - }
+ b! V/ s) D0 J8 k# I
Скопировать код Класс для финального состояния монстра:
! F3 Q) _/ Y$ [$ v* d" k$ K0 T- // Пакет org.l2jmobius.gameserver.model.actor.state7 Y4 _3 g) d& w0 G$ s
- package org.l2jmobius.gameserver.model.actor.state;
$ T( Q7 A# D, {% Z: Q o. D - + P x6 X5 ^! f! h# A: U' w* J9 U
- import org.l2jmobius.gameserver.model.actor.Monster;
% |( I. l/ }+ h, |) t/ P& m8 H - * \" s2 i' k1 o F1 Z8 C) [, _2 m
- public class FinalState implements MonsterState {+ M6 n) V- E+ n$ O
- @Override3 e) i0 s: X1 W5 \6 A2 ]
- public void handleState(Monster monster) {
! J8 O9 \5 M- |7 p4 r, q" W% W - // Финальная фаза боя
6 r+ f3 r- Y& ~! B! C& ] - System.out.println(monster.getName() + " готовится к финальной атаке!");
' J. t' R# a# n6 J$ `& F - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки/ k- M0 f0 V# L' ]
- }
) I' f% R9 U9 |7 X/ Q6 C - }
/ t1 F# v* ]6 X- ~+ }2 b5 F$ r9 D' p
Скопировать код : t) K+ @8 t6 n) z% I+ p
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
/ O% v& K. `7 s) }- // Пакет org.l2jmobius.gameserver.model.actor' V' K; d% {& c6 y
- package org.l2jmobius.gameserver.model.actor;5 Z1 P9 }/ t+ E$ [# t' o; ]' e E( C9 H
, Z$ a. C' M+ |6 G& L9 X- import org.l2jmobius.gameserver.model.actor.state.MonsterState; w3 F+ @7 `# }! U5 D) j
- import org.l2jmobius.gameserver.model.actor.state.InitialState;4 y. b0 u; |! ^# E9 k% V
- 8 q9 D- X$ o+ @; E, O+ w6 {9 y
- public class Monster extends Creature {
! \* F2 n R: {" Q& L8 _5 H - private String name;
1 f) A8 M, f+ B: r) d7 W - private double attackPower; [4 p; B) n' E* A. g% V- b/ Y4 ]
- private MonsterState state; // Текущее состояние монстра9 Y+ U6 \; Q' y* L, B
8 T/ [8 N5 m5 A9 u; n- // Конструктор монстра- S8 a' H: Y/ i" v. f
- public Monster(String name, double attackPower) {
1 s7 @5 S$ G6 u - this.name = name;
( R* s& F$ S z. R8 f$ d, T6 _8 E/ F - this.attackPower = attackPower;
% q3 i: E+ x5 m' | - this.state = new InitialState(); // Устанавливаем начальное состояние
- e( K9 P3 g" ~ - }
% y8 U& L# E5 _+ a+ c
* _8 v+ T7 r6 w% T) q- // Метод для смены состояния/ K. p5 A4 @# P, l
- public void setState(MonsterState newState) {
$ d: C5 J9 p/ m8 o5 X9 n( P; P - this.state = newState;
3 \; ?# ~, d! G/ d0 K6 }; |% { - }5 i2 e U. H, S, p: h
- 4 c9 r$ r$ D. g7 V
- // Выполнение действий на основе текущего состояния; J( x1 E9 I. Q& v2 d* J
- public void executeState() {
8 @& |9 j. B$ g$ R6 S/ z - state.handleState(this);% B e9 L# v; `) k
- }9 w, F, s2 b0 h2 F3 g* W8 z4 _
- # P8 J. E9 B; U! C9 G* Q# J, F9 ~
- // Геттеры и сеттеры
6 C2 h2 Z5 ?# G" L$ G - public String getName() {' m; v% d8 D1 a$ a* E( F# Z
- return name;) F3 G) D" {! P( _% W W
- }
8 C% c' }" g8 [; M# D - - ^/ X# z i$ l+ Y% B5 i, c# i* v
- public double getAttackPower() {
W, [9 L d& X4 ` u4 I - return attackPower;
8 w6 w+ v0 R9 ? - }2 E! [8 O! I. [, v. S/ r) S& r, g
9 X: u* ], a: ^5 v- public void setAttackPower(double attackPower) {: V7 ^" N$ h9 W; a& j6 w
- this.attackPower = attackPower;; X# b1 v& p, b( S7 E
- }8 F' [% s; y" s# ]+ Z' w9 `7 H( N# Q% D
- }* P% ` N, E8 _9 B: Z
Скопировать код
2 y$ ]3 ^3 r" @7 }Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
. y' Y4 b/ N3 L/ h! B, c! _6 g8 {$ f4 L& j4 Y
- // Пакет org.l2jmobius.gameserver.model.battle( s- g, e& O" h6 C' S" L3 G: t
- package org.l2jmobius.gameserver.model.battle;5 B r" ?/ F' E+ t) Y0 v6 [+ S
3 b5 K5 s* [. v. E$ b, N- import org.l2jmobius.gameserver.model.actor.Monster;
8 n! f" U% V0 ?& Z) S) L' u - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;9 T1 m) t6 @/ n8 [2 }# e
- import org.l2jmobius.gameserver.model.actor.state.FinalState;. U& Z0 j2 Q2 Y' T
4 `1 ~6 O& a) h* P- public class BattleSimulation {% }% M& l5 V; P. l
- public static void main(String[] args) {- _ G) u% j$ ?( o$ r5 f8 C W+ i
- // Создаем монстра с начальной атакой" r4 Q2 j9 t; C" Y0 a+ X. E
- Monster monster = new Monster("Дракон", 100);' f/ Z) R, N: Q- }0 }
8 q" D: W' X( Q6 X- // Начальная фаза5 o/ R- k5 a2 n3 {
- monster.executeState();2 ]& ?( A2 t) g( O6 B
- 6 ?7 \$ ^# d3 k c$ @
- // Переход в агрессивную фазу& _5 o0 @, z5 A4 C) O) ~' `1 a
- monster.setState(new AggressiveState());
* K0 i) |4 c+ y5 z. R+ p - monster.executeState();, b8 T. k* Y4 ~# V! Q2 [* ]
5 _; J5 L) k- \+ `: Q+ u& }/ q- // Финальная фаза
. Z9 n9 \- O" H# U& O7 E1 J - monster.setState(new FinalState());
) ^+ O2 P3 L o7 ~* S& l, d - monster.executeState();) y: f: a5 o1 _% p/ Q
- }
# r" V& v6 A2 e; r - }
7 U7 A4 Z, {! Q8 ~8 u
Скопировать код 5 `$ k6 Y' N, O
Комментарии по структуре пакетов и классов:
3 [: M/ B; x" n8 W1 C5 W/ F- R- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
5 o3 \8 A3 \2 X5 [4 t( S9 S8 U ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
$ H0 ^0 F$ n+ g% yЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
1 q! v6 S0 L6 r2 r* W/ |- C) r+ u
$ Z! x; {9 S- q9 t1 I4 m* c$ z0 b/ N6 ?" @3 j! X$ t
& x$ f3 j% I# y" e% w, o1 _! I. G. t D" B
; E( L" K9 Y. d2 P
. w) {" i1 v& b6 Y* @! ~" ^
; p5 C2 a$ c- d! [+ u3 J: f' Q4 S8 D0 S
! m- V& Q" G( c( n, q7 H% {2 u0 u
+ O# g5 a) R. W/ {8 L
+ U6 d5 \) J7 C( w- K) S9 z4 }5 c/ N5 G) ^& S
/ z: @0 b# W0 _4 i: \: R
/ Y1 {8 s" f$ w+ t
|