Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). ) Q5 d9 o' l9 l( e! `4 y- r
$ P5 T2 J- s* p# w i Y4 f5 y& j
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.1 l( m4 V" ~# I% R, O. \! T
K* Y7 B6 C: @! h
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния. `% W8 {3 c1 N8 ?" ~
( I+ G& j- y: m+ v- // Пакет для состояний монстра) w$ ?/ z1 n( x. c/ Y1 a
- package org.l2jmobius.gameserver.model.actor.state;: ^# ?" h4 {8 ]7 I, Z/ G
# K* z) ~% U8 N- // Интерфейс, представляющий состояния монстра
1 ]; H6 x$ s( P5 D) c. L1 a - public interface MonsterState {
: T- ]. y* B+ M' U - void handleState(Monster monster);; l+ v- V0 l% O, J+ e) n+ _0 g
- }
- j* j, u/ A f0 H0 T# r
Скопировать код
5 f7 a' ]2 T. m6 e. _+ S AШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. + S' @ D2 |8 L+ _& C( H. n
2 B- w1 ?" X/ c$ ]( j9 `Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
# z9 H* ]# P. l# J+ I2 R/ A
1 |9 N; H2 P9 E) c' X) \( T8 W& D+ W1 bКласс для начального состояния монстра:# s9 F3 R& X( |, H, z( Z
- // Пакет org.l2jmobius.gameserver.model.actor.state
! i: x1 {. z. \( j - package org.l2jmobius.gameserver.model.actor.state;9 b3 O0 F2 s0 k" L2 h0 J
- / X5 s8 H7 W( [, j/ _! @" b
- import org.l2jmobius.gameserver.model.actor.Monster;' _0 F" ]0 a+ Z. a& L
+ f; z& |2 F+ I3 d$ Z7 L; _- public class InitialState implements MonsterState {
# e) Q/ W1 ~- C, F - @Override
1 d0 w7 z* w. a% d. i( [9 H6 _ - public void handleState(Monster monster) {
! a. S( m- D- D - // Начальная фаза боя( k% A" [* _* \6 i$ V' L* u
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");
! }4 [) i3 S& a1 X4 ^ - }
, E7 Y; n$ f, r - }
$ i7 Q. @& g( i6 g
Скопировать код Класс для агрессивного состояния монстра:
* S9 g+ J7 E; ~6 d$ j$ y- // Пакет org.l2jmobius.gameserver.model.actor.state
& ^) Z2 ]; q* P- T# _3 R - package org.l2jmobius.gameserver.model.actor.state;
" d/ q# P, W* L" v9 a - : ^0 L2 h6 y# G, p6 \; C. @
- import org.l2jmobius.gameserver.model.actor.Monster;9 l. x8 I7 `' @- B
- & S2 d% a" C+ e; ?4 t
- public class AggressiveState implements MonsterState {+ ?/ W0 E! m( R- `8 v
- @Override
0 o0 h8 @2 E# w - public void handleState(Monster monster) {; x1 Y* w9 ?3 J8 A8 W1 M2 O+ h8 ]
- // Агрессивная фаза боя
. q0 K; ]! P2 Q - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");0 [$ A3 G' r2 v x/ T. l
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки4 m( U" y f& G# i, ~2 I7 l( H
- }
$ F# k" S. r# @1 N0 I! o% @ - }# ^) x7 ]6 L7 `
Скопировать код Класс для финального состояния монстра:* k4 _! J2 R: u
- // Пакет org.l2jmobius.gameserver.model.actor.state
* i- _/ r& I0 C2 ~$ l. H m f* K - package org.l2jmobius.gameserver.model.actor.state;
) N# l6 R7 Q9 n, Z+ M - / W3 E' }. P% O* }
- import org.l2jmobius.gameserver.model.actor.Monster;
* j5 ?2 O1 }% t& t - 5 ^& _" v5 |& M- ^: {4 O0 q
- public class FinalState implements MonsterState {
) u8 T6 I) u8 U6 E# d+ M - @Override
! _8 r9 W3 U! f7 w; c$ y. U; Z, ^3 A; }9 X - public void handleState(Monster monster) {. o% g: P( y7 b f b7 l
- // Финальная фаза боя4 `+ m' F) \. L$ H0 R) ^
- System.out.println(monster.getName() + " готовится к финальной атаке!");0 A1 h& [0 f+ o4 e/ W5 E
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
! a# M' E4 S! z9 n; Z- U) u+ y - }
o: H3 c. f2 w, G! f - }7 V. ?; f( x, n5 T
Скопировать код
, l, h4 ~) v# s! tШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
: V1 x, t/ j6 o- // Пакет org.l2jmobius.gameserver.model.actor* P1 [0 L" z/ F, N- R4 e
- package org.l2jmobius.gameserver.model.actor;
5 k; n) T$ k6 d- E ]+ ^( h8 V/ |. F - V0 c! O" ^9 c w, W
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
; u0 ~% M" t5 v7 @1 [& F - import org.l2jmobius.gameserver.model.actor.state.InitialState;( o8 ^0 B' s g' p
; x# z: ~; G6 S6 A6 y- public class Monster extends Creature {5 n3 M1 C c$ m8 u& Z. h [
- private String name;) f. e- q, J" w: {& E- }
- private double attackPower;2 L; N& K3 S0 T. ]4 q
- private MonsterState state; // Текущее состояние монстра n9 R3 I1 L% T( m3 l. V
+ m& R$ B2 j0 \+ a4 O- // Конструктор монстра
3 _2 f, A. K! j$ Z0 W- I0 U4 Y% W - public Monster(String name, double attackPower) {6 q% ]2 A, B I6 Q; O" E" @" m
- this.name = name;! ?5 |9 Y/ F2 j: K
- this.attackPower = attackPower;
8 F" i: `! p9 d7 Y5 R0 Y/ H - this.state = new InitialState(); // Устанавливаем начальное состояние
5 h. ]0 t4 C$ j X( o; J& Y - }
t' ^! n" N/ Y- O1 i4 A
& Q& N" _; F6 b! O, D! ?1 L- // Метод для смены состояния
* A. D9 b3 o! z - public void setState(MonsterState newState) {
- A; A3 G l2 i+ j - this.state = newState;7 L5 E# @ V9 J- a% U, Y1 B, u
- }$ d8 r& ` y: D0 q, C7 k
5 g* D- i4 ~; B b% p( V- // Выполнение действий на основе текущего состояния
% C# D& ]( r' M - public void executeState() {
5 V5 S6 E2 o7 z9 s( ] - state.handleState(this);
$ V, Q3 r1 R! g5 N - }
/ ?& s) ?' j) R
. _/ c+ B2 U, P; F! i8 m- // Геттеры и сеттеры
0 n, p# C# }8 c. H$ p - public String getName() {
" U, d6 o" m! n8 A. \, k, ~ - return name;6 N) ^2 W: ]5 _ Z( F
- }5 Y( ~: Z1 V. d# z6 y1 u
2 E; y. X6 i/ ?% z8 r- public double getAttackPower() {
& _4 P( ~/ m$ B. `$ `7 j) M - return attackPower;
$ b: ^, g1 e# X% A - }
2 H$ @0 l* ~$ \' b" h8 B5 J7 g
: A5 ~: w: p ?6 G+ B- public void setAttackPower(double attackPower) {, c6 u0 i$ `7 p2 P" _$ [! {" L' [3 b
- this.attackPower = attackPower;5 |$ G0 d1 |* p4 z7 j) Q& b
- }# r3 Q$ Y( q4 B V1 E w6 _
- }
$ B/ I0 q/ J- @- r# j" p( r
Скопировать код E; t" j, |+ ~* c9 x' L
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
; T0 L- v- p/ T1 o
8 G0 `$ x2 k0 ]+ {6 ~' L- // Пакет org.l2jmobius.gameserver.model.battle. E V: c, v7 b. Q7 D0 h6 W* U! m4 X
- package org.l2jmobius.gameserver.model.battle;# i/ \* g n( N; f: b
- / \, \. J5 ]% c5 n- `: I
- import org.l2jmobius.gameserver.model.actor.Monster;
6 [# I) N) F7 L; S4 M - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
: ? |: O+ a% Y# w5 L2 a" K( } - import org.l2jmobius.gameserver.model.actor.state.FinalState;
0 a8 t0 o- f. Q3 W) I/ q# }7 ~ - 7 z& R- f9 E" W8 I3 \* K# i
- public class BattleSimulation {5 ?4 ?" J! Z& C; u$ |
- public static void main(String[] args) {2 M$ T! u0 }# @' o9 C( a, J8 Y
- // Создаем монстра с начальной атакой
; E! R" B# L6 m' c7 J- n2 p - Monster monster = new Monster("Дракон", 100);
. h3 I5 j; {9 D6 K8 Y) Y( v - h. z: S2 Q6 r# u" ?
- // Начальная фаза
+ ^0 L6 s0 q$ \9 p4 n - monster.executeState();. S( q* B7 [# H
9 U$ O8 p9 j& U6 E" O- // Переход в агрессивную фазу
" k' ]0 Z2 I9 ~/ C - monster.setState(new AggressiveState());
2 [; b5 ?; l/ A7 Q" }. F G - monster.executeState();+ g9 p; H3 m4 s3 z9 m
- ) w- o9 s1 e' h2 ?4 H" B
- // Финальная фаза5 U! O- p7 _' j2 s
- monster.setState(new FinalState());
( R7 [% {6 x6 J9 k) G: n9 E - monster.executeState();
1 L% a0 s w' |, M - }4 i0 G2 b2 e) I* v+ E0 f$ G
- }* ?7 r% b5 j( B# `- W1 b4 ?, o
Скопировать код $ j6 n g4 \6 h
Комментарии по структуре пакетов и классов:9 e( j! Q# S4 k b; u1 U( a
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
$ ?& j/ `& O9 Y ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.' S& R5 e( M9 {1 s ~9 A
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!: E, {3 }4 ?: `) @' T( H
# s" @* c* }3 Q8 B3 \2 c8 y7 {5 R/ B6 r
% F: N8 Y( l1 {! |1 ?# U1 c8 ^
2 m5 V- i4 s' R5 C3 G* H: W q9 }
2 D- s/ d) s) A9 O+ X0 Y9 c& t, m$ W% ~. ]6 {* A
) \( z* k5 J [7 j* J
( g! s! b- E B* d9 z# Q0 c
) W0 K8 N; J0 g6 I- ?
! M( d( O N2 A, B8 e+ G8 B- }: O+ p2 J
# M7 g8 R4 p* a. U5 j3 Z$ s4 M" |
& D3 H/ f2 f1 ~7 g
$ }4 y; q n- I& ?( A |