Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
2 i8 ?2 m4 X* K* i. s( ~- g
6 t& H% o6 e4 s" P8 A7 @1 P0 ?Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
( f3 o8 d: f$ G$ W& e' w' F% A E, v5 g; T# n3 H1 q- L5 z4 @; H0 H
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.( p0 R1 ]1 m5 s1 \1 C* ]
8 l# x3 w: g- t @7 S
- // Пакет для состояний монстра* `- ?" |& F8 o0 V
- package org.l2jmobius.gameserver.model.actor.state;$ v f) @. b# Q9 N+ m0 _
- ' F# @9 y9 B1 ]
- // Интерфейс, представляющий состояния монстра
/ n! f; h8 ]& O. [- ? - public interface MonsterState {; i8 \2 a! H- k& x/ i# u* z
- void handleState(Monster monster);5 J$ c1 i& ~9 _. e' a2 g* X( k
- }) E/ e0 S4 J1 C$ @/ I
Скопировать код 2 T4 z4 S8 s+ E) q
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. * }* g" y' m9 V( W: E) u0 {+ R2 Q
" G' B& y& t( X- H( Z3 oЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя./ R6 V |" @) |& Z6 z- V
4 i) @) ?2 A, Z+ E+ ~) c% ^
Класс для начального состояния монстра:5 d1 C0 E: M/ u9 U
- // Пакет org.l2jmobius.gameserver.model.actor.state' Q7 q0 Y( e2 N& R0 F& E' S, H
- package org.l2jmobius.gameserver.model.actor.state;% V+ v# P0 B% j) p3 z( H% L3 Z" ]
& s" i# Q1 X: Y& C( n- import org.l2jmobius.gameserver.model.actor.Monster;& Y8 @/ {! T# {+ U+ Q
% S+ n2 X7 ^! W- V6 R- public class InitialState implements MonsterState {: ]( R% \: N9 R, ~* @7 w
- @Override
* A- g6 f! c5 a. _7 |+ | - public void handleState(Monster monster) {
, q2 Y O5 o7 D& a - // Начальная фаза боя" Q L! F7 s$ I$ ?
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");
: ]/ T0 z8 v0 I8 k: _: w! R5 q - }4 N8 a, B0 l1 V7 ^! u! i# u3 [
- }
& B# K1 K2 ~- e: |* |2 c, d7 ~
Скопировать код Класс для агрессивного состояния монстра:
8 Y$ y T) S1 x: C, m- // Пакет org.l2jmobius.gameserver.model.actor.state E9 {5 M. a5 o3 H
- package org.l2jmobius.gameserver.model.actor.state;
" X _9 f# K8 D
$ Y3 f5 U. q0 _5 }1 x- import org.l2jmobius.gameserver.model.actor.Monster;% _+ i6 t# a( o( @9 v: d
/ [$ Q" i9 l2 F& m) s( d5 H# F6 h( u- public class AggressiveState implements MonsterState {
* W1 ?% ^3 n/ s( v2 a - @Override. n J/ a! P0 \- `4 {, t
- public void handleState(Monster monster) {% z& M4 d/ e) e+ k+ z' D
- // Агрессивная фаза боя: q. ?, p! {/ B! W& o; {8 V# Z
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");2 ^. R# t; P' H& s+ J9 r
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
% O' S1 m2 K3 O# C, E/ h - }
/ t. ^$ h$ E; }; P. |) r5 \ - }
( D! K4 ]' N" y0 }7 i
Скопировать код Класс для финального состояния монстра:
/ E+ m/ E3 o* {- R7 {- // Пакет org.l2jmobius.gameserver.model.actor.state2 Q; o' K( q& m7 K
- package org.l2jmobius.gameserver.model.actor.state;- L, f/ A6 B B- ~+ Z; c
) G1 y2 J+ T# R" p; Y3 f$ |- import org.l2jmobius.gameserver.model.actor.Monster;9 W& d: t F# r0 ]
" ~6 X9 `, f# O' u/ C" d- public class FinalState implements MonsterState {* U5 ^5 m C. r* O
- @Override
. ^8 M$ T I8 ]0 Z4 C' S - public void handleState(Monster monster) { w$ O$ N' W; z1 @: S+ Q
- // Финальная фаза боя
/ W2 ]& y( K- r& {5 y - System.out.println(monster.getName() + " готовится к финальной атаке!");
' a7 Y# c! R7 y: g N4 N - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
! k! ?6 J. L' P2 X6 f. x - }8 t7 N7 O: {' [) \# H0 m9 a
- }- J, r: E; I) e: z
Скопировать код 4 N& p5 Q w- ?. Z
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
: Q4 S! ^4 X* ?0 o3 a# N- // Пакет org.l2jmobius.gameserver.model.actor
4 V+ C; f# E! e$ ` - package org.l2jmobius.gameserver.model.actor;$ Z2 ?2 j: @" P, Z R0 f
- 4 O u& H; R& \3 @: n! c5 _
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
0 o/ c* U5 P9 j. J( n" u: {, C - import org.l2jmobius.gameserver.model.actor.state.InitialState;
6 p) s! s% z) b2 i" e4 H - - \6 S: F6 i4 ]8 S4 p
- public class Monster extends Creature {7 ~8 A, w' S; T0 q2 M6 y) E7 t5 k6 J
- private String name;: ?: `- g- S& _$ K
- private double attackPower;3 p6 J4 X& ^2 l
- private MonsterState state; // Текущее состояние монстра
! b; N- ]# K2 G A0 h
, B. G. |- V6 V. s* R- // Конструктор монстра
! o6 c* q- N/ l- }8 e - public Monster(String name, double attackPower) { b# S1 |1 f& z' l \5 D
- this.name = name;& u" B' [8 S& O" w/ Z
- this.attackPower = attackPower;
" i2 B; l# V6 N' B - this.state = new InitialState(); // Устанавливаем начальное состояние$ d. Z& _' u: e9 O$ Q
- }% j% d4 X/ S. f% G2 T
' C: K$ C& C1 y- // Метод для смены состояния n9 C- v- q5 W1 Y6 c! t: R2 I8 s
- public void setState(MonsterState newState) {& f# {$ x3 I$ J- x
- this.state = newState;$ q. D+ f9 Q3 E( y
- }. N5 T" f' R# S- ^
- ' _& C$ d/ k4 k: f& m* Y
- // Выполнение действий на основе текущего состояния) N! x/ Q+ q; k8 d, T2 ^8 B
- public void executeState() {
/ p& [# U8 _' E8 ^5 R - state.handleState(this);: n9 `% P; |3 @% F, U
- }; _' p' M0 q# @2 A
- z1 F6 R/ a0 I$ f V/ A. C! h- // Геттеры и сеттеры
7 k& `8 X3 U' L. o" f9 S8 y- m - public String getName() {
8 M) a8 I! Q# B, q7 T - return name;0 Y$ u0 m; A: R+ M6 i" \% _- V( n; O
- }, E( r$ [( }% ]# ~, ~$ ^3 _9 G
1 B% ~" J' T F7 w7 t- public double getAttackPower() {0 P* L0 u/ I( U* W9 U" W& e+ R
- return attackPower;8 F- W0 ]& G3 Y' K: A
- }
4 x& C* c' v# L/ x/ \
0 }& f2 ^& }# W: Y* }) V. b- public void setAttackPower(double attackPower) {
6 Z& g3 H- f8 c6 ?8 m; o; u: |& Y - this.attackPower = attackPower;& _/ |% q! k4 P
- }, g# e2 l% i# a. b# S" Z
- }) ?9 k$ Y- z" b+ y; W" s. b
Скопировать код + l6 q- g2 J/ n' g/ _% n+ {
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.4 v9 h' c, a' h# Z
0 }) o7 X' v+ ~6 w- d3 M
- // Пакет org.l2jmobius.gameserver.model.battle
: f* Q4 [5 }1 q% |% W - package org.l2jmobius.gameserver.model.battle;; w0 ~* l0 m) e+ f. a: X1 I m
- 6 A, m& {% f- a/ o$ n0 O3 l/ V
- import org.l2jmobius.gameserver.model.actor.Monster;
" Y/ u( R- `& t* B5 ~ - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;5 {+ ^' o b# k$ ~. o- X! R! J5 b
- import org.l2jmobius.gameserver.model.actor.state.FinalState;8 z$ |$ a+ S1 n
! _5 _% a7 P1 V! o8 M- public class BattleSimulation {+ x8 Y$ q! \: P% l* ]
- public static void main(String[] args) {
& N2 J4 o, ^3 R! J2 c; J5 e - // Создаем монстра с начальной атакой
+ Q$ V, R& I( k+ F" h5 P) Y7 y - Monster monster = new Monster("Дракон", 100);2 j. R" U) O0 k0 e. M7 ]
) y, o: r _4 _- // Начальная фаза* B: {3 Z# v8 B, ~! r8 s* n
- monster.executeState();& b2 _! q: V, L4 Y" q% }) Y2 B
* ]7 ~# H5 K# L0 ~ P$ `5 A' d- // Переход в агрессивную фазу
( ?3 [. d6 q2 B/ t" m; ~ - monster.setState(new AggressiveState()); x) V* C/ |9 q4 O7 H/ q
- monster.executeState();% v+ I4 z3 Z0 n
- & K: d# R& `+ @! c6 z; [9 J
- // Финальная фаза! a+ V+ G0 a# ] R5 K
- monster.setState(new FinalState());. A! y+ x/ f; o0 q
- monster.executeState();
5 b3 p8 c$ d4 _ - }
" o. L7 ]! r4 K' b! M# A - }
5 E- j2 \+ N* d6 @, } z; C) [1 W
Скопировать код
; i5 g H: m# r0 |: A' ~9 B" g% CКомментарии по структуре пакетов и классов:6 @* s' g/ C2 r& @1 ~
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев. G2 F! @) s$ C' Y3 c. Y7 V5 a3 m6 E1 x
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.: }$ z$ U2 _! a- w! z: |, P) z
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!. U# x6 j0 r7 M8 Q% g
; D9 ^5 C7 T& q3 \7 m" C4 R
7 ?% `$ ^ w& D7 R5 H# {3 S
9 }* ]' j/ N+ E5 P5 [; Z' u; {7 M- c) F: f5 H9 O4 Z' H4 z- d
& \. {5 n- ]4 F$ F8 d9 D/ K, p B/ f, ?
6 K1 d. j+ w9 P+ Y* l
1 x5 N5 b1 c2 }! L
* B, B" t- }4 [) u' a
! S. k8 M1 j' |3 C/ u' A) N" y* Q9 s: _1 w5 i
1 H5 n1 x% ~, Z6 o+ B1 o# @: x9 P( A( b" b X& O. }! n7 b! P" v
% `8 H% P4 s& C2 ?
|