Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). ( w8 i2 o. [! t( ~
; b' Z+ m5 } c4 q. g. E
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.' q& f, R. i& Z' f' A5 f2 B- `
- z7 T. K4 I! R# d* C2 n* UШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
$ F1 r; Y: p' q( ]: U0 n1 ?
3 {2 ]; _1 f* @8 z7 d; E- // Пакет для состояний монстра
6 i: c( o( L* ^' U - package org.l2jmobius.gameserver.model.actor.state;% p& @- _3 ^! @! w
- 4 w. N' P* z+ s0 H) M& A% J, B, h" N+ O
- // Интерфейс, представляющий состояния монстра1 r# J; J, x! }3 ?4 J# s
- public interface MonsterState {
# X8 z) i9 B* g - void handleState(Monster monster);
H2 ]9 N/ C- k6 M6 t- m) s G - }' L1 a( g4 L, O, X( i
Скопировать код
: J# ?7 ^* ?8 D% `Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
& s' F, A5 \5 t" I. s
0 k" N' f# k. R; g$ h5 X0 iЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
+ K! [5 F8 {' B$ B! a( F. b* O
Класс для начального состояния монстра:2 f+ G% e! n3 d/ R' ?
- // Пакет org.l2jmobius.gameserver.model.actor.state
8 b/ `8 ~/ o% s1 D3 v - package org.l2jmobius.gameserver.model.actor.state;, |; R1 z4 |6 \3 {' F! _# W
- 4 o. r+ _- l% R$ J3 ?
- import org.l2jmobius.gameserver.model.actor.Monster; L: ^9 u" G" J9 y2 Z! s
/ {$ ]/ R& ~0 E5 z+ P6 r$ q. v- public class InitialState implements MonsterState {# j" F# X4 k3 C* r6 o
- @Override5 s2 o) _" M7 p" ?
- public void handleState(Monster monster) {
0 s3 x$ t1 C- J$ k - // Начальная фаза боя3 s$ n4 {. r3 ^! P0 j
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");
5 i, g; N, H4 u2 s# P - }
4 n# C: q: F6 { - }, S7 `0 n" d0 v5 \3 T+ w
Скопировать код Класс для агрессивного состояния монстра:
/ B/ X* R. C" M! N# | j; A! V- // Пакет org.l2jmobius.gameserver.model.actor.state
6 e0 w! v2 T6 E7 C+ S9 H - package org.l2jmobius.gameserver.model.actor.state;4 z& t: `$ {5 V
- 7 u0 A5 n3 |5 k. X& M# W w
- import org.l2jmobius.gameserver.model.actor.Monster;) w4 B9 F& z7 A) z) Z8 h
- 9 N" ?! \+ Q2 M8 V
- public class AggressiveState implements MonsterState {; P9 a) J! o' J/ i7 v
- @Override
/ Q0 z4 c+ S7 M8 ~+ p, m% J - public void handleState(Monster monster) {1 d4 L8 M# a) _" H: o% ^
- // Агрессивная фаза боя
" s6 A! g/ T/ Y& \' f- Z3 C - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
7 l6 S. A5 I- [8 L7 l+ [ - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки# D# I* ^0 i3 g z8 ?
- }* S# q$ s! ]) p* r
- }
' Y2 b$ x4 [- h' ]8 g+ S
Скопировать код Класс для финального состояния монстра:9 n& M, z+ S- I4 {- J0 g
- // Пакет org.l2jmobius.gameserver.model.actor.state
+ J7 f7 C( s2 T& r6 i! g: z - package org.l2jmobius.gameserver.model.actor.state;
: X1 V6 O4 v# h3 H2 L
. q. Q! F" p7 z' `& `- import org.l2jmobius.gameserver.model.actor.Monster;
! X5 I% M& Q; v5 s H* ~: H
[5 u2 [" e# h8 R f `/ O$ _/ M- public class FinalState implements MonsterState {
! T2 v) i# G, ^ - @Override
F. B! k1 ^2 F8 u% j7 Y( k - public void handleState(Monster monster) {
0 F/ t2 e; w$ v4 B5 s+ k% F+ M. O - // Финальная фаза боя+ M" O" S+ W& }# E* J
- System.out.println(monster.getName() + " готовится к финальной атаке!");; I3 c2 Y% M+ {9 G- ^$ T
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки' U6 d. u; N+ M# f% H2 B
- }/ y Q8 N8 p9 D, Y
- }/ e q" t% y5 H, e% y- h
Скопировать код % X& _8 Y( q7 v6 }, b( O
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
( Y7 A* {" Z/ o, A: A+ q' p( P- // Пакет org.l2jmobius.gameserver.model.actor
: x( E1 a. S) \4 e* f: W, O' R - package org.l2jmobius.gameserver.model.actor;
. R, f0 j1 q, A
; \) {; E( a- H5 e# f- import org.l2jmobius.gameserver.model.actor.state.MonsterState;5 M% o$ }# Q: V1 c! K1 Z
- import org.l2jmobius.gameserver.model.actor.state.InitialState;
1 i3 ]# M/ @9 E4 D' _& k* H
- R, Q4 l1 W/ d2 u; v- public class Monster extends Creature {2 M/ z! C. C% }1 ~. o
- private String name;. |. N8 ]6 M1 U* u7 Q1 V1 N
- private double attackPower;: I: v8 I h( j# f- G( T3 R# E8 P1 l
- private MonsterState state; // Текущее состояние монстра
3 z) A- i+ Z7 @
1 e! x3 o) y3 {: Y- // Конструктор монстра
) R$ M" E0 |& | - public Monster(String name, double attackPower) {
7 w) i) z! g& J6 y, ?- j' `. }2 a9 C - this.name = name;
' n( `) ~+ v- Q' P- D# I - this.attackPower = attackPower;
+ l7 j5 x- m" c/ z4 C; S - this.state = new InitialState(); // Устанавливаем начальное состояние
& K2 q" V! l+ a - }9 Q7 u; _: G& r& W' R. v5 V6 B9 p
- 5 ]3 F8 ~$ y0 Q! i8 E
- // Метод для смены состояния, F; N- y6 u1 M ?3 d5 c
- public void setState(MonsterState newState) {
& J+ c, M1 a4 @, B - this.state = newState;
+ G, f% {: d! W4 Z# y - }7 p3 b: V; a$ n1 Y
$ ?2 ]2 p/ ~! ?4 i- // Выполнение действий на основе текущего состояния* U& @: C2 a4 I1 O
- public void executeState() {
( b7 `6 p# ?5 K; v8 D) i - state.handleState(this);: S8 Q$ w h$ i- M
- }
& ^6 d2 h# \0 } }6 @ - - ^( E! z6 U5 Q2 Q1 I
- // Геттеры и сеттеры
; [ |' L( H2 B& P0 t2 e" R( H, s - public String getName() {
, ]3 _4 _5 l$ `, B' | - return name;
1 T5 L2 K7 M/ R5 l2 O$ d - }7 t3 |; \+ u' |, k S
- & r% H+ [; p/ V
- public double getAttackPower() {
! |( p# b. \" o3 W9 c' v4 F2 u' r - return attackPower;
0 W8 b& w6 ^, |& Y - }
6 |( q3 L0 `, u
' }- ^* \8 _* F- public void setAttackPower(double attackPower) {
9 `& a- j- F- W& D* S8 P - this.attackPower = attackPower;0 \- \# f+ o5 d( v' X% w
- }
0 W6 @2 ?% C, y1 _ - }( p, p7 @) k! r) t M
Скопировать код ( H4 @. o, j J6 t. ?8 x
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
9 K- l( S7 ~; m5 c* p. F8 v! ^0 ]. E. ~2 G( z3 N# ^' Q' M
- // Пакет org.l2jmobius.gameserver.model.battle( o; h: b6 V( e' X+ M
- package org.l2jmobius.gameserver.model.battle;
+ b3 L6 I' J/ p( L0 J" U
\) a, B: w# B- import org.l2jmobius.gameserver.model.actor.Monster; v1 c( [4 N4 b- |8 \! m1 P
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
# C7 a2 X' U7 I- F7 U, Q - import org.l2jmobius.gameserver.model.actor.state.FinalState;
% n. |2 u: F$ R, c
- v7 C, `- x9 @; u; x/ G- I- public class BattleSimulation {
5 g0 u9 h% @, c - public static void main(String[] args) {
" L. L4 H3 m& \" M# m - // Создаем монстра с начальной атакой
( G+ R4 M4 m7 l0 x/ _0 ]3 a - Monster monster = new Monster("Дракон", 100);
' i Y6 x# W; d9 m3 J
/ K+ ]4 R/ n$ t" e5 O9 L" R( C- v- // Начальная фаза
; D: c/ z. h' x, a! t) K; W - monster.executeState();8 G9 p" E% P9 _! q7 U
- . c% ^% z5 h7 u
- // Переход в агрессивную фазу. k7 _; p3 @4 ~5 v! `& T
- monster.setState(new AggressiveState());. [7 d, c4 S; j1 N' P, E+ t
- monster.executeState();! q1 f& o. N5 x [
- 9 T) S9 x8 A& S1 u9 L+ ?% x0 Q1 O; g
- // Финальная фаза7 @. f, X; z/ D' b# a
- monster.setState(new FinalState());9 `' b; T a$ j, R+ C( Q
- monster.executeState();/ y3 v7 ?5 m* N, D" T
- }
6 Z, d! L# l; F& f7 K - }2 E3 ^& n$ v) Z4 i8 ?- L6 J
Скопировать код 8 F+ U' @6 j% b1 H. m1 }- ?" ]
Комментарии по структуре пакетов и классов:
1 q( {" ], ? ] P, M/ ]5 H' n7 \1 K, r- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
, P+ n- f, O" g) t* U% l+ D ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
/ k( a# o1 n- ]' y$ M- \Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
; W1 `4 }( t/ J: ~. _8 ~0 A9 p3 d4 c( O6 h7 H: w
$ F0 {1 b# Y% H; ~ C7 A9 D( A( q" x* x F4 n# k- r6 _
4 t( r/ a" o; I1 ?. p
! h* ~) j' N6 O- h
/ D& O# a5 h! p: m
Q0 s$ L5 {7 q- _, v
3 R6 D, f* s; U2 a
5 ? ?0 i! W5 Z
9 W8 T+ t9 Q5 n" m
! Y( A$ e2 x; h2 \! s8 i7 @
1 P. ^2 i' L# j+ `( l1 ]
" {) s g" N; U$ _2 `# _0 H: `! K( K
/ ?( e$ U( v a# v7 }4 ] |