, D! i( O8 V3 B" O$ nХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
. A P& ^6 g3 d2 M5 g0 H# O0 l/ i9 o, O+ P. g$ i
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.$ ^6 f5 _3 g7 w) `4 }
& }8 O+ V$ G+ \' r. i5 L
- // Пакет org.l2jmobius.gameserver.model.actor
( ~; @% Q0 r) D; I- w5 ^ - package org.l2jmobius.gameserver.model.actor;
, G$ H, @8 b- o" J - % T1 j7 ]# i/ ?* b# I A& K. x A
- // Перечисление для типов атак. _; o+ Q7 Z, {
- public enum AttackType {
$ ~% a D7 B, |2 Z/ m/ q$ i - PHYSICAL, MAGICAL;
8 U& }, q# b5 F* O - }
7 {) c2 P3 d5 w- Z
Скопировать код Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
* m7 \& N1 _7 p! g+ J- zОбновленный класс для агрессивного состояния монстра:
1 u, @/ t5 D5 W! v0 X& j' R$ N: G1 _1 F3 F% H
- // Пакет org.l2jmobius.gameserver.model.actor.state
7 m' ^! w! X; i; ^6 ~7 q9 \ - package org.l2jmobius.gameserver.model.actor.state;
* e" Y L8 U2 o
" q' s1 I6 R3 H: @% S: A- import org.l2jmobius.gameserver.model.actor.Monster;9 j2 v3 O' v7 C3 {0 F0 m, f
- import org.l2jmobius.gameserver.model.actor.AttackType;
, v( \: I$ M r$ w& j7 q- U
7 `- L# c' L% Y: r, D9 b( o& O' `- import java.util.Random;
+ S4 }5 N1 ^# p
5 {' M2 n3 S1 n" Q) X7 T9 C- public class AggressiveState implements MonsterState {
0 X6 E% p' y2 P, \) ^ - private Random random = new Random();
! `( O5 f0 k8 l( b% h, P
4 d7 F* G' G( i* A/ O" y2 Q- @Override
- @! | k, n. t( B7 ]9 A - public void handleState(Monster monster) {
! U) _# O/ B6 T3 i T - // Выбираем случайный тип атаки: физическая или магическая
5 F" d$ ~5 `2 t2 y8 H) Q - AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
# Z, c- K% @: g7 r - + B3 p% t" w+ J1 i; u
- // Логика для агрессивной фазы боя
; ]3 K) Z$ X) d* X, X( Z7 ] - System.out.println(monster.getName() + " становится агрессивным и использует "
: h+ @8 W! |4 l - + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
- |7 \) O. P( |( E) X -
' k8 h) [9 o4 B0 r0 q, T3 ~ - // Увеличиваем силу атаки в зависимости от типа атаки8 `" ]4 U- u; n2 [1 d
- double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
, Q$ v; q6 y/ A6 y - monster.setAttackPower(monster.getAttackPower() * multiplier);
2 ?( a* ~% @0 ^" _6 n - }
# d. o6 l N0 ?) \3 b$ _ - }8 ^1 U+ K. q; s( z9 h9 }
Скопировать код Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
# H q# S K' c) q8 X
) `/ w" H' H8 \- // Пакет org.l2jmobius.gameserver.model.actor
1 D3 w! `- g' Z; t+ P3 S - package org.l2jmobius.gameserver.model.actor;
2 O# h( A' g2 I7 ?& g0 E+ S8 X+ V - / W6 s1 ^& r* P* F- v/ y D: s
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
0 W3 V2 v1 K$ I; k" J v - import org.l2jmobius.gameserver.model.actor.state.InitialState;
. \4 F, a( y8 X7 ]! [/ A* H - 2 x- C4 ]. b. q1 V. ?, K% U1 P% Z D$ t+ G
- public class Monster extends Creature {# d. Y0 K4 h% ]1 s
- private String name;! n: M2 `9 } A: Z4 m5 j) E1 h
- private double attackPower;
; M3 z5 U: F: v- f( a - private MonsterState state; // Текущее состояние монстра
/ d# h* x. G, N# g
# ^* X: W" C9 P8 M0 l R. u5 v& V- // Конструктор монстра& N% N, i; R3 w8 q1 I
- public Monster(String name, double attackPower) {; `% K$ i5 a( r" L; I5 V& x
- this.name = name;8 ?8 h5 d# F" D4 d6 A" O+ h
- this.attackPower = attackPower;4 {4 _8 D3 O, l. c) H$ ]0 c2 A5 C' H# [
- this.state = new InitialState(); // Начальное состояние по умолчанию
0 ?0 C( s$ E/ ?# H - }
9 I4 ?; y5 f, H0 |4 ]6 B
" m3 a& y! j( w- // Метод для смены состояния
/ d7 }1 t" L5 ^* U/ p - public void setState(MonsterState newState) {6 W/ i- z! ?5 L
- this.state = newState;2 A7 R6 F* k/ D5 W2 d
- }4 v! t$ T' q" h: K# q7 _4 f0 |" C
- ( @% |1 x/ a. ?* d9 Z
- // Выполнение действий на основе текущего состояния
# S2 n. j/ r/ ~* |$ Y% e - public void executeState() {
5 }4 ~% @; X5 }6 z1 M - state.handleState(this);
1 a# t, ~& ]; k& X- ^ - }' s O9 E# Y; ~
- ! z8 z: t% M- j* c) d' j
- // Геттеры и сеттеры
0 d! g4 q+ |$ I/ [8 N. e9 a3 [- L - public String getName() {
" ^9 S* ?& k& g3 ]# r1 Z; O V - return name;
: S( Z' x# |) |% U# y9 d - }% i/ H) L5 x3 E; \, r2 `& ^8 |4 T' I
- 1 \7 Y( H, a: a+ [
- public double getAttackPower() {
: d4 ^+ o$ q- c! f% ?7 i" ^- g - return attackPower;
: E/ `8 |1 y7 d r" q4 [! S2 L - }5 r$ [* _0 K# p! o, F
- 2 R7 A" V0 e* }' ]# O& y* ^! x
- public void setAttackPower(double attackPower) {9 R7 W" E0 j) n" C
- this.attackPower = attackPower;
u. @$ C* e! V$ D$ W - }( g1 C% O. ?( c( J
- }
) z8 _: ~/ w- {' P8 }, d
Скопировать код Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
! @) O' Q: Z9 h1 Q! |% `5 Y0 s7 l/ i5 w3 F: V4 l7 `; p
- // Пакет org.l2jmobius.gameserver.model.battle
1 b, `3 |; B/ J1 p) V1 W8 \ - package org.l2jmobius.gameserver.model.battle;0 K1 s- f$ ^/ s8 r+ r7 K& G% H+ L$ e
" M* ~. \7 `. T* T% V- import org.l2jmobius.gameserver.model.actor.Monster;/ G7 t5 e# Q8 y# a6 Z( c- r
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;) B0 `2 J/ X2 s. Z3 [, `
8 R E4 _' I9 _. |8 y+ H K- public class BattleSimulation {
5 r8 G* [2 X8 { F - public static void main(String[] args) {, [6 P$ b: c: G% o$ y6 s
- // Создаем монстра( E: s& Q% `$ ?; `" A6 [# b* s& f% `
- Monster monster = new Monster("Дракон", 100);7 E3 h$ s4 W+ }1 X `
k" l7 Q L, F- Q, a! W" f# g- S# {- // Переключаем монстра в агрессивное состояние с разными типами атак W' d# Z' T$ ]- M. b
- monster.setState(new AggressiveState());
- Q. g8 `4 T2 |+ W4 \" i - monster.executeState();0 i8 ]4 [- B- s, f" I
- monster.executeState(); // Повторяем, чтобы увидеть чередование атак# l* n5 K5 W8 k6 g$ [3 I6 i- f
- }; s6 |, ~- r5 _& n$ X6 c5 |
- }
1 O" }2 w( `% W
Скопировать код ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
4 K5 n9 {+ p; @4 h! ~5 u$ E3 @) |Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
5 q! m1 i. `7 Y1 L$ f4 |: t2 o. p" D* g" i1 ^! }- ~: I; V
) p& b: v/ X1 s$ J6 u6 ]
* k$ K+ a- F1 a' D t. n
|