Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
- c7 ?5 \5 j4 {" n3 }. k
0 r; G8 V( b, }. {5 qЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.( W& k2 O! y& ]; ^- t
- {, @1 ^1 I- t
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.% t% w& y+ ?' w! R. U+ [
$ X/ j9 k* P' n- B& z- // Пакет для состояний монстра
, b) E: h8 K* a( T& V2 h8 ^ - package org.l2jmobius.gameserver.model.actor.state;5 m5 d5 t7 \: Z! c2 f, W! ~
( C+ p' F, q( o+ [- // Интерфейс, представляющий состояния монстра
7 P- ]8 N+ k) a7 Y2 t8 \ - public interface MonsterState {
1 {% L5 t" F5 l( N @+ S( U7 O4 p/ O - void handleState(Monster monster);; R! x, x5 d! b) x( z0 R+ z
- }
9 i' P- r9 F! o
Скопировать код 4 s8 F5 I+ t0 U# p- f. q$ ]; Q k. \
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
6 N& h* V9 s6 G g! s
, ? n5 R! A8 y6 S4 AЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя. D- ~2 x, m, W: i0 f" F1 _
; h, t& ]: B3 _4 }
Класс для начального состояния монстра:
% l& t% s! ~ o2 @0 Y# I- // Пакет org.l2jmobius.gameserver.model.actor.state: t% Z1 l+ \. I& F! q
- package org.l2jmobius.gameserver.model.actor.state;5 \: o4 i: e1 b& D
) O) J. L: U+ d6 L( w9 ^- import org.l2jmobius.gameserver.model.actor.Monster;
. e( M; ~0 S5 ]# F8 ~/ q - & f, z6 x. _- R1 a, u( _
- public class InitialState implements MonsterState {
* f4 Z- M1 _( p1 N6 G/ e - @Override. X3 G( V7 M+ E# m' O6 K4 B
- public void handleState(Monster monster) {
) U) |5 A' k6 [. O& B - // Начальная фаза боя6 R3 J) w% w. _( }8 t3 W3 W
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");
- h" {: L8 h& B6 I; S* d3 M5 ? - }
/ U6 k2 K& b0 U$ D2 V v# W* V: h) L - }6 |- k( C M( y
Скопировать код Класс для агрессивного состояния монстра:
( Z) C3 V A. y' B7 Z: p3 B- // Пакет org.l2jmobius.gameserver.model.actor.state/ l0 a9 n" O! b, `- e! _( ^) C2 i
- package org.l2jmobius.gameserver.model.actor.state;6 f& q- ?% W# H+ N3 ^* D
, K3 C) t V2 e, M- import org.l2jmobius.gameserver.model.actor.Monster;
( p0 ]8 A. m# a2 Y
$ g; t- G2 ^4 w3 Y3 g" Z, z- public class AggressiveState implements MonsterState {
3 ?5 H1 y* E' I- h/ H - @Override
4 I4 x! h6 L% s) m* y3 f3 z( R& k! S - public void handleState(Monster monster) {
1 J+ H, L4 {) m: z - // Агрессивная фаза боя& Q/ I2 Y" K0 V( {# m/ @
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
8 L9 @. Y! R2 C. U0 L) I2 F* ` - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки; @0 ]; z/ ^: g6 S2 ]
- }7 I9 Y! b; a$ g4 J
- }
1 D, v, n% y# h I
Скопировать код Класс для финального состояния монстра:
# V4 L. }) l2 t' [0 s; y) i. c- // Пакет org.l2jmobius.gameserver.model.actor.state$ E# P9 h |8 p: p+ V% @9 {1 K5 f
- package org.l2jmobius.gameserver.model.actor.state;
f8 P" M7 G3 p" _. d - 4 n+ D# L! a( L; t
- import org.l2jmobius.gameserver.model.actor.Monster;
1 v2 r) n1 ]6 g" w# b2 `
- Y7 S* y) }) e" ]- public class FinalState implements MonsterState {* c4 V4 \8 M# o/ t& _4 p
- @Override
( H# q% ?, b* S, o# J - public void handleState(Monster monster) {
6 f: F2 R# X/ E e3 g - // Финальная фаза боя5 ]# _( |5 U- l# Z3 w+ n3 z; d7 g. N
- System.out.println(monster.getName() + " готовится к финальной атаке!");
# p9 H7 @6 f8 {- R - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки0 ~8 R+ \) ]# k E D
- }1 u$ K$ {/ J8 E5 J" D! o* G
- }
3 @ V; \$ a) a6 N# n4 i9 G0 r
Скопировать код
9 e6 d0 \7 J% u) }. i5 Y" J- m% F! \Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.% k" U: M7 a+ ~4 v& g
- // Пакет org.l2jmobius.gameserver.model.actor
5 |/ }' R! F$ E( `9 ^6 P - package org.l2jmobius.gameserver.model.actor;
4 [9 B6 u8 \! W5 m - ' x) ~0 y2 B5 Y7 ^4 H$ B8 W) V
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
, n/ N5 g" N' S& f% c. C* `. r6 v - import org.l2jmobius.gameserver.model.actor.state.InitialState;
8 `( t* l6 E' S) W) F7 ], o9 v
% Y' D W. T% [! |! ~7 ~! a- public class Monster extends Creature {
" ~7 i/ Y! H$ t e) v: i# | - private String name;5 j& q3 C" O! u: G
- private double attackPower;7 B5 v8 | D$ _' R( S
- private MonsterState state; // Текущее состояние монстра
! G) j) W. U) d8 V& P4 ? - ; ^0 y$ u& k5 h" F! P
- // Конструктор монстра) A: |3 P$ U$ o
- public Monster(String name, double attackPower) {
, ^7 E5 A! i0 ~& w) l - this.name = name;! V! M9 q2 |) o! v* n" `6 m* M
- this.attackPower = attackPower;3 e* b& D# l6 @! h
- this.state = new InitialState(); // Устанавливаем начальное состояние( V' F) p, Y6 t4 g8 `/ P
- }6 B& [1 X" C8 Z1 X P6 K
; q4 v- h# j- K& J) ~- // Метод для смены состояния
0 V- U" s. t: R( a$ |/ p - public void setState(MonsterState newState) {
4 {3 u# x e1 G, } - this.state = newState;
/ ~. ^0 ?, C$ A6 H$ B5 V9 s' Q% P# p - }
, {" q7 @5 v6 k
7 @6 M$ [5 b) m- // Выполнение действий на основе текущего состояния% V8 M+ B1 e( f# }9 x
- public void executeState() {4 ~3 y( q4 `' \) c( t) s" C1 S
- state.handleState(this);% ~, Z. q# w7 }' j% N/ O% Z
- }
5 X! \! ?( q- ~( w
' n9 z0 h! E7 S0 n; W8 D; g7 u- // Геттеры и сеттеры- t, l9 r3 \3 z3 f, n1 @8 _# T
- public String getName() {: y3 k1 [' c0 h2 n3 w
- return name;
6 H* s9 w5 f; @! ?/ ~6 c, t - }
6 z7 P( }$ \, Z r0 h& J. H, I+ n' b- q
' f# n i5 d7 {# j/ N* x- v- public double getAttackPower() {; `9 r6 r* p+ K! I
- return attackPower;5 c L% x8 p ^; \, k4 c
- }- P7 ^7 m. t# l: Q ]
- % O. }+ l( S b$ _2 Q; [: d
- public void setAttackPower(double attackPower) {
. k. K" A& v$ d& |" ^ - this.attackPower = attackPower;$ X0 {# t4 s5 Z4 q! P
- }; F# v( S% d( b3 g- [8 E* M9 b
- }
8 M {9 d8 l7 {# U" I+ W
Скопировать код
8 P) W! G1 ^3 m. ZШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.* G% U+ E" P8 I1 e7 g. B5 d
) O2 X9 h, u4 j& K+ Y, j- // Пакет org.l2jmobius.gameserver.model.battle
! q3 R8 H- R+ g# q/ ~$ I - package org.l2jmobius.gameserver.model.battle;* C3 l; \# r* n6 T3 l1 ]( V
4 w2 U& ]& s1 q7 |- import org.l2jmobius.gameserver.model.actor.Monster;
. [! f. K6 H }& V, s - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
: ]6 F! ?" A+ Y2 g4 }6 Q/ E9 C6 j6 s - import org.l2jmobius.gameserver.model.actor.state.FinalState;% x( x: y# ]( l# r" p% K
- " y" F: H( @1 A" N( }
- public class BattleSimulation {: r& u9 P+ h" o; |" o
- public static void main(String[] args) {' v5 y- Y) M# V' f6 K
- // Создаем монстра с начальной атакой
7 z, U7 e9 y( ^( Y - Monster monster = new Monster("Дракон", 100);1 A+ G' R, B' n1 ]3 J
- ) K) Z% L9 o* p- P6 u9 f
- // Начальная фаза
* S& ]. q! x3 w; [; V - monster.executeState();
% Y" y! W' d( `, N! I1 C6 v1 V7 e
- t1 X$ O9 ^' W: N5 `: V, W/ P- // Переход в агрессивную фазу! Q( R! a$ C4 l# e S" _; n
- monster.setState(new AggressiveState());: w3 e' p) E5 R
- monster.executeState();
3 B- M i: I" e$ V% p+ f - 2 y3 K. ?& ]& _; u
- // Финальная фаза( ~5 ~1 S* B# J$ G8 `7 Y
- monster.setState(new FinalState());
* N8 a! `* b8 G l" y: |( l5 N - monster.executeState();
- L! I. Y; g/ `. u" d( T - }. l9 I. Z* N5 O8 m
- }
5 o. J& d5 G4 G& u- \
Скопировать код
: h! n; p: `) d0 n3 A& O) UКомментарии по структуре пакетов и классов:$ G% X) l) ?4 B
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.+ C7 Y" X1 q) C' o1 @7 ~1 l+ Z- q
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
+ M& H6 P% m! N; mЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
4 J5 Q& l, I4 H |. z; `/ k. f9 T4 x n W6 N+ C
# w$ d W3 p: U4 |
( l( w* v. ?6 j5 R( e2 m1 I/ {4 D
- A* D6 v! @; H2 U; d# O
+ F8 ~% v8 I5 D
% W7 Z2 Z6 b% S2 i* Y3 q& y
7 a& u3 V% L5 L' h$ r9 K9 f* ^% Y U i# m, q
# `5 @4 y4 Y- \- i h& k/ @; a2 v+ o$ C. H, M, k* V
- s5 \' X0 J: j5 J: r/ Q
/ u; m/ T! r5 y9 L- x3 o& f8 N; k- t" R% l4 u2 X& S( S
5 S v4 y% S$ e9 s; d; _9 E2 r* t: l' i$ T
|