fix(game): 修复游戏结束逻辑并优化分数计算

- 修改了游戏结束时的分数计算逻辑,确保正确处理玩家的输赢- 优化了回放功能,增加了游戏结束后的详细结果信息- 调整了底池分数的计算方式,根据房间配置动态设置
- 修复了玩家在游戏中的总失分计算错误
master
苗庆帅 2025-06-19 20:55:57 +08:00
parent 83bca334ac
commit e4e3e22a1e
21 changed files with 100 additions and 45 deletions

View File

@ -193,6 +193,7 @@ public class Room implements Runnable {
* 1. : 2.() times
*/
public ITObject hpData;
/**
*
*/
@ -623,7 +624,6 @@ public class Room implements Runnable {
this.saveMilitaryTotal(true);
} else {
roomResult();
}
Global.logger.info("total: "+total);
for (Entry<Integer, Player> entry : this.playerMapById.entrySet()) {
@ -640,7 +640,6 @@ public class Room implements Runnable {
}
Global.logger.info("total: "+total);
if (total) {
this.stateMachine.changeState(Global.getState(RoomDestoryGameState.class));
} else {
this.stateMachine.changeState(Global.getState(RoomEndState.class));

View File

@ -102,8 +102,6 @@ public void responseDismiss(Player player, boolean agree) {
// 如果所有玩家都同意,解散房间
if (agree) {
// // 结束房间内的游戏
// player.room.saveMilitaryTotal(true);
interruptTimer();
} else {
// 如果有玩家不同意,通知游戏控制器解散房间失败

View File

@ -119,7 +119,14 @@ public void RouterAction(Session sender, ITObject params, int gid, Player owner)
EXPlayer player = (EXPlayer) entry.getValue();
// 如果当前玩家是胜利者,则将其总得分加上房间的边注
if (owner.win.playerid == player.playerid) {
player.score.total_score += owner.sidePot;
player.score.total_score +=player.totalLostScore;
if (owner.nextRound!=owner.maxRound){
player.lostScore=player.totalLostScore;
}
}else {
if (owner.nextRound!=owner.maxRound){
player.lostScore=0-player.totalLostScore;
}
}
// 创建一个新的对象,用于存储当前玩家的信息
ITObject obj = TObject.newInstance();
@ -127,7 +134,7 @@ public void RouterAction(Session sender, ITObject params, int gid, Player owner)
obj.putInt("seat", player.seat);
// 计算玩家的总得分,减去丢失的分数
player.score.total_score -= player.lostScore;
player.score.total_score -= player.lostScore;
// player.score.total_score -= player.lostScore;
// 存储玩家的总得分和本轮得分
obj.putInt("score", player.score.total_score);
obj.putInt("winscore", player.score.round_score);
@ -165,6 +172,7 @@ public void RouterAction(Session sender, ITObject params, int gid, Player owner)
// 存储洗牌得分
mp.putInt("xipai_score", owner.xi_pai_score);
// 返回包含房间结果数据的对象
return mp;
}
@ -173,6 +181,7 @@ public void RouterAction(Session sender, ITObject params, int gid, Player owner)
ITObject result = getRoomResultData(owner, false);
result.putInt("type", 0);
owner.nextRound++;
owner.broadCastToClient(0, Config.GAME_EVT_RESULT1, result);
}

View File

@ -84,6 +84,8 @@ public class EXRoom extends Room {
public EXPlayer win;
public EXRoom(String roomid, Map<String, String> redis_room_map) {
@ -119,15 +121,6 @@ public class EXRoom extends Room {
this.config.putInt(Config.ROOM_CONFIG_BASE_SCORE, 0);
}
if (this.config.getInt(Config.ROOM_CONFIG_BASE_SCORE)==0){
this.sidePot = 1;
}
if (this.config.getInt(Config.ROOM_CONFIG_BASE_SCORE)==1){
this.sidePot = 2;
}
if (this.config.getInt(Config.ROOM_CONFIG_BASE_SCORE)==2) {
this.sidePot = 5;
}
// System.out.println("底注"+this.config.getInt(Config.ROOM_CONFIG_BASE_SCORE));
// int num = this.config.getInt(Config.ROOM_CONFIG_BASE_SCORE);
@ -234,16 +227,28 @@ public class EXRoom extends Room {
EXMainServer.gameCtr.roomTotalResult(this, dissmiss);
}
/**
*
*
*
*
*/
@Override
public void endGame() {
// 累加所有玩家的分数
addAllScore(win);
// 记录游戏结束的日志
Global.logger.error("EXRoom: endGame");
// 将当前的播放数据转换为EXPlayBack对象
EXPlayBack pb = (EXPlayBack) this.playBackData;
// 创建一个新的对象来存储游戏结束后的回放结果
ITObject pbResult = TObject.newInstance();
// 创建一个数组来存储每个玩家的游戏信息
ITArray info = new TArray();
// 遍历所有正在玩的玩家,收集他们的座位号和分数
for (Entry<Integer, Player> entry : playerMapByPlaying.entrySet()) {
EXPlayer player = (EXPlayer) entry.getValue();
ITObject obj = TObject.newInstance();
@ -251,11 +256,17 @@ public class EXRoom extends Room {
obj.putInt("score", player.score.round_score);
info.addTObject(obj);
}
// 将收集到的玩家信息添加到回放结果中
pbResult.putTArray("result", info);
// 记录回放结果的日志
Global.logger.error("pbResult:" + pbResult);
// 在回放中添加结果命令,包括胜利者的座位号和游戏结果
pb.addResultCommand(win.seat, pbResult);
// 在回放中添加开始新轮游戏的命令
pb.addNewRoundCommand();
// 调用父类的结束游戏方法
super.endGame();
}
}

View File

@ -152,8 +152,12 @@ public class EXPlayerAllInState extends StateBase<EXPlayer> {
System.out.println("all in 下注分数1"+owner.betScore);
owner.totalLostScore = owner.totalLostScore - 1;
owner.totalLostScore += owner.lostScore;
// 扣除下注分数
owner.lostScore = 0 - owner.betScore;
owner.lostScore = owner.betScore;
// room.callScore = 0;
System.out.println("底池分数:"+room.sidePot);
room.sidePot += owner.betScore;

View File

@ -116,6 +116,7 @@ public class EXPlayerBetState extends StateBase<EXPlayer> {
*/
public void addSidePot(EXPlayer owner) {
EXRoom room = owner.getRoom();
// 初始化每轮打出的总分数
// for (Entry<Integer, Player> entry : room.playerMapBySeat.entrySet()) {
// EXPlayer player = (EXPlayer) entry.getValue();
@ -133,9 +134,11 @@ public class EXPlayerBetState extends StateBase<EXPlayer> {
owner.betScore=owner.betScore*2;
}
owner.totalLostScore += owner.betScore;
// 扣除下注分数
owner.lostScore =owner.betScore;
// room.callScore = 0;
room.sidePot += owner.betScore;
room.raiseRound = 0;

View File

@ -136,11 +136,11 @@ public class EXPlayerCallState extends StateBase<EXPlayer> {
EXRoom room = owner.getRoom();
System.out.println("当前需跟注分数"+room.callScore);
// 扣除下注分数
// owner.lostScore = room.callScore-owner.needScore;
owner.lostScore = room.callScore;
//计算总下注分数
// owner.totalLostScore += owner.lostScore;
owner.totalLostScore += owner.lostScore;
owner.totalLostScore += room.callScore;
// owner.totalLostScore += room.callScore;
System.out.println("当前已下注分数"+room.callScore);
System.out.println("加注后需要补加的分数owner.needScore"+owner.needScore);

View File

@ -40,6 +40,7 @@ public class EXPlayerFoldState extends StateBase<EXPlayer> {
if (player.fold) {
foldCount++;
}
}
if (foldCount >= room.playerMapById.size()-1) {
over(room);

View File

@ -120,11 +120,12 @@ public class EXPlayerRaiseState extends StateBase<EXPlayer> {
// 扣除下注分数
// owner.lostScore = room.raiseScore-owner.needScore;
owner.lostScore =room.raiseScore;
System.out.println("增加的owner.lostScore"+owner.lostScore);
// owner.totalLostScore += owner.lostScore;
owner.totalLostScore += room.raiseScore;
owner.totalLostScore += owner.lostScore;
// owner.totalLostScore += room.raiseScore;
// room.sidePot += Math.abs(owner.lostScore);

View File

@ -28,10 +28,39 @@ public void enter(EXRoom owner) {
// 遍历房间中所有玩家,清除他们的额外状态
for (Entry<Integer, Player> entry : owner.playerMapBySeat.entrySet()) {
EXPlayer player = (EXPlayer) entry.getValue();
if (owner.config.getInt(Config.ROOM_CONFIG_BASE_SCORE)==0){
if (owner.nextRound==1 && owner.config.getInt(Config.ROOM_CONFIG_BASE_SCORE)==0){
player.totalLostScore=1;
player.lostScore=-1;
}
owner.sidePot = 2;
}else if (owner.config.getInt(Config.ROOM_CONFIG_BASE_SCORE)==1){
if (owner.nextRound==1 && owner.config.getInt(Config.ROOM_CONFIG_BASE_SCORE)==1){
player.totalLostScore=2;
player.lostScore=-2;
}
owner.sidePot = 4;
}else if (owner.config.getInt(Config.ROOM_CONFIG_BASE_SCORE)==2) {
if (owner.nextRound==1 && owner.config.getInt(Config.ROOM_CONFIG_BASE_SCORE)==2){
player.totalLostScore=5;
player.lostScore=-5;
}
owner.sidePot = 10;
}
player.clearEx();
}
// 清除房间的额外状态
owner.clearEx();
System.out.println("底池分数:"+owner.sidePot);
// 开始游戏
owner.startGame();