Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
1 ]+ z: ]# P) Q$ `* y: v3 ^- k r5 E
" T* T# x; Z/ i7 NЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
. u: C, f) w8 p1 ~0 l& x. w: \( h. K- Z4 \3 t6 Q& Q6 t
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.6 F! [4 h2 A: G0 ]& V. H( u
& J; u# ]3 p4 }: G$ h; U* P8 D- // Пакет для состояний монстра
! Q/ k) O" h0 z3 Q$ ]0 @6 T - package org.l2jmobius.gameserver.model.actor.state;0 r- u1 t& l7 ^2 D, E7 V' `
- " V' \8 J" h5 w$ q3 I+ h' J# I% L
- // Интерфейс, представляющий состояния монстра
% { K4 _, C* ]2 U* w - public interface MonsterState {
( D/ V: V) p o- V - void handleState(Monster monster);
; ~* P H% T9 [" D# n+ f5 c - }
: V, o5 {" ?) V0 O: M$ D
Скопировать код : p2 P8 X5 n6 j2 Y
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
% b, ]4 V0 V, B8 d7 Y7 V9 e
5 v3 ?+ K. N. l) Z1 pЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.( |8 G7 t6 \+ a6 ?- {, b' j
5 b: Y7 O1 }3 X$ s+ o
Класс для начального состояния монстра:
& O9 o! p7 }) A4 E) W8 A- // Пакет org.l2jmobius.gameserver.model.actor.state2 k3 H) u7 ]* r n) t
- package org.l2jmobius.gameserver.model.actor.state;
( m4 }- F1 L3 g! B3 m& J) A
7 `4 G+ y$ b+ P- import org.l2jmobius.gameserver.model.actor.Monster;
* U0 T/ V c, h" |6 Z) c - , I9 |9 k. K: N% `# F; M) q
- public class InitialState implements MonsterState {: D _5 R# V$ U0 r4 u: H" J; M
- @Override9 P" e+ g' g& X3 J7 V3 W2 i2 R# M
- public void handleState(Monster monster) {# o5 M( M% `3 e" d
- // Начальная фаза боя
- E i, |$ R5 @ - System.out.println(monster.getName() + " начинает бой с обычной атакой.");
' q, y. o/ P; k0 X3 f. G - }" k8 U9 L( r) w: U$ i1 C. V
- }
/ E& b+ E+ K: X0 X% h
Скопировать код Класс для агрессивного состояния монстра:- E( `$ P' w+ S# b+ s* i/ F
- // Пакет org.l2jmobius.gameserver.model.actor.state
- `9 N+ e9 q/ \- u8 _! b' X1 S - package org.l2jmobius.gameserver.model.actor.state; s$ T2 v& N/ m
- 3 k. T) y) A6 U% S, O8 Z
- import org.l2jmobius.gameserver.model.actor.Monster;; C# t7 R7 [5 t
- / e2 F" M8 v- X; i
- public class AggressiveState implements MonsterState {8 M$ C& @9 @6 [" G+ ^
- @Override
+ b' O, l" e0 n l. z6 a+ g - public void handleState(Monster monster) {
% e, E" s3 k$ `) S, n6 B - // Агрессивная фаза боя$ K- |: y- z: c& h$ M6 C& n
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
7 v( C. w) z( z1 ~# D - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
* |+ J- I7 |& J& d1 ~. E - }
! G+ p& n% k) F# n# o - }7 B( B9 e7 T$ q" Q, d) a
Скопировать код Класс для финального состояния монстра:; |8 _ c2 {. D2 [) B5 T) k2 e
- // Пакет org.l2jmobius.gameserver.model.actor.state
; Y+ t( S* {# g& v) w! z - package org.l2jmobius.gameserver.model.actor.state;
! C' T# m9 W. F+ V5 q4 i# x* q - # l' k; l0 c" q; F5 L; R
- import org.l2jmobius.gameserver.model.actor.Monster;
7 {9 P s7 Y! Q7 ?0 {8 u) |+ c* }' Q
& T! c2 s9 H; T i( l1 u- public class FinalState implements MonsterState {2 `; b* ? K0 Y; R- _
- @Override6 {* V8 F% |4 ~5 ~ X' _
- public void handleState(Monster monster) {
% P* R( Y7 o, M( C4 Q' x9 o- C4 e - // Финальная фаза боя0 b, @2 m: |- v
- System.out.println(monster.getName() + " готовится к финальной атаке!");; u& p6 s* O9 X2 E! O
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки( n4 J+ R! t1 ^
- }+ Z* p% j& C- J) V
- }; @4 |' u/ Q8 M& |) p0 Y
Скопировать код
- y+ t) Z" O q" D% ZШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
4 D: M# y+ e0 K3 H0 c# b! i* C# k- // Пакет org.l2jmobius.gameserver.model.actor
( g& F, `% G4 U. D& V - package org.l2jmobius.gameserver.model.actor;( D. i/ j/ O& O) N% a
- 7 v! x% k8 @* L4 D( k- z# ?0 V
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
7 h' ~2 ^* z4 g- m - import org.l2jmobius.gameserver.model.actor.state.InitialState;
. {1 T. v* @8 ]
* k: O# \! v% Q/ [: f- public class Monster extends Creature {
$ y1 C& C3 c8 l7 I& G - private String name;$ s/ t* J& Q u6 S" `! D
- private double attackPower;
) W) r2 Q$ D+ m1 Y5 L - private MonsterState state; // Текущее состояние монстра5 G/ J: _2 t L2 W, C
% D! A( C0 m' }6 H% F/ K% K4 x- // Конструктор монстра
( t5 q% ?6 ^5 T - public Monster(String name, double attackPower) {
* V& M$ z( e. ^. n# l' g - this.name = name;
& [1 H, y: }, V+ M0 T5 }8 c - this.attackPower = attackPower;5 F+ W& U4 z4 g
- this.state = new InitialState(); // Устанавливаем начальное состояние
( ^2 S: G2 K% d - }5 T n! R& b* B% } R" D
+ H$ w' R5 k; n3 R& l9 ^' K- // Метод для смены состояния
3 C- a6 y- ]! t `3 ~9 T - public void setState(MonsterState newState) {5 z/ f( B# }& d; J* a% q& {
- this.state = newState;) a2 f+ \: _5 k, W
- }) ~7 q; {& i/ n7 c1 |
- . \+ f% U5 l+ C# e
- // Выполнение действий на основе текущего состояния
4 V" ?2 Y/ N9 T) O; t+ F& U. P - public void executeState() {
4 c+ [7 E7 J% V8 Q" s" t/ L - state.handleState(this);
; R, a: L7 @. N( |) ]5 i - }$ R: q2 R) `: q# C6 C1 a
- 4 j3 s( _2 n0 Z1 Z9 P6 c
- // Геттеры и сеттеры
2 q+ K. v# d' \ - public String getName() {+ Q5 i6 y, Y6 {" G% h! r
- return name;
. R3 O& V& R/ }' Y% [ - }
7 X7 h; w$ y" N. \( P) E. Q
c. ?. j) I5 o6 V; \8 k t- public double getAttackPower() {5 G9 { ]/ o' D
- return attackPower;
" g* B7 D1 Q# a6 h3 e' A- I- X - }
: ]! }7 f8 b# A8 q& j
. E9 A; @0 U5 Y' f; {- p' @- ^( q) a- public void setAttackPower(double attackPower) {2 N8 f& o3 G& l% e' ]- E Q
- this.attackPower = attackPower;
$ C3 ^/ _' \) p. F3 F$ w8 Q2 ` P0 A - }; p& _7 O2 [# L: x F3 `2 `
- }
2 s3 I, M% L4 _ Y+ l
Скопировать код
% ^5 ?3 D- U2 M" q* v2 ?; Z0 fШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
$ L) G: S/ K6 F+ A" x$ B0 ]- @1 k. b
- // Пакет org.l2jmobius.gameserver.model.battle
/ ^7 ^" H5 w' i. L& \5 O# a0 P - package org.l2jmobius.gameserver.model.battle;
; O$ Q0 _/ m! ^$ n' j% \ - + S# Z- U0 |( ?' {
- import org.l2jmobius.gameserver.model.actor.Monster;. Z- T4 ~' K$ m- @$ V
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
, J8 b& `2 w+ z) \. ]# ~6 B - import org.l2jmobius.gameserver.model.actor.state.FinalState;5 B: U7 f: M) k+ \4 u7 H+ O" J' A
- ; }' A* A2 C$ z2 C6 y8 ^% C9 [
- public class BattleSimulation {
$ a( o% ~, n" G. V8 I) } - public static void main(String[] args) {: c# ~- [/ m- y' A% n# o
- // Создаем монстра с начальной атакой% H( ]9 l/ X* |7 V- ~
- Monster monster = new Monster("Дракон", 100);
3 _ d5 x L: f2 e5 @5 A) C6 n# H
( N- P! t& h& ^( X. ~1 m" G- // Начальная фаза
) l5 p9 |# {7 C6 A - monster.executeState();
/ k+ d9 f8 x% ^7 {+ {" O: d5 P) _9 W
/ q4 G: S+ Q9 O9 i- // Переход в агрессивную фазу1 o& i+ I% u) I" W$ Q- N5 I1 T
- monster.setState(new AggressiveState());) o6 \! W F1 f7 z7 R8 v9 }9 @
- monster.executeState();
$ r- H& R! p* c$ v. G" N1 P6 \% s - % {" O; D/ e, M9 t' \
- // Финальная фаза
9 E- h* b' V& {; l2 w - monster.setState(new FinalState());; k: K: F) u- p
- monster.executeState();- f: |7 l: C; n. Y0 ~! t- U
- }
" {: }# ?) L4 Q# R/ X, J - }: X( \- S1 k6 |6 f, v, }
Скопировать код * M5 Y5 p5 a3 b! `( w
Комментарии по структуре пакетов и классов:" Q6 ?+ d: ^9 |8 b
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
6 I, k$ ?& B" H+ l0 W2 f) F2 ? ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.4 j0 W+ R3 p7 n4 b
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
6 h" y2 i* F' Q" X, R5 l8 f) l( s
( a; L f8 S. [% v5 J9 C4 [
1 O. f6 I% n: b) R0 r& }6 ]) m5 z
: r/ s _8 Y& Q0 F- d% S( _( r D5 \: C# t' h' K
' w2 p4 l4 `7 @/ S g
3 r* D+ W# x/ \7 K) o1 r* H+ k6 X# _" m
: W( ]7 g3 ], ^- L
- ?) ?. v' ~/ O) u$ _
, m0 P6 b& [4 B$ `" K: A$ ]2 L9 a' q$ R: r& M) W9 h! l0 t
# p5 F1 Z# q$ Q0 j3 n9 u
4 D( X# ?' U' U5 J% Z. U, ~* F |