Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
# P8 {& s) ?, Z s2 ]
O+ g8 {+ V+ ?Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.6 J y Q% a* ?0 R: F: q
5 ]( C# @- @, Q( k( |" G9 C( GШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.7 h, j& F" Q4 p) R1 u& j
# O! N2 u" `, i$ ~6 A C- Z- // Пакет для состояний монстра. }$ l6 z" ^& ], I
- package org.l2jmobius.gameserver.model.actor.state;
+ U7 A3 e7 z J - / V; F) c0 Y& l9 z0 x6 C% a% s
- // Интерфейс, представляющий состояния монстра
) A0 u' g4 O, H5 [9 ^7 ] - public interface MonsterState {* d% j+ Z; o" {! M
- void handleState(Monster monster);
; L* b. p, V! Q - }
/ `# O! s4 E9 C( \
Скопировать код " M0 ?+ L* y, H; X& |0 H2 T2 o
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
; \7 u' X/ `: w2 S# \) I: @
9 ?& V2 U* ]& U4 {* m: qЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя./ l2 n; [3 O+ q8 O. @
" [" }4 e1 S5 g. rКласс для начального состояния монстра:
7 R, k. M6 n! B8 o2 k1 j8 d- // Пакет org.l2jmobius.gameserver.model.actor.state
$ m+ X! G( j! b$ r - package org.l2jmobius.gameserver.model.actor.state;# \; M% f( ~) f! v4 ?0 N8 a
# B7 T. ^" Y" M; U! S1 ]- import org.l2jmobius.gameserver.model.actor.Monster;
: {! d0 b& |- s - 6 ~+ b7 m% [( c! Q/ q* Z
- public class InitialState implements MonsterState {2 U0 Q6 L5 _0 _
- @Override
$ r' V' e' c8 q0 o( C/ p - public void handleState(Monster monster) {
9 P! z4 d7 E2 t5 Y7 S! d# X - // Начальная фаза боя
; U, c9 h! M1 ~! o& r$ ~, k - System.out.println(monster.getName() + " начинает бой с обычной атакой.");, L: A* @, c+ Q+ m
- }
% ~3 P/ e3 C! F$ r! n) u - }2 j }6 C8 G, ?+ j" V+ ~% s7 {+ P
Скопировать код Класс для агрессивного состояния монстра:
' J% c6 }+ c! C# l$ t- // Пакет org.l2jmobius.gameserver.model.actor.state
: o4 d/ C- P8 S v5 o - package org.l2jmobius.gameserver.model.actor.state;
- `- o( b$ N5 z" i
+ h, L' g9 u3 C% e& ?& N- import org.l2jmobius.gameserver.model.actor.Monster; I7 [3 O& K" j% @5 r. Q* z" p8 f
5 x( T+ J7 G# R5 g5 N' J- public class AggressiveState implements MonsterState {
' I& P5 y! a" \' s; q ]- e - @Override
0 K+ A0 u# t% ~6 v - public void handleState(Monster monster) {
$ p4 e$ q8 ~/ j# H& h3 |0 C9 { - // Агрессивная фаза боя* n: j& }$ b+ \' _
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются."); [( k! c6 i) v' M
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки' u0 i$ _1 ?% d3 i4 }" T! Q
- }/ A! P. j% Z: \8 d6 x! l" n4 E% B" h
- }% B- F; r1 k$ c: \ q9 }; d4 _
Скопировать код Класс для финального состояния монстра:
( o3 o+ z' q" ~* p3 T5 Z- U- // Пакет org.l2jmobius.gameserver.model.actor.state8 m+ A8 C, ?. f( {0 ]) [2 N
- package org.l2jmobius.gameserver.model.actor.state;
$ y6 h" ~% M X* i J4 _
K- F! H+ b+ [+ t$ H- import org.l2jmobius.gameserver.model.actor.Monster;
+ G- h; t* I" j2 t; d
' V! e1 D) r& t- public class FinalState implements MonsterState {
9 q# K3 P J2 k) w/ n - @Override. B1 t* x: r6 j+ D
- public void handleState(Monster monster) {+ {/ ]7 J2 Y9 d0 [: \
- // Финальная фаза боя" T; h- Q# \+ q2 T6 {
- System.out.println(monster.getName() + " готовится к финальной атаке!");
4 ?4 }$ {) p$ [ - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки! t% M9 t1 P0 s1 K' I+ n
- }
. f9 L% l$ Z( S/ E6 }1 }, O - }, |0 B8 D$ ~" b2 @, l: Z" e: w
Скопировать код ' z) C0 M& j ]& v2 I2 z" h$ n
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.- k# W4 A: `2 L# U$ B8 R
- // Пакет org.l2jmobius.gameserver.model.actor
" W* a/ P( a- i M+ y2 K; D - package org.l2jmobius.gameserver.model.actor;
( Y( |& N- V0 {6 o. Q - ) D. X% ^' Q- r1 A& C& i1 N
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;* W; o5 V$ B4 p7 D4 `8 f
- import org.l2jmobius.gameserver.model.actor.state.InitialState;& Z4 J0 D7 y& k7 }4 S$ u& C
- ( v1 w( t) \! P# z7 R- N, S
- public class Monster extends Creature {/ p; w& O2 E" q7 g1 `
- private String name; h5 |1 V1 l$ ]
- private double attackPower;
2 e+ c$ S% v0 t0 H7 D - private MonsterState state; // Текущее состояние монстра1 `; {7 ^7 {* b7 E% v9 k* `# @' M4 S' p
- 2 i5 W& W- A) K( f* ^
- // Конструктор монстра
- w$ H: P+ d4 J$ X7 A0 b" t1 x - public Monster(String name, double attackPower) {$ A6 P- P$ g8 Z' m
- this.name = name;9 A6 I8 q9 @( e9 u( w
- this.attackPower = attackPower;( D3 B; O! L/ {: m! D; _
- this.state = new InitialState(); // Устанавливаем начальное состояние
- r5 ]8 N3 c$ K' J - }# U" Z1 B5 z D2 f3 b. y% ^0 v
' h/ u* @1 n: @/ d- // Метод для смены состояния
& q" Y4 G* V/ y) S& W2 u9 W0 s - public void setState(MonsterState newState) {
% q- A* g. f" `! ?: u- `3 n - this.state = newState;# Y) v+ w7 |9 M
- }
+ T1 n- l+ t# Y; J( ` - + p" u2 t: Y3 l8 B
- // Выполнение действий на основе текущего состояния
3 h4 h A4 Y0 ~5 ]( }0 s3 j1 S7 A8 P - public void executeState() {
9 Q3 ^; ]4 F# N6 H/ J# b$ i - state.handleState(this);: q/ k4 g8 |3 ^; G+ H# P0 @
- }
9 A' ^& d# b. L+ w y - 2 X8 q E- k9 u9 N
- // Геттеры и сеттеры$ R/ u4 v. e7 ~ [+ @7 b) h. D( c
- public String getName() {$ Y9 z# l0 C3 Z. B' D
- return name;
5 L" ~% h: `4 [8 d; Q* s - }5 L: L; m% { @+ {( `. R( c
- / [" N, B4 y7 V- x) o. [ `! T/ w
- public double getAttackPower() {
! f( X! t( m0 {4 \ - return attackPower;9 }) Z9 f9 v. I4 }$ [* S# l
- }
& |$ W3 I) C5 T
3 x7 e, J. D6 {; j+ e- public void setAttackPower(double attackPower) {
9 q; q9 [# h& L8 r5 e% s3 B - this.attackPower = attackPower;" S: [2 b, h* J& i& c# x
- }5 f- H& d# B. c# U- [: X
- }# X% @8 n" a, ?8 M# a: B
Скопировать код
0 I& w+ m8 i6 b8 z- ?2 G. iШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
. e% L5 ?% T' P" ]& a* @& g9 Z; V$ Y' n; j, l% a- o5 q
- // Пакет org.l2jmobius.gameserver.model.battle
- V$ M/ z* ]+ w Z% x - package org.l2jmobius.gameserver.model.battle;
) Q' M5 ?2 [& q- E - 7 L: i7 c' S) Z1 [0 N" v
- import org.l2jmobius.gameserver.model.actor.Monster;6 z4 y l' d- h/ P( Z1 e6 y) Y
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
n1 t' N5 M/ g - import org.l2jmobius.gameserver.model.actor.state.FinalState;, P' R! V/ U7 q2 R3 E
/ k6 S8 C4 {1 l! C- public class BattleSimulation {
7 D- ^$ {2 n9 j2 `: d - public static void main(String[] args) {* ~: J( e9 E5 t6 ~
- // Создаем монстра с начальной атакой5 C# @( R' f# g1 w! ]
- Monster monster = new Monster("Дракон", 100);! f/ i% W! {# a' T+ g& d& D
! T5 x9 b. r+ r- // Начальная фаза
/ h# g8 o/ b5 ~3 o - monster.executeState();4 `( C$ N( m m
- - c% v6 B. _" t& {
- // Переход в агрессивную фазу
4 e4 s' ^. z& U7 c - monster.setState(new AggressiveState());
& x) x. n* K$ y0 k3 O - monster.executeState();
3 C- t% t, J$ J7 w - 7 _3 \! _, d7 J6 }4 E7 g5 M
- // Финальная фаза
3 C7 D) {0 O$ t# w' n' `- ^ i - monster.setState(new FinalState());$ J- [1 r4 m2 |$ z5 o9 y5 V
- monster.executeState(); i- F& n5 o# G
- }
. K& _/ g, W& f - }; ?4 R) ~) I) J
Скопировать код
; \3 _2 t$ }, V, qКомментарии по структуре пакетов и классов:
* y- \0 ~# \9 i& i/ F3 s0 R- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
% U" c. v# P+ `& k; S) F ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код./ l. e8 D+ v: { b( ?2 Z* D
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!0 W0 H9 O* |7 p. n. g
$ A- L/ f) p! N9 p" L7 D
w c& D! u4 P' n5 ?% `8 @5 p5 G8 f0 J% u( C
. b, E+ o- c! r, \( B2 B1 g3 j: D) w
* Q% U. n9 t3 F5 I2 R
* e. G+ d' W3 l( o$ t7 R& @: e/ @0 z4 c9 y6 \" B' j5 W" E: f
5 e, k) `1 d/ @+ U" q# B9 a
( u {, D2 u* x
0 C% z' A& Z7 d; j/ j. n: h( v9 t k8 L
, W3 n! c" y4 J& o& i( h V. w' d/ Y# c& Q" j
|