首页 > 解决方案 > 如何为 Nim 游戏制作这个循环?

问题描述

基本上,我正在制作一个 Nim 游戏,并且代码在游戏的前 2 个序列之后停止循环。首先是玩家取出石头,然后是计算机取出石头。我正在努力让它不断重复循环,直到石头击中 0。我需要在哪里更改我的 while 语句才能解决这个问题?

import java.util.Scanner;
import java.lang.Math;

public class Nim {

    public static int validEntry2(int comp) {
        int cm = 1;
        int newStones = 1;
        while (cm == 1) {
            comp = drawStones(comp);
            if ( comp < 1 || comp > 3 || comp < newStones) {
                System.out.println("Invalid parameters. Please enter something between 1-3.");
            } else
                System.out.println("Computer picks " + comp + " stones");
                cm = 2;
        }
        return comp;
    }

    public static int validEntry(int player) {
        int pl = 1;
        int newStones = 1;
        while (pl == 1) {
            player = playerStones(player);
            if (player < 1 || player > 3 || player < newStones) {
                System.out.println("Invalid parameters. Please enter something between 1-3.");
            } else
                pl = 2;
        }
        return player;
    }

    public static int drawStones(int comp) {
        comp = (int)(3 * Math.random() + 1);
        return comp;
    }

    public static int playerStones(int player) {
        Scanner input = new Scanner(System.in);
        System.out.println("How many stones do you want to take?");
        player = input.nextInt();
        return player;
    }


    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);
        int stones;
        stones = (int)(16 * Math.random() + 15);
        int newStones = stones;
        int player = 1;
        int comp = 1;
        int pl = 1;
        // Display how many stones there are.
        System.out.println("There are currently " + stones + " stones left");
        //Players turn
        while (pl == 1) {
            player = validEntry(player);
            if ( (newStones - player) < 0 ) {
                System.out.println("Invalid input.");
            } else {
                pl = 2;
                newStones -= player;
            }
                // Does the player lose?
            if (newStones == 0) {
                System.out.println("You just lost to a computer.");
            } else {
                System.out.println("There are " + newStones + " stones left");
            }
            // Computer Turn
            int cm = 1;
            while (cm == 1) {
                comp = validEntry2(comp);
                if ( (newStones - comp) < 0) {
                    System.out.println("Invalid Input.");
                } else {
                    cm = 2;
                    newStones -= comp;
                }
                // Does Computer Lose?
                if (newStones == 0) {
                    System.out.println("You just beat the computer!");
                } else {
                    System.out.println("There are " + newStones + " stones left");
                }
            }
        }
    }

}

标签: java

解决方案


您的第一个 if 的 else 子句没有 {},因此始终执行 cm=2 并立即中断 while 循环。

由于那部分代码是缩进的,我高度怀疑这不是你的意图吗?


编辑:您的 main 函数有一个 while 循环,只要pl设置为 1,该循环就会运行。一旦pl设置为 2,循环就会退出并因此终止您的程序。所以你可能想考虑一下这个循环的退出条件。

一般来说,有几件事我会改进以使调试代码更容易。例如,不要在 main 函数中嵌套两个 while 循环,而是一个接一个地执行它们(最好是在单独的函数中,这样你的代码会变得更整洁一些)。然后你可以在两个转弯上循环,直到没有更多的石头离开。


推荐阅读