Nim Loop的游戏

时间:2013-12-02 23:47:25

标签: java loops

所以,我必须以Nim的风格制作一个Java游戏....我已经成功完成了大部分工作......我只是有几个问题我很困惑:

问题1:程序执行正常,甚至运行一次,但经过一次代码后,程序退出...我需要帮助看看它为什么这样做(我使用了错误的循环吗?)

问题2:为什么程序总是选择计算机进入所谓的“智能模式”?

任何帮助将不胜感激。谢谢你们:D

这是我的代码:

import java.util.*;
public class GameOfNim
{
    public static void main (String [] args)
    {
        Scanner in = new Scanner (System.in);
        Random num = new Random ();
        int numberLeft = num.nextInt(101-10) + 10;
        int computerMode = num.nextInt(1);
        int subtraction = numberLeft;
        boolean turn = num.nextBoolean();

        System.out.println ("The number you start out with is: " + numberLeft);

        if (computerMode == 0)
        {
            System.out.println ("The computer is in smart mode");
        }
        if (computerMode == 1)
        {
            System.out.println ("The computer is in dumb mode");
        }

        while (numberLeft > 1)
        {
            if (turn == true)
            {
                System.out.println ("It is your turn...");
                System.out.printf ("Please enter the number you wish to take from the pile (Remember it has to be less than " + numberLeft/2 + "): ");
                subtraction = in.nextInt();
                numberLeft -=subtraction;
                System.out.println ("The number left is " + numberLeft);
                turn = false;
            }
            if (turn ==false)
            {
                System.out.println ("It is the computer's turn...");
                if (computerMode == 0)
                {  
                    numberLeft = smartComputer(numberLeft);
                    System.out.println ("The number left is " + numberLeft);
                }

                if (computerMode == 1)
                {
                    numberLeft -= num.nextInt(numberLeft/2);
                    System.out.println ("The number left is " + numberLeft);
                }
                turn = true;
                return;
            }
        }

        if (numberLeft <= 1)
        {
            if (turn = false)
            {
                System.out.println ("You Win!");
            }  
            else
            {
                System.out.println ("You're horrible...you lost to a computer.");
            }  
        }
    }

    public static int smartComputer (int num)
    {
        int power = 2;        
        while (power < num) 
        { 
            power *=2;
        }
        power /= 2;
        num = power-1;
        return num;
    }
}

3 个答案:

答案 0 :(得分:3)

Random.nextInt(int n)将返回介于0和n之间的int值。因为你计算了computerMode:

int computerMode = num.nextInt(1);

computerMode将始终返回0.

如果计算机只有两种模式,你可以使用nextBoolean吗?

答案 1 :(得分:2)

来自随机的documentation

  

返回伪随机,均匀分布的int值介于0(包括)和指定值(不包括)之间。

“独占”表示nextInt(n)将返回一个可能为n-1n的整数。 nextInt(n)n种可能的结果,包括0。

简单的解决方法是使它nextInt(2),因为有两种可能的模式。

答案 2 :(得分:2)

既然你已经表明你已经解决了第一个问题,我会回答第二个问题。

这一行:

Int computerMode = num.nextInt(1)

应该是:

Int computerMode = num.nextInt(2)

或许类似

Boolean computerMode = num.nextBoolean()

根据Random#nextInt的文档:

  

返回一个伪随机,均匀分布的int值,介于0(含)和指定值(不包括)之外......

因此,由于您传入了值1,因此唯一可以返回的值是0.我建议使用nextBoolean方法,因为它看起来像是在使用{{ 1}}方法无论如何都要生成类似布尔值。