Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 7 _# r' }3 A+ P
1 h% N% v" p% b0 vЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.1 ^, ^! ?: b! Y( y/ X) E( C5 H
! U# S8 w8 y5 h5 X4 p$ b! \Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.5 R( ^7 l' g5 _% A3 X0 R# Y- l
8 v H: {; c# J, n, u7 R
- // Пакет для состояний монстра: q' u u* B. X/ M L$ J' X1 u
- package org.l2jmobius.gameserver.model.actor.state;
+ \6 L, K3 o) P* N3 T& p
2 k) H: C& l) E, c2 {" ` D- // Интерфейс, представляющий состояния монстра5 ~9 Z, L1 A# n9 Y0 H
- public interface MonsterState {$ C8 q5 f3 b$ u+ g; C6 A E6 `
- void handleState(Monster monster);5 u2 ^# i/ |( c0 [6 b: o1 Q& m. k
- }
+ z; I# E4 O, R6 Z' `: R
Скопировать код
8 P V; A% t8 G' X6 Q: pШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
/ B- ` R4 m! _$ c; @5 t$ h
2 U" i q" k' X% y U& \5 [Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.) A/ D% |9 h$ r7 X2 G
* Y0 ^3 p' ?/ G& w
Класс для начального состояния монстра:/ a3 f) D* A1 p! o) q# W t
- // Пакет org.l2jmobius.gameserver.model.actor.state( x f1 K7 i: k! a3 ]
- package org.l2jmobius.gameserver.model.actor.state;3 J8 x/ O+ c0 \1 [. h8 b
$ U J" t, t+ \% m0 X2 M7 E- import org.l2jmobius.gameserver.model.actor.Monster;
9 C% z6 U$ X* A T# A( X& `
" } }2 W+ k% L- ^# l- public class InitialState implements MonsterState {4 I1 |( N0 q4 x1 \5 l
- @Override. r4 ]1 Z9 I6 V0 m: l
- public void handleState(Monster monster) {, X" z) u: W9 Q4 a" O8 J' Z
- // Начальная фаза боя
/ q4 W7 _+ Y4 N, o( A7 a8 K0 k8 `$ A/ G - System.out.println(monster.getName() + " начинает бой с обычной атакой.");" f! Z& a. c0 D% a. f2 O- ?) _+ |
- }
8 w. o2 {: b: X: o* ~( M8 J - }
. q. J9 a8 {7 Y
Скопировать код Класс для агрессивного состояния монстра:( R; k. ]4 F+ M% ]" u$ V8 ]' W$ r
- // Пакет org.l2jmobius.gameserver.model.actor.state
& i; ?! t5 [1 M) r - package org.l2jmobius.gameserver.model.actor.state;( h; c) e" g: L5 v6 t
9 k( }( d X2 G: p- P- import org.l2jmobius.gameserver.model.actor.Monster;
- f3 h* J5 X- C r" _: C
! k& v+ N A8 m1 E6 h- public class AggressiveState implements MonsterState {
' f% u: o8 p7 b7 }8 J6 ~ - @Override" z7 [1 x: h1 ^$ _7 l" a: m' }
- public void handleState(Monster monster) {) W% i; j% j7 E0 p/ H+ m
- // Агрессивная фаза боя6 R2 f- P! Y4 J8 H$ ?6 d" ]# `
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
$ l- g: u2 n' W0 F1 r4 F - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
- b: o9 x" Q" `! M ?* H! E - }2 [- Y* l' @% o
- }& ^% E: @1 @9 _# a. c
Скопировать код Класс для финального состояния монстра:4 I( c: R. o, e- X# L* P' b, U2 ~* o
- // Пакет org.l2jmobius.gameserver.model.actor.state
. ]5 X' t( p( q - package org.l2jmobius.gameserver.model.actor.state;
s9 ^$ ~* |9 I* }# { - A2 ^* G" M* s, ?4 V# ?7 l
- import org.l2jmobius.gameserver.model.actor.Monster;
# N; I6 a) \' i0 T - N; ?( B; X. Q
- public class FinalState implements MonsterState {3 Z! j) n& B) w0 u9 o7 O
- @Override
: P- _& o2 x$ \5 ]# Q' c - public void handleState(Monster monster) {+ [4 |7 ?8 |- U$ Z
- // Финальная фаза боя0 s0 J1 n* T$ ~* X. B! k
- System.out.println(monster.getName() + " готовится к финальной атаке!");3 {6 t8 P4 J' t( l* L: g9 Z. x$ T
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
+ D" N2 }* `5 c5 x2 {3 t% K6 j - }
2 ]9 b H# h; p. q3 \$ I+ o: a - }' P3 L1 [9 ]5 G) @' Q
Скопировать код + {& E V. k3 `" ~ M* h k; L
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
7 q' o" P: K/ Z5 `- // Пакет org.l2jmobius.gameserver.model.actor& d! G* X4 D/ b
- package org.l2jmobius.gameserver.model.actor;& o9 w7 n4 s( O9 h. ^( H; ~
( T# V' D, x# r2 S2 ^% {1 W8 a- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
( f. h' J9 T2 r$ E1 A1 d! a% C" l# b - import org.l2jmobius.gameserver.model.actor.state.InitialState;
. @! z1 y$ G' @9 p! n
1 x0 k( r4 \* F" W' {1 b C w0 a- public class Monster extends Creature {# V5 j" b& l) R3 |5 K
- private String name;9 m, X0 W& q( t% O4 _
- private double attackPower;% ^6 J% n# T. o
- private MonsterState state; // Текущее состояние монстра: f( p% g, G5 a8 M) w( E2 W
- 5 Y/ p% Y C! M* P
- // Конструктор монстра* `# P( R Y: _7 c9 `1 G
- public Monster(String name, double attackPower) {1 L( D# z6 d; J8 r; h: V, l
- this.name = name;/ I5 N" Z. h. @+ H+ V) \1 n& [
- this.attackPower = attackPower;
5 `6 I3 e0 V" P - this.state = new InitialState(); // Устанавливаем начальное состояние
$ ?/ ^2 t9 r& J( w7 Z1 k6 i# }8 N - }: J+ _6 p& }- p# Q" ?8 \: H
, |9 P" ]& N# o3 u2 n+ Y: p- // Метод для смены состояния5 @) w2 R% q; J7 U% [
- public void setState(MonsterState newState) {* `" |: U$ ~! T" T4 Y% n% a
- this.state = newState;
4 T% r( O. w9 O0 }6 N - }
& i- {1 i. ^& G0 e- c D; ~ - ( T2 K" T4 G8 Q% i/ b) r$ E. }& v/ j0 w
- // Выполнение действий на основе текущего состояния
) n9 a4 G ]1 \+ t- s$ q: b9 ]0 _' h - public void executeState() {
+ t7 n: A* `% _* v6 x# I/ `0 s* { q. c - state.handleState(this);
. m4 D- A% g8 g, ^/ }: k - }
7 a3 }& u7 c- D$ ? - + }' F v) q; w5 ]% @$ i6 W. O I
- // Геттеры и сеттеры
9 T' `% p2 Y. h% J. ~ - public String getName() {" o" [3 {0 k6 ^! S" K7 t& w! P
- return name;
( B9 F( X |! p. S - }
7 t6 I( f' L* a7 I9 ~) ]8 ?) t - 6 Y3 m- o; P( t% p G6 m
- public double getAttackPower() {- z' _* H8 ?' ]( Z+ N( \* r* E
- return attackPower;
& \( ] |, i, m! M' ~1 o - }: i: i& e F0 w& F: y
- 4 i. r- A/ K9 @: M$ g! ~0 b; q
- public void setAttackPower(double attackPower) {0 ?& V, `& ?0 D8 c! i- p
- this.attackPower = attackPower;8 X! f8 C+ j2 V6 ?
- }
& x2 G1 r/ Q6 [6 B+ t4 J: J) R0 I - }
5 h% F1 K W2 F) i& h0 W
Скопировать код - v. N8 L4 K$ m! @. K
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
5 [) o0 T* }+ H; w
* d5 j* }- z" e4 C) n0 A* p- // Пакет org.l2jmobius.gameserver.model.battle0 X) U; U. D9 K% P" q
- package org.l2jmobius.gameserver.model.battle;3 T; r3 X c; D% Z$ U
- 0 R# G3 ~* h( l4 O' m
- import org.l2jmobius.gameserver.model.actor.Monster;& W3 Q5 x9 h5 H3 f2 C
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
: n8 a( ^8 ~' Z: o - import org.l2jmobius.gameserver.model.actor.state.FinalState;
' {6 {' ?. ]6 m1 { J( u - " a# x! m# q9 A6 }, ]; n I0 ~$ C
- public class BattleSimulation {
; n3 r( _% O2 v - public static void main(String[] args) {
I0 g& @: p6 ]' o9 e6 w' F/ S/ D - // Создаем монстра с начальной атакой
, e! B4 z9 {' o. L& w! ^ - Monster monster = new Monster("Дракон", 100);" g5 a; h; J* t+ Q4 | g
- % z% Q% p$ l- W/ z* k1 b/ }3 K
- // Начальная фаза' m* x) E, ~$ t; Z5 E: ]& ^
- monster.executeState();
5 b* [/ a# c% q/ f0 w7 l$ g! C - 5 h7 v: G5 ?9 n4 s: s% E7 Q7 ]: J
- // Переход в агрессивную фазу
% c$ X5 [' E8 ?5 G7 T9 M - monster.setState(new AggressiveState());
% i! ^: @0 _. n8 X: H9 }+ U - monster.executeState();
6 l: l2 S9 Q4 U8 a8 F0 i I2 J
6 w% _' R5 w( j- // Финальная фаза
1 R* m& k7 Z! {: r - monster.setState(new FinalState());- }" F6 p; x `5 U' s
- monster.executeState();
* [' p6 ?9 X; P2 R5 W+ J: ` - }# J, a y8 _* p6 e1 ?) I
- }
; l+ k* W+ R9 _! E$ L
Скопировать код
* E+ a- F ?) @4 R7 B) A2 m& t8 C7 yКомментарии по структуре пакетов и классов:" d1 A5 F( w% I3 w2 R/ w( L
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев., M# L% L& ]/ z5 A1 Q3 r+ O
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
2 R$ r2 m1 h: y" yЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
$ U" B/ v* L# V2 M) e
6 y. H" j& p7 ?9 s* }9 h
6 \8 Z; Z' {4 z4 g; c- V* W( h5 I l0 h8 J0 v
% V7 i4 m/ g! Z6 W
" }. ^* x0 L; a# w4 L
8 l1 r% h9 t$ ]8 K
2 q- V- x5 Q+ a9 e" z( e& V4 a- O, s4 n6 M
# ]% }% A0 v" W
1 h! ^, O. `* o% p6 B8 d" w7 C0 {9 M- ~7 I
9 l. ?" b, A7 G, Y
) N7 z1 A# [ m1 i9 T+ x* T, V% s( E5 [/ B0 E
|