Kotlin骰子游戏模拟器故障求助:回合切换无响应问题
六面骰子对战游戏问题修复
游戏规则
- 玩家回合:掷骰子,若未掷出1则获得对应点数,可选择继续掷骰累积回合点数或结束回合;若掷出1则回合结束,失去该回合所有点数,切换至电脑回合;主动结束回合时,回合点数计入玩家总得分。
- 电脑回合:生成1-2的随机数,若为1则继续掷骰,为2则停止并切换回玩家回合;若掷出1则失去该回合点数,否则将回合点数计入电脑总得分。
- 玩家可通过菜单选择「继续掷骰」「保留点数并切换至电脑回合」或「退出」,仅当某方总得分≥50或选择退出时程序停止。
问题描述
选择「保留点数(选项2)」或掷出1时,程序无反应直接停止,未按预期切换至电脑回合或回到玩家菜单,且未正确判断获胜条件。
原代码
var player = 0 var turntotal = 0 var computerpoints = 0 var grandtotal = 0 var roll = (1..6).random() var ai = (1..2).random() println("1. Roll Dice") println("2. Hold and pass to computer") println("3. Quit") println() println("Please select a menu Item") player = readLine()!!.toInt() while (turntotal < 50 && computerpoints < 50 && player != 3) if (player == 1) { roll = (1..6).random() println("You rolled a $roll") turntotal += roll println("Turn total: $turntotal") println("***********************************") println("* Grand Total - You: $turntotal Computer:$computerpoints *") println("***********************************") while (roll != 1) { println("1. Roll Again") println("2. Hold") player = readLine()!!.toInt() if (player == 2) break roll = (1..6).random() println("You rolled a $roll") turntotal += roll println("Turn total: $turntotal") println("***********************************") println("* Grand Total - You: $turntotal Computer:$computerpoints *") println("***********************************") } if (roll == 1) { turntotal = 0 println("You rolled a $roll") println("You lose all your turn points and turn ") println("***********************************") println("* Grand Total - You: $turntotal Computer:$computerpoints *") println("***********************************") println() println("Computer's turn to roll") while ( ai != 1) roll = (1..2).random() if (roll == 1) roll =(1..6).random() println("Computer decides to roll: $roll") computerpoints += roll println("Computer's points: $computerpoints") println("***********************************") println("* Grand Total - You: $turntotal Computer:$computerpoints *") println("***********************************") if (roll== 1) computerpoints = 0 println("Computer rolled a $roll") println("Computer's points is $computerpoints") println("***********************************") println("* Grand Total - You: $turntotal Computer:$computerpoints *") println("***********************************") if (roll == 2 ) println("1. Roll Dice") println("2. Hold and pass to computer") println("3. Quit") println() println("Please select a menu Item") player = readLine()!!.toInt() } } }
问题分析
- 循环结构错误:外层
while循环未加大括号,仅执行后续第一行代码,导致逻辑断裂;电脑回合的while循环同样缺少大括号,逻辑无法正常循环。 - 变量命名混乱:
turntotal同时承担回合得分和总得分的角色,grandtotal未被使用,导致得分计算逻辑错误。 - 玩家Hold逻辑缺失:选择Hold时未将回合点数计入总得分,也未触发电脑回合流程。
- 电脑回合逻辑错误:随机数判断、掷骰逻辑混乱,未正确实现「随机1继续掷、2停止」的规则,也未在回合结束后切换回玩家菜单。
- 获胜条件判断缺失:每次回合结束后未检查是否满足总得分≥50的获胜条件,导致程序无法在获胜时终止。
修复后的代码
fun main() { var playerTotal = 0 // 玩家总得分 var computerTotal = 0 // 电脑总得分 var playerTurnTotal = 0 // 玩家当前回合得分 var computerTurnTotal = 0 // 电脑当前回合得分 var playerChoice = 0 // 游戏主循环:仅当未有人获胜且未选择退出时运行 while (playerTotal < 50 && computerTotal < 50 && playerChoice != 3) { // 玩家菜单 println("\n=== 玩家回合 ===") println("1. 掷骰子") println("2. 保留点数并切换至电脑回合") println("3. 退出游戏") print("请选择操作:") playerChoice = readLine()!!.toInt() when (playerChoice) { 1 -> handlePlayerTurn(playerTurnTotal, playerTotal, computerTotal).apply { playerTurnTotal = first playerTotal = second } 2 -> { // 保留回合点数到总得分 playerTotal += playerTurnTotal playerTurnTotal = 0 println("\n你保留了当前回合点数,总得分:$playerTotal") // 触发电脑回合 computerTotal = handleComputerTurn(computerTurnTotal, computerTotal, playerTotal) computerTurnTotal = 0 } 3 -> println("游戏结束") else -> println("无效选项,请重新选择") } // 检查获胜条件 checkWinCondition(playerTotal, computerTotal) } } // 处理玩家回合逻辑 fun handlePlayerTurn(turnTotal: Int, playerTotal: Int, computerTotal: Int): Pair<Int, Int> { var currentTurnTotal = turnTotal var currentPlayerTotal = playerTotal var roll = (1..6).random() println("\n你掷出了:$roll") if (roll == 1) { // 掷出1,失去回合点数 currentTurnTotal = 0 println("你掷出了1,回合结束,失去所有回合点数!") println("当前总得分 - 你:$currentPlayerTotal 电脑:$computerTotal") // 切换到电脑回合 currentPlayerTotal = handleComputerTurn(0, computerTotal, currentPlayerTotal) } else { currentTurnTotal += roll println("当前回合得分:$currentTurnTotal") println("当前总得分 - 你:$currentPlayerTotal 电脑:$computerTotal") // 玩家选择继续掷或Hold while (true) { println("\n1. 继续掷骰子") println("2. 保留点数") print("请选择:") val choice = readLine()!!.toInt() if (choice == 2) break roll = (1..6).random() println("\n你掷出了:$roll") if (roll == 1) { currentTurnTotal = 0 println("你掷出了1,回合结束,失去所有回合点数!") println("当前总得分 - 你:$currentPlayerTotal 电脑:$computerTotal") // 切换到电脑回合 currentPlayerTotal = handleComputerTurn(0, computerTotal, currentPlayerTotal) break } else { currentTurnTotal += roll println("当前回合得分:$currentTurnTotal") println("当前总得分 - 你:$currentPlayerTotal 电脑:$computerTotal") } } } return Pair(currentTurnTotal, currentPlayerTotal) } // 处理电脑回合逻辑 fun handleComputerTurn(turnTotal: Int, computerTotal: Int, playerTotal: Int): Int { var currentTurnTotal = turnTotal var currentComputerTotal = computerTotal println("\n=== 电脑回合 ===") while (true) { val aiChoice = (1..2).random() if (aiChoice == 2) { // 电脑选择停止,保留回合点数 currentComputerTotal += currentTurnTotal println("电脑选择停止,总得分:$currentComputerTotal") println("当前总得分 - 你:$playerTotal 电脑:$currentComputerTotal") break } // 电脑选择继续掷骰 val roll = (1..6).random() println("电脑掷出了:$roll") if (roll == 1) { // 掷出1,失去回合点数 currentTurnTotal = 0 println("电脑掷出了1,回合结束,失去所有回合点数!") println("当前总得分 - 你:$playerTotal 电脑:$currentComputerTotal") break } else { currentTurnTotal += roll println("电脑当前回合得分:$currentTurnTotal") println("当前总得分 - 你:$playerTotal 电脑:$currentComputerTotal") } } return currentComputerTotal } // 检查获胜条件 fun checkWinCondition(playerTotal: Int, computerTotal: Int) { when { playerTotal >= 50 -> { println("\n恭喜你获胜!总得分:$playerTotal") System.exit(0) } computerTotal >= 50 -> { println("\n电脑获胜!总得分:$computerTotal") System.exit(0) } } }
修复说明
- 变量拆分:将总得分与回合得分拆分,避免逻辑混淆。
- 结构化逻辑:将玩家回合、电脑回合、获胜判断拆分为独立函数,代码更清晰易维护。
- 修复循环结构:所有循环均添加大括号,确保逻辑完整执行。
- 完善流程控制:玩家选择Hold或掷出1时,正确触发电脑回合;电脑回合结束后自动回到玩家菜单。
- 明确获胜判断:每次回合结束后检查总得分,满足条件时终止程序。
内容的提问来源于stack exchange,提问作者nightowl898
相关产品推荐
相关产品推荐

