Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
. g. R( L: V) \3 G) X& x6 H2 r. m5 `# r$ k0 H' Z+ g
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
. I$ v9 S- \/ V) Q" B. P# G( d7 ]. a( M% H+ l
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.- h) {3 N6 G1 L- }7 W1 _& b
& L4 V/ u# K; a9 ~6 H2 v
- // Пакет для состояний монстра9 U. N& j4 |4 y7 l+ D
- package org.l2jmobius.gameserver.model.actor.state;- |! g* e/ R3 y2 V' P- Q% |' @
" {/ D0 O: x+ E' Z1 ]' {- // Интерфейс, представляющий состояния монстра
3 O1 A2 K) a9 u4 F5 T2 {0 G/ T - public interface MonsterState {
5 B6 R1 }6 I$ e* b1 s, f - void handleState(Monster monster);/ M3 t* f9 ^7 t: _7 n0 E5 M6 R4 |
- }' O& u- _& q: w: @1 t8 @
Скопировать код
* a3 S1 T+ T! JШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
, n8 Q# y. Q" {% M+ e% S9 W. a% k: w' u# W
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
) h8 ~6 o3 [% b- ?6 u$ ]3 b! r
- w) I: ?0 A% _- i; G; B3 @' T) HКласс для начального состояния монстра:- f8 ~3 f7 g d! A. T& ?
- // Пакет org.l2jmobius.gameserver.model.actor.state; M' ?4 s/ w9 F, [) }
- package org.l2jmobius.gameserver.model.actor.state;6 ~1 g7 l" |) x# C
. z; r, `( e8 h8 a0 t/ ]- import org.l2jmobius.gameserver.model.actor.Monster;
( B" _6 Q$ }- W/ K - 1 G9 H0 d# r+ k6 n$ f9 S. {
- public class InitialState implements MonsterState {
+ C- v# ^8 d6 z' d6 p - @Override8 ?" j. B; ]. Q
- public void handleState(Monster monster) {
7 K- m3 ?; q5 g6 R - // Начальная фаза боя
+ ^4 [4 T7 [/ v9 p1 ?0 O0 w: g7 R - System.out.println(monster.getName() + " начинает бой с обычной атакой.");
: ?% ^* `- i% \. U% \* S5 A, O0 ` - }
8 e% }+ X# @6 y' ~ - }
8 q' `& X2 Z) I( c- D4 ?
Скопировать код Класс для агрессивного состояния монстра:
q1 y& m; V( X+ G- // Пакет org.l2jmobius.gameserver.model.actor.state0 r: g6 {- I% J/ c9 a: U
- package org.l2jmobius.gameserver.model.actor.state;
) X2 `% O/ w. j+ y
* A7 }. d# Z5 o% J7 q% V- import org.l2jmobius.gameserver.model.actor.Monster;+ X) P9 x" }3 O4 l |3 B- d4 p# W; _
- 6 A5 N6 h4 R7 ?3 U; T( S
- public class AggressiveState implements MonsterState {) L* K0 h# D# o. H. ]
- @Override+ w; I" H( H" H) U
- public void handleState(Monster monster) {
- b/ D; G! [2 Q8 S0 N$ H. D I - // Агрессивная фаза боя# _" i+ F2 l+ ~& u
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
' w" Q# Z+ g, j) r" y - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки* w4 k3 T @. r
- } a J& Q# `5 c" w: V
- }
* i1 Y( k. F* T, R; \
Скопировать код Класс для финального состояния монстра:
# U5 D( n) X. V3 ^- // Пакет org.l2jmobius.gameserver.model.actor.state
0 X& R2 l# [$ Z# U, e. h - package org.l2jmobius.gameserver.model.actor.state;# b3 o h- I$ s( X {" ~+ E
- & z1 y4 z: s2 Q/ a: t, F
- import org.l2jmobius.gameserver.model.actor.Monster;2 e; S- S4 p5 S+ ?0 Q( c
# r; c% m& @$ a K- public class FinalState implements MonsterState {
2 p% }2 w8 d0 K. R* n! V - @Override+ i* H' h r3 K2 |; d9 w" P
- public void handleState(Monster monster) {4 M, B( \' W# n! d$ @$ s1 }4 |' _7 W
- // Финальная фаза боя
9 g/ |" c+ H: R. n, N - System.out.println(monster.getName() + " готовится к финальной атаке!");
, e; A5 `( ~# y - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки& I5 k( `# r+ {" H2 @' o2 O
- }
% |6 \% D+ g' a2 [ - }
: F5 G% e9 a" O z
Скопировать код
1 n: B$ I( e5 [- h6 BШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.7 l, G$ D* u: j6 Q' J0 G
- // Пакет org.l2jmobius.gameserver.model.actor7 C4 d4 A/ e( N- y% {- ?2 V, I4 ?
- package org.l2jmobius.gameserver.model.actor;
/ b1 @# A e1 D$ ~ e5 i N - : W, I' V, {# |6 R0 t
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
9 s& ` T8 ]# P$ a4 B9 Y: R9 ? - import org.l2jmobius.gameserver.model.actor.state.InitialState;8 j. [$ V- ]& l4 D0 \2 F' {
$ ?3 S; g7 u5 j; _. @ f( B; y- public class Monster extends Creature { e, _+ ]% W }( d. }, h- S+ F3 c' x
- private String name;1 I/ l( f6 x/ F& m, M+ a. c
- private double attackPower;
: `% X( n5 G7 T$ F' U/ t - private MonsterState state; // Текущее состояние монстра
+ U8 { Q- }* x! ^% U
& i* F( D; t$ L+ M- // Конструктор монстра
0 q. Z0 ~1 C: o+ } - public Monster(String name, double attackPower) {
' T% w7 l$ G1 N' A - this.name = name;
! f, b% n7 `- S( ]/ n7 {7 v" E& G - this.attackPower = attackPower;
9 ?& _8 Z* D, a. c) E7 U8 H - this.state = new InitialState(); // Устанавливаем начальное состояние
- I9 O s5 {! ` - }3 O" j. ^/ t$ a, C' }+ Q' p
- # s1 e' r- O, N: `
- // Метод для смены состояния
6 G" D$ E% J. Y! z7 S4 k9 u - public void setState(MonsterState newState) {
- a' l& \7 ~- ^' N N - this.state = newState;) X5 l6 O2 U/ ~; I9 f
- }4 C' i( ]! u+ y& K* Y- K
" b# z+ {4 g" C2 v: \- // Выполнение действий на основе текущего состояния: {4 _( m# B9 N; n# h8 B# T
- public void executeState() {! u% w1 y/ X7 @9 q
- state.handleState(this);
% b0 J! S, V( L: G( y- _ - }
: ]4 C1 k: B7 `1 C
8 N9 O* }5 @$ r6 j) T3 p; p- // Геттеры и сеттеры+ J4 H, D6 j1 a% G0 [, [
- public String getName() {
* X- ?* H4 R" o - return name;
5 t E% f h3 h5 w/ H, K - }8 e6 G9 i5 x2 [9 i
# r! v( \ F2 N" \- public double getAttackPower() {, Z% {; m5 y* ^9 t. n2 h6 a) r
- return attackPower;
. Q1 |% y; G6 Q( @: n - }
' |. c. F D5 ?! c ~/ @: u - 5 I" T" C/ z$ Q- e, X( ~ o- L, @# D! q
- public void setAttackPower(double attackPower) {
. Y! ^4 t2 N& C% |& l2 e - this.attackPower = attackPower;% j2 O6 L8 l# D1 H0 }
- }. ?/ s0 J: ]: x* b, a5 Z- l" l
- }
, z% y. p) p# X# d1 x; Z+ f
Скопировать код ; z( t$ q# D% P( Z1 C3 o9 _9 ~) Y3 {
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
/ x) J" t* ]4 N/ c! m6 T
6 A' O1 {. @$ F' F6 @- // Пакет org.l2jmobius.gameserver.model.battle
5 k0 q+ g6 R( v - package org.l2jmobius.gameserver.model.battle;
P' C; l- I, O& O4 ~% S - 6 L) Q7 y) ?5 t- ^8 [' D9 u
- import org.l2jmobius.gameserver.model.actor.Monster;; F1 o7 B; }/ {" m; g
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;7 x" X y: F5 |3 |/ e: B" Z
- import org.l2jmobius.gameserver.model.actor.state.FinalState;
8 c4 E2 r- S$ J& D m
' T) ]: k/ ? k: I/ F# i( }- public class BattleSimulation {
, F2 W% w9 a) c* p( j# { - public static void main(String[] args) {
& Q7 N; P4 v# f6 ~7 B" U - // Создаем монстра с начальной атакой( q& B. h; }& r$ }. j
- Monster monster = new Monster("Дракон", 100);9 D" f3 A- |* Y8 o d& |
- 0 x: W) A2 j; ~/ w. v$ H$ R
- // Начальная фаза
* [$ B- M* [% ^$ p% T - monster.executeState();
4 Z- \/ t6 {1 {& F" ?" Z! G - 6 ^" ?- A" W1 N7 d; o
- // Переход в агрессивную фазу6 ^0 t7 l3 V& M& ^" j" R
- monster.setState(new AggressiveState()); P0 o! U7 U ]7 b
- monster.executeState();" N& z) Y6 e' ^% H7 C9 x
- % H- G& R$ q# l6 j5 P u/ `
- // Финальная фаза$ J+ k5 L7 A, L8 h- e
- monster.setState(new FinalState());3 g# ~, i" u/ m. L/ c6 W
- monster.executeState();
( T; A. C; \! ^2 z - }
4 n! q+ @, {7 ^ i4 ] - }( A* u. r* `: O4 e; e) b" w1 q
Скопировать код ! y7 _9 t5 \; o& ?$ `
Комментарии по структуре пакетов и классов:$ o; r* c( r" |0 n& `
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
: L. c. ]! z5 U5 R: r2 T7 S1 | ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
% e( E% B$ E/ g( a8 F, K# C" K3 @ sЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!- d# k/ U; j. ~/ u
t3 _) m9 ]6 B3 q
+ b+ s% g5 S6 d+ h5 l8 A3 h; w
2 s$ r3 R `# M
2 O( m# ~( S9 v; C3 K J/ f2 D
2 g* x) C0 y7 W5 z2 M4 m. `- K3 F* k8 }. n$ [2 B, B. L
: o" v* p" t' o0 P' u: M4 }' X' ^7 [0 \, D4 E
" _ ] V' B/ ~8 @/ F5 I/ t5 Z2 \$ W: _0 n# c: L
5 S/ _4 n8 |1 e$ r* z5 Y* J N. l, h9 ~. Z' A$ ~- @9 M
8 |% v/ u$ @) }, s
# W1 ~9 i1 @ n& H: O" l5 ?
|