1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
| // 游戏对战中介者接口
interface GameMediator {
void registerPlayer(Player player);
void removePlayer(Player player);
void playerAction(Player player, String action, Object data);
void broadcastMessage(String message, Player excludePlayer);
void startGame();
void endGame(Player winner);
}
// 游戏房间中介者
class GameRoom implements GameMediator {
private List<Player> players = new ArrayList<>();
private GameState gameState = GameState.WAITING;
private Map<Player, Integer> playerScores = new HashMap<>();
private int roundNumber = 0;
private Timer gameTimer;
@Override
public void registerPlayer(Player player) {
if (players.size() < 4) { // 最多4人
players.add(player);
player.setMediator(this);
playerScores.put(player, 0);
System.out.println("玩家 " + player.getName() + " 加入游戏 (" + players.size() + "/4)");
broadcastMessage("玩家 " + player.getName() + " 加入了游戏", player);
if (players.size() >= 2) {
broadcastMessage("人数足够,可以开始游戏!输入 'ready' 准备", null);
}
} else {
player.receiveMessage("游戏房间已满");
}
}
@Override
public void removePlayer(Player player) {
players.remove(player);
playerScores.remove(player);
System.out.println("玩家 " + player.getName() + " 离开游戏");
broadcastMessage("玩家 " + player.getName() + " 离开了游戏", null);
if (gameState == GameState.PLAYING && players.size() < 2) {
endGame(null); // 人数不足,结束游戏
}
}
@Override
public void playerAction(Player player, String action, Object data) {
switch (action) {
case "ready":
handlePlayerReady(player);
break;
case "attack":
handlePlayerAttack(player, (Player) data);
break;
case "defend":
handlePlayerDefend(player);
break;
case "use_skill":
handlePlayerSkill(player, (String) data);
break;
case "chat":
handlePlayerChat(player, (String) data);
break;
default:
player.receiveMessage("未知动作:" + action);
}
}
@Override
public void broadcastMessage(String message, Player excludePlayer) {
for (Player player : players) {
if (player != excludePlayer) {
player.receiveMessage(message);
}
}
}
@Override
public void startGame() {
if (players.size() < 2) {
broadcastMessage("人数不足,无法开始游戏", null);
return;
}
gameState = GameState.PLAYING;
roundNumber = 1;
// 初始化玩家状态
for (Player player : players) {
player.resetForNewGame();
playerScores.put(player, 0);
}
broadcastMessage("🎮 游戏开始!第" + roundNumber + "轮", null);
System.out.println("游戏开始," + players.size() + " 名玩家参与");
// 设置游戏时间限制
startGameTimer();
}
@Override
public void endGame(Player winner) {
gameState = GameState.ENDED;
if (gameTimer != null) {
gameTimer.cancel();
}
if (winner != null) {
broadcastMessage("🏆 游戏结束!获胜者:" + winner.getName(), null);
playerScores.put(winner, playerScores.get(winner) + 10);
} else {
broadcastMessage("游戏结束!平局", null);
}
showFinalScores();
gameState = GameState.WAITING;
}
private void handlePlayerReady(Player player) {
if (gameState == GameState.WAITING) {
player.setReady(true);
broadcastMessage("玩家 " + player.getName() + " 已准备", player);
boolean allReady = players.stream().allMatch(Player::isReady);
if (allReady && players.size() >= 2) {
startGame();
}
} else {
player.receiveMessage("游戏已经开始或结束");
}
}
private void handlePlayerAttack(Player player, Player target) {
if (gameState != GameState.PLAYING) {
player.receiveMessage("游戏未开始");
return;
}
if (target == null || !players.contains(target)) {
player.receiveMessage("目标玩家无效");
return;
}
if (player == target) {
player.receiveMessage("不能攻击自己");
return;
}
// 计算伤害
int damage = calculateDamage(player, target);
target.takeDamage(damage);
String attackMessage = "⚔️ " + player.getName() + " 攻击了 " + target.getName() +
" 造成 " + damage + " 点伤害";
broadcastMessage(attackMessage, null);
// 检查目标是否被击败
if (target.getHealth() <= 0) {
playerScores.put(player, playerScores.get(player) + 5);
broadcastMessage("💀 " + target.getName() + " 被击败了!", null);
target.setAlive(false);
// 检查游戏是否结束
List<Player> alivePlayers = players.stream()
.filter(Player::isAlive)
.collect(Collectors.toList());
if (alivePlayers.size() <= 1) {
endGame(alivePlayers.isEmpty() ? null : alivePlayers.get(0));
}
}
}
private void handlePlayerDefend(Player player) {
if (gameState != GameState.PLAYING) {
player.receiveMessage("游戏未开始");
return;
}
player.setDefending(true);
broadcastMessage("🛡️ " + player.getName() + " 进入防御姿态", player);
// 防御状态持续一定时间
Timer defenseTimer = new Timer();
defenseTimer.schedule(new TimerTask() {
@Override
public void run() {
player.setDefending(false);
player.receiveMessage("防御状态结束");
}
}, 5000); // 5秒防御时间
}
private void handlePlayerSkill(Player player, String skillName) {
if (gameState != GameState.PLAYING) {
player.receiveMessage("游戏未开始");
return;
}
boolean skillUsed = player.useSkill(skillName);
if (skillUsed) {
String skillMessage = "✨ " + player.getName() + " 使用了技能:" + skillName;
broadcastMessage(skillMessage, player);
// 根据技能类型执行效果
executeSkillEffect(player, skillName);
} else {
player.receiveMessage("技能冷却中或能量不足");
}
}
private void handlePlayerChat(Player player, String message) {
String chatMessage = "[聊天] " + player.getName() + ": " + message;
broadcastMessage(chatMessage, player);
}
private int calculateDamage(Player attacker, Player target) {
int baseDamage = attacker.getAttackPower();
// 如果目标在防御,伤害减半
if (target.isDefending()) {
baseDamage /= 2;
}
// 添加随机因素
int randomFactor = (int) (Math.random() * 20) - 10; // -10 到 +10
return Math.max(1, baseDamage + randomFactor);
}
private void executeSkillEffect(Player player, String skillName) {
switch (skillName) {
case "heal":
player.heal(30);
player.receiveMessage("你恢复了30点生命值");
break;
case "boost":
player.setAttackPower(player.getAttackPower() + 10);
player.receiveMessage("你的攻击力提升了10点");
break;
case "fireball":
// 对所有其他玩家造成伤害
for (Player target : players) {
if (target != player && target.isAlive()) {
target.takeDamage(15);
}
}
broadcastMessage("🔥 火球术对所有敌人造成15点伤害", player);
break;
}
}
private void startGameTimer() {
gameTimer = new Timer();
gameTimer.schedule(new TimerTask() {
@Override
public void run() {
broadcastMessage("⏰ 游戏时间到!", null);
// 根据生命值判断胜负
Player winner = players.stream()
.filter(Player::isAlive)
.max(Comparator.comparingInt(Player::getHealth))
.orElse(null);
endGame(winner);
}
}, 300000); // 5分钟游戏时间
}
private void showFinalScores() {
System.out.println("=== 最终积分 ===");
playerScores.entrySet().stream()
.sorted(Map.Entry.<Player, Integer>comparingByValue().reversed())
.forEach(entry -> {
String result = entry.getKey().getName() + ": " + entry.getValue() + "分";
System.out.println(result);
broadcastMessage(result, null);
});
}
public GameState getGameState() {
return gameState;
}
}
// 游戏状态枚举
enum GameState {
WAITING, PLAYING, ENDED
}
// 玩家抽象类
abstract class Player {
protected String name;
protected GameMediator mediator;
protected int health;
protected int maxHealth;
protected int attackPower;
protected boolean isReady;
protected boolean isAlive;
protected boolean isDefending;
protected Map<String, Long> skillCooldowns;
public Player(String name) {
this.name = name;
this.maxHealth = 100;
this.health = maxHealth;
this.attackPower = 20;
this.isReady = false;
this.isAlive = true;
this.isDefending = false;
this.skillCooldowns = new HashMap<>();
}
public void setMediator(GameMediator mediator) {
this.mediator = mediator;
}
public void resetForNewGame() {
health = maxHealth;
attackPower = 20;
isReady = false;
isAlive = true;
isDefending = false;
skillCooldowns.clear();
}
public void takeDamage(int damage) {
health = Math.max(0, health - damage);
receiveMessage("你受到了 " + damage + " 点伤害,当前生命值:" + health);
}
public void heal(int amount) {
health = Math.min(maxHealth, health + amount);
}
public boolean useSkill(String skillName) {
long currentTime = System.currentTimeMillis();
Long lastUsed = skillCooldowns.get(skillName);
if (lastUsed != null && currentTime - lastUsed < 10000) { // 10秒冷却
return false;
}
skillCooldowns.put(skillName, currentTime);
return true;
}
public abstract void receiveMessage(String message);
// Getters and Setters
public String getName() { return name; }
public int getHealth() { return health; }
public int getAttackPower() { return attackPower; }
public void setAttackPower(int attackPower) { this.attackPower = attackPower; }
public boolean isReady() { return isReady; }
public void setReady(boolean ready) { isReady = ready; }
public boolean isAlive() { return isAlive; }
public void setAlive(boolean alive) { isAlive = alive; }
public boolean isDefending() { return isDefending; }
public void setDefending(boolean defending) { isDefending = defending; }
}
// 具体玩家实现
class GamePlayer extends Player {
public GamePlayer(String name) {
super(name);
}
@Override
public void receiveMessage(String message) {
System.out.println("[" + name + "] " + message);
}
public void attack(Player target) {
if (mediator != null) {
mediator.playerAction(this, "attack", target);
}
}
public void defend() {
if (mediator != null) {
mediator.playerAction(this, "defend", null);
}
}
public void useSkill(String skillName) {
if (mediator != null) {
mediator.playerAction(this, "use_skill", skillName);
}
}
public void chat(String message) {
if (mediator != null) {
mediator.playerAction(this, "chat", message);
}
}
public void ready() {
if (mediator != null) {
mediator.playerAction(this, "ready", null);
}
}
}
// 使用示例
public class GameRoomExample {
public static void main(String[] args) throws InterruptedException {
GameRoom gameRoom = new GameRoom();
// 创建玩家
GamePlayer alice = new GamePlayer("Alice");
GamePlayer bob = new GamePlayer("Bob");
GamePlayer charlie = new GamePlayer("Charlie");
// 玩家加入游戏
gameRoom.registerPlayer(alice);
Thread.sleep(1000);
gameRoom.registerPlayer(bob);
Thread.sleep(1000);
gameRoom.registerPlayer(charlie);
Thread.sleep(1000);
// 玩家聊天
alice.chat("大家好,准备开始游戏吗?");
Thread.sleep(500);
bob.chat("我准备好了!");
Thread.sleep(500);
// 玩家准备
alice.ready();
Thread.sleep(500);
bob.ready();
Thread.sleep(500);
charlie.ready();
Thread.sleep(2000);
// 游戏开始后的战斗
System.out.println("\n=== 战斗开始 ===");
alice.attack(bob);
Thread.sleep(1000);
bob.defend();
Thread.sleep(1000);
charlie.useSkill("fireball");
Thread.sleep(1000);
alice.useSkill("heal");
Thread.sleep(1000);
bob.attack(charlie);
Thread.sleep(1000);
// 继续战斗直到有玩家被击败
while (gameRoom.getGameState() == GameState.PLAYING) {
Thread.sleep(2000);
// 模拟随机战斗
List<Player> alivePlayers = List.of(alice, bob, charlie).stream()
.filter(Player::isAlive)
.collect(Collectors.toList());
if (alivePlayers.size() > 1) {
Player attacker = alivePlayers.get((int) (Math.random() * alivePlayers.size()));
Player target = alivePlayers.stream()
.filter(p -> p != attacker)
.findFirst()
.orElse(null);
if (target != null) {
((GamePlayer) attacker).attack(target);
}
} else {
break;
}
}
}
}
|