Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
Z( C2 f. c* s0 d* A! x2 L) f9 S
8 R2 F. O- r, R) l2 O; jЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
/ H: ` _$ T( `
/ {8 A3 h* n4 _Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.! ^4 N: N) T; n3 W! Q
) d4 F* I1 a: |/ P; F9 v, |) K5 _* Z. q, m- // Пакет для состояний монстра" t+ h2 b8 V1 `3 ], W# T
- package org.l2jmobius.gameserver.model.actor.state;- M& V! k* G' G+ s
a* K S9 R; E5 h- // Интерфейс, представляющий состояния монстра
, `1 v5 P- g& I. w. Q - public interface MonsterState {
5 V7 q# l2 G; \ - void handleState(Monster monster);
# n% L3 q. r5 N% V% a% y - }1 A, ~' y3 V+ P9 }' l' r
Скопировать код 6 k% e7 |0 A' \, J9 H
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. ' t6 ?7 \5 ~* O5 S6 t7 L
. N. x3 O! T T( _Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
/ n/ |5 S$ @1 E7 S7 o
0 j, ]' }, Y+ lКласс для начального состояния монстра:
3 ]; p* G) G2 l# P, d- // Пакет org.l2jmobius.gameserver.model.actor.state
! }! a- N6 V% }0 r I, K - package org.l2jmobius.gameserver.model.actor.state;6 D z) V8 s5 W
- ) g( ` ?% X8 Z
- import org.l2jmobius.gameserver.model.actor.Monster;8 |# u( w8 T* U2 u; n$ y0 {& p
- % F6 X+ e, A5 ^* l, z" N& h# t3 w: I: R
- public class InitialState implements MonsterState {
2 L4 X/ J0 ?) y% o - @Override
7 L' ^" w1 b% X6 p2 T; o& ]" r - public void handleState(Monster monster) {
8 c+ S4 s; W# y6 C+ t( U- | - // Начальная фаза боя
+ m$ |: h( c5 y7 \# r0 g X - System.out.println(monster.getName() + " начинает бой с обычной атакой.");
; t+ s2 G8 [, V1 Z6 {- [ - }8 Z m! Z. ~/ k) H& ?. j
- }: {5 i- s5 W, s1 K" B
Скопировать код Класс для агрессивного состояния монстра:+ y2 l2 P; D2 l( o+ R- [
- // Пакет org.l2jmobius.gameserver.model.actor.state$ f! _: a- A" d8 f2 @- G
- package org.l2jmobius.gameserver.model.actor.state;6 F. D ]* x/ j( l: R! D2 T3 A* T* J1 ]
5 @2 I, E2 V8 I, a/ f6 W- import org.l2jmobius.gameserver.model.actor.Monster;
+ b2 C* i8 T' O6 k8 K% Q5 u - : Y5 g1 K- T# I1 p2 p% }# d
- public class AggressiveState implements MonsterState {4 H G- j" |) S5 q' p4 P0 }
- @Override
8 W$ E6 P* k- ] - public void handleState(Monster monster) {8 u4 u4 Z; Q' S2 \; m
- // Агрессивная фаза боя
) F8 l% n. w5 g - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
$ {! M9 B$ j6 g% P - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
2 v2 E& e* Q: }- ]$ c0 u - }2 Q( E8 b! X0 b0 Y/ f
- }
2 g% @. e2 A8 j: R% q! U
Скопировать код Класс для финального состояния монстра:
+ N: h- ~& [& |: e: a, h% P4 T- // Пакет org.l2jmobius.gameserver.model.actor.state
% X1 j' _8 c7 C2 b$ d" A" M - package org.l2jmobius.gameserver.model.actor.state;* W6 u& [5 L3 O# N& c
- * ?/ `" V4 x& V2 S( C- i- X9 R( r
- import org.l2jmobius.gameserver.model.actor.Monster;
) b, Q9 |$ d2 L; ~- O
) P7 M) t, D' e b m' ?! I& p# Q* {- public class FinalState implements MonsterState {2 l# h1 U. w3 @' ]+ l: U: q
- @Override$ I9 d p1 R9 Q. E" \8 p- Y
- public void handleState(Monster monster) {7 z: I9 H+ V' A
- // Финальная фаза боя
" Q5 L2 V4 ^) b9 k3 p - System.out.println(monster.getName() + " готовится к финальной атаке!");
! Q( }0 u* C* T8 ~. G$ S - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки4 w& G) p7 n! V& p
- }' m$ j0 d1 g% r6 U8 @
- }2 _$ K0 K8 F; ?& ^6 s# Z
Скопировать код
$ n- i' U, |9 H$ s4 `. ?Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
4 }/ r9 n2 k. t& C a: N- // Пакет org.l2jmobius.gameserver.model.actor8 W) P( b: F8 `9 y, S4 [+ {$ L
- package org.l2jmobius.gameserver.model.actor;- _* V0 N. w7 Z [ r
3 Q* q( ^5 f( q0 x+ ]$ C$ k2 h- import org.l2jmobius.gameserver.model.actor.state.MonsterState;; y) |/ F- h K+ I* a n6 s
- import org.l2jmobius.gameserver.model.actor.state.InitialState;
: S% @0 L4 Q0 M) H9 q; `
& T; z3 w1 \) T- public class Monster extends Creature {
/ ?! O+ D. [" b1 n, }/ N - private String name;
) Y& ]4 R: E+ N9 f: _# T' w1 L! V3 G - private double attackPower;
# F+ j& J: I( J/ q - private MonsterState state; // Текущее состояние монстра
- {# D9 Y. _) c" u5 k - / Z. S4 C8 r3 k- w6 U) y
- // Конструктор монстра6 X8 U5 N4 O% M2 M( Q) ]
- public Monster(String name, double attackPower) {
6 I$ ^3 D. f( C- N7 y& \& q - this.name = name;
0 S' H- n8 @; f) p/ @7 O - this.attackPower = attackPower;( L9 l: H7 Y4 z' e: Y, @' v5 o4 v
- this.state = new InitialState(); // Устанавливаем начальное состояние4 ]; ^: A, H- ~; K" l; C5 Y4 ~, ~
- }3 q D# ]3 a0 m9 r; X9 e
- 2 u" s2 f7 Z- B
- // Метод для смены состояния
! i6 w+ ~% X* e9 [ - public void setState(MonsterState newState) {
# ?" u% B' \ E \8 {/ R3 b - this.state = newState;
9 ]* g5 ]& m. K- [) g& I8 @ - }
2 j5 Z$ {4 L2 E! u+ I+ I8 C" t. v
; S4 E Q2 y; V Y; L) u- // Выполнение действий на основе текущего состояния
% d% O F! q4 i; K - public void executeState() {0 v) W3 H: v- Y1 o
- state.handleState(this);) D9 G; i; h) Z2 h) y' o% p
- }
/ \& W/ K; O# z9 @
9 A1 e6 D, r) Y% |- // Геттеры и сеттеры
$ n0 G; L6 Y$ y) w( n' f3 i# K( Q0 M - public String getName() {
" _& g- _. U) @' T, v - return name;5 l3 m2 m( w( p/ {* n
- }
$ x4 M2 t, E" q7 l - ( D1 `- z6 M2 S1 l
- public double getAttackPower() {
z* }# e' P5 v- c( ]+ U - return attackPower;% F* _, _* I7 g8 \0 T2 u
- }
. J5 J; u( i# ]
/ d6 I. s6 ^$ v2 \) f& c- public void setAttackPower(double attackPower) {
; j5 G% Y5 z: W3 T) p - this.attackPower = attackPower;9 \, T/ V- n$ u0 o* B' H/ i) d" G
- }' ]7 K- H2 u. b% k9 c p8 x( `
- }
5 [% ^ _: \+ ~$ b5 S! P
Скопировать код . G J& W4 x8 K
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
$ v! W/ N# z) ]0 W0 l, |, H# d v- F' T! z7 k) ~% }4 f, Z
- // Пакет org.l2jmobius.gameserver.model.battle
}: x. |: d' V6 z$ [# Q - package org.l2jmobius.gameserver.model.battle;( x& o& H* P/ b {( S( |
- V e! L7 m7 E/ [2 ^, j- import org.l2jmobius.gameserver.model.actor.Monster;
/ |! @) i: u1 z2 y8 F0 P" ?0 Z - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;; U8 V( }* [$ H5 y/ a# x j
- import org.l2jmobius.gameserver.model.actor.state.FinalState;
6 l! j( m' g- u; b
& \9 g% `! r$ S$ j" w# C7 {- a9 S- public class BattleSimulation {
0 t* t5 H# `% q1 g - public static void main(String[] args) {
- i* O; g2 c6 S! f - // Создаем монстра с начальной атакой
* T4 x p, O5 e; F - Monster monster = new Monster("Дракон", 100);3 j4 [3 D9 |1 }, M
- |) \- L6 D/ R" J5 v( k- // Начальная фаза
* |2 l7 I7 C9 y$ ]7 ^7 c - monster.executeState();
+ s( P( r0 U% a e& t3 v2 f - 2 f3 y" X) U y# u% @
- // Переход в агрессивную фазу1 J. d% ]4 @: v4 H [
- monster.setState(new AggressiveState());
3 K+ N9 w6 a- O( Y6 M; P0 Y - monster.executeState();
$ k* L2 s; L6 R5 z: T- n) ]
) ~: J0 P7 n% n6 c- // Финальная фаза
7 a4 ^: R( g% B3 Q( K - monster.setState(new FinalState());9 D+ e, o& |. }& q3 Z; ~
- monster.executeState();6 D5 P0 h& O( W& J% j
- }
' e7 e# z) b- u+ d - }
9 W! o" j. `$ K% u
Скопировать код S+ {1 m1 _: @/ f& H
Комментарии по структуре пакетов и классов:: T3 s: \! K v0 W( A+ }6 u# R
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев., ?6 V. b- B9 U3 J# x
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.( c/ E+ U g6 Q7 v' V
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
g* @: d* b, t( `( f5 Z9 j/ {/ S2 W+ p% \& F' [
3 h# _- y& r/ s
% E, @& g3 i; U) ]/ {7 V* K4 m+ f) z1 U% j1 \
t) Y/ z% F" T6 ?
4 y4 d$ D- x: P6 V' y$ m. w9 ~& K
$ H( l- I4 v. V4 d6 \1 V; h0 W( j
2 q- E' [8 t; N1 \
9 ?( r0 Z: W) t: a
$ t8 K! V! Y) N$ @ U2 w( ]* Y$ P9 f4 H- Q, y. X
6 W8 Z \2 h5 R5 M
|