You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

    }

    }
}

问题分析

  1. 循环结构错误:外层while循环未加大括号,仅执行后续第一行代码,导致逻辑断裂;电脑回合的while循环同样缺少大括号,逻辑无法正常循环。
  2. 变量命名混乱:turntotal同时承担回合得分和总得分的角色,grandtotal未被使用,导致得分计算逻辑错误。
  3. 玩家Hold逻辑缺失:选择Hold时未将回合点数计入总得分,也未触发电脑回合流程。
  4. 电脑回合逻辑错误:随机数判断、掷骰逻辑混乱,未正确实现「随机1继续掷、2停止」的规则,也未在回合结束后切换回玩家菜单。
  5. 获胜条件判断缺失:每次回合结束后未检查是否满足总得分≥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)
        }
    }
}

修复说明

  1. 变量拆分:将总得分与回合得分拆分,避免逻辑混淆。
  2. 结构化逻辑:将玩家回合、电脑回合、获胜判断拆分为独立函数,代码更清晰易维护。
  3. 修复循环结构:所有循环均添加大括号,确保逻辑完整执行。
  4. 完善流程控制:玩家选择Hold或掷出1时,正确触发电脑回合;电脑回合结束后自动回到玩家菜单。
  5. 明确获胜判断:每次回合结束后检查总得分,满足条件时终止程序。

内容的提问来源于stack exchange,提问作者nightowl898

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 08:30:50