Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 3 y5 x: p% M$ d6 v
. _- W3 t8 X* `0 {8 x5 R
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.1 w7 R7 N- d1 G( }" T! \7 T# U+ J$ w
" X- g. _1 I, x" W) r
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.; }& n' A/ ]6 i8 Z0 e$ w5 Y
6 X" q9 F$ @, b- // Пакет для состояний монстра- J: R8 p! j1 R; u5 \" g( u- m
- package org.l2jmobius.gameserver.model.actor.state;. G+ f6 I ]$ \7 l2 F3 }& ?
; X2 ]/ }$ m6 D# e* ]; I$ c- // Интерфейс, представляющий состояния монстра+ W3 h& g, k( B0 Y- a: v
- public interface MonsterState {
1 b+ e" L m4 \0 K7 c& } - void handleState(Monster monster);: F! D: H I7 G) O8 D; G6 j8 \: G- b
- }
; V$ c2 E* F$ |% r- R" R
Скопировать код " y; p/ M6 c7 w( ?6 @- x0 P5 q9 p
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. * @ { Q a9 f% r1 V5 W
7 T* G- T: I' Y5 U" Y
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
9 c! m5 ?, \* x4 q9 o4 }4 X% h; p5 W( g9 R; p8 U, e6 R4 G
Класс для начального состояния монстра:
* b7 F- _+ J3 }0 t t- // Пакет org.l2jmobius.gameserver.model.actor.state6 s& D/ a3 H. K: c# P9 d
- package org.l2jmobius.gameserver.model.actor.state;# R* r4 T# l8 p1 }+ n# X
- % `% X, C F6 L6 I
- import org.l2jmobius.gameserver.model.actor.Monster;2 l1 b: _% {8 l6 K
- : k" v0 v6 t7 H/ L& n
- public class InitialState implements MonsterState {
" {2 s! D7 V' Z; k' U& ^ - @Override
+ {6 M9 m3 _4 p' B - public void handleState(Monster monster) {9 N( z9 X8 h# f8 i3 h1 u
- // Начальная фаза боя. ~/ {# }" k& p5 \ U
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");
. G0 ^5 V( V2 E8 Q. C# G1 L - }, U) L r$ Y* [7 L
- }
+ C4 v3 l4 V; \, Z( z
Скопировать код Класс для агрессивного состояния монстра:+ b5 a; U7 z u0 r) e+ W
- // Пакет org.l2jmobius.gameserver.model.actor.state
/ g4 G0 e5 D t - package org.l2jmobius.gameserver.model.actor.state;
u( c: R" A* U |/ K$ E3 a7 c - 6 U! \9 F8 P9 Z
- import org.l2jmobius.gameserver.model.actor.Monster;! C: Z( F4 Q+ @4 r5 {: a0 q
- 6 X) S' t$ D8 Y1 Y0 A
- public class AggressiveState implements MonsterState {
! g$ J& c9 v' Q( R- | - @Override. o5 }- `- M, F; y: n& {3 ^9 _9 i
- public void handleState(Monster monster) {6 C+ h/ b- ?3 o( H# {: E6 a
- // Агрессивная фаза боя+ D4 w9 p% {) _$ P
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
; m p, j7 k. e/ ?# b; r9 l4 \ - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
; H% l p9 |% a3 D - }
, F: R# Z# o1 U1 Q( R8 c - }9 T4 Q: \7 s6 H8 O
Скопировать код Класс для финального состояния монстра:
' P, m( W3 V9 L- o0 H: H- // Пакет org.l2jmobius.gameserver.model.actor.state
3 k) V* O- U. ~! x+ c S - package org.l2jmobius.gameserver.model.actor.state;' M9 A6 p, X, R
9 w7 Q) M$ c" w2 C- import org.l2jmobius.gameserver.model.actor.Monster;
+ z: Y3 q b+ t4 e- `6 f - / [% u: v7 w: N4 i
- public class FinalState implements MonsterState {& X4 Y* f& m7 _- g0 V+ k$ K
- @Override
: O" A; B; Z) h: H8 _ - public void handleState(Monster monster) {
# S9 t" ]4 I" t' w. x- K - // Финальная фаза боя Y, a0 m: n/ u% _) ?! p ~( \
- System.out.println(monster.getName() + " готовится к финальной атаке!");9 a* ?. H2 }# N9 g. v" F4 K
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки! R! U6 q8 x0 V) U: C! C
- }
f) I* N! |5 @; z N- b! Y - }
/ D) r0 ^/ d4 z; l) b( n+ Q4 E* U
Скопировать код
& z' y9 q {, M$ E1 h# Q* ~. V# ]Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.! J7 I$ i1 N& @! q8 B5 e
- // Пакет org.l2jmobius.gameserver.model.actor
3 \( S- U1 D% e - package org.l2jmobius.gameserver.model.actor;
+ Y4 \0 E e- R% H3 N/ d. S - 4 G3 \7 h- t% |5 o% U6 U3 ]8 i5 m+ n1 e
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;; {+ o* X$ P( k' |. X/ j4 R
- import org.l2jmobius.gameserver.model.actor.state.InitialState;
" [* K# _" o" S$ t5 u) l
" b2 l- H4 }* T. r. S- public class Monster extends Creature {
$ A+ C: `4 p- X/ L% f, Y) E1 d - private String name;
% z4 r8 o$ d) h2 ^ - private double attackPower;6 V$ s/ _, l! i i4 o! {) s# ^
- private MonsterState state; // Текущее состояние монстра
0 t s! I6 s; }
! N* z# V; S4 }' a, k* i- // Конструктор монстра
1 m6 i& i8 M, O+ M5 e - public Monster(String name, double attackPower) {6 ~! _- i6 w" F
- this.name = name;5 b1 P% Y4 q8 \3 S0 v4 j% U
- this.attackPower = attackPower;
% g' a+ F$ e! V0 T - this.state = new InitialState(); // Устанавливаем начальное состояние+ C N" l! t" X9 i
- }
% }# e, M/ i: r3 l8 J0 D) n
" a8 O4 {# P8 `- // Метод для смены состояния
! `. L/ ~, Z* c# Q5 y7 Y - public void setState(MonsterState newState) {
' S# h9 f" L/ y - this.state = newState;
# i2 r0 h7 K" U# [' e# e - }
# e6 p6 |$ C: l
" r& x9 j% R. b) G- y S1 ~+ O) i- // Выполнение действий на основе текущего состояния/ T: C u1 G0 x7 w2 L( {# s- k `
- public void executeState() {: c% L- w f! u; v
- state.handleState(this);
" ], C5 X- `% ^ - }
) r8 H# p6 U' K9 N1 | - - P" ^8 p2 v5 F0 @
- // Геттеры и сеттеры
9 T8 W$ \; U8 j0 O i# o8 \ - public String getName() {( h$ W- d. q3 U% I
- return name;8 N* ^( V$ j. ]! I* g+ N& B
- }: O* `0 h% R* j+ e: n% ?: }/ K
- - Z. n$ B; h+ }2 @2 l a0 x" g
- public double getAttackPower() {
3 h' D+ c2 q' i, L p9 o - return attackPower; }7 N0 h2 d/ @4 n" T" H9 `
- }
0 m( E- N( b* N+ a1 Y - / D% c ]% t/ ]) S6 r
- public void setAttackPower(double attackPower) {% E! v; I& v! _" S) @
- this.attackPower = attackPower;& A, [$ k+ f! Z3 H" i8 o
- }
: U( d/ b4 F" d; G* l - }
7 n. Y% S* ~0 `9 f# O% N( S v# M9 z
Скопировать код - [" P. O5 h7 d, l z
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
! t+ c6 \2 \& \( Z% m3 e
2 c' p+ G+ |# M% c, ~- // Пакет org.l2jmobius.gameserver.model.battle
: l# D0 l6 R8 j0 Q3 ^1 f( x/ ~ - package org.l2jmobius.gameserver.model.battle;0 {, A; V( l# _( ?2 L' g" k
$ Q( [$ ?, C3 ?4 \3 m# S# Z- import org.l2jmobius.gameserver.model.actor.Monster;' }! [6 g, Q, v; g- e% Q2 S
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;0 t5 Z# r5 _% \7 `$ o) c
- import org.l2jmobius.gameserver.model.actor.state.FinalState;( D% p7 ~' l4 a5 V4 E$ j0 j
- 7 L. A5 z8 b, j6 a: x
- public class BattleSimulation {
m. C' q' ?4 T - public static void main(String[] args) {
0 A2 m3 }7 h% P+ v) e2 u - // Создаем монстра с начальной атакой
6 @7 D- z( j1 Q S$ J - Monster monster = new Monster("Дракон", 100);
# Z! \+ f# r7 P* H% U9 _2 ]# E
# O w* Z1 @9 A+ s- // Начальная фаза
" V% T- g6 Q \' |3 o - monster.executeState();5 h- _* T/ [# g/ i& l5 O
$ G) I8 X$ h$ A% k7 j: a. x: O& h% O- // Переход в агрессивную фазу
! N9 W$ D4 [0 t" k5 o9 b; M& A - monster.setState(new AggressiveState());: n1 e! m9 A A: M/ y1 g! U
- monster.executeState();
3 D" S0 |' f, O - 0 ~' C; [7 }- U! a; N
- // Финальная фаза% L+ }* q0 P, I( H
- monster.setState(new FinalState());
/ v3 P) M- G" l) B3 l - monster.executeState();
( Y2 c* @3 Q4 @ - }
+ v; v! L) U8 s5 D# A - }
- @9 q" x0 N# x+ ?- @" e' }
Скопировать код % S& E3 c& U5 h9 @) k) C8 c; s# ^
Комментарии по структуре пакетов и классов:
7 \3 |) ] A8 ]7 \7 c8 F- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.! D/ S: Z! ^: ^$ |7 r0 u: ]
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
0 B8 g$ E- @: h, q: j$ jЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
6 l* U4 |- O* w& k$ o/ b0 c* j6 d# ^: B- k2 m. L5 N
* L7 Y0 ]1 Q8 Q8 M4 }" P! v+ O1 Q8 m' @1 M; U0 \9 y8 t
. [: F7 N8 \1 h8 d3 @( [0 m! Y% V
! N, P8 U0 M0 V( W6 b
9 K: C* G) h' y- o( B3 U7 l+ ^
) E$ g$ W8 T( r! z
( ]& U$ A5 ?& E1 {4 G8 e9 \8 ^/ Q5 Y8 H R
4 \0 R5 P* d- a' P# W' ^
6 V8 `9 y: f$ q$ o Z9 A1 f7 m. K. g( T% K
. g9 j0 ?7 K6 a8 y
|