首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nim Loop的游戏

Nim Loop的游戏
EN

Stack Overflow用户
提问于 2013-12-03 07:47:25
回答 3查看 26.5K关注 0票数 2

所以,我必须以Nim....and的风格制作一款Java游戏,我已经成功地制作了大部分……我只有几个问题让我感到困惑:

问题1:程序可以很好地执行,甚至可以运行一次,但是在遍历代码一次之后,程序就退出了……我需要帮助来了解它为什么这样做(我是否使用了错误的循环?)

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

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

下面是我的代码:

代码语言:javascript
复制
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;
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-03 08:03:04

来自随机的documentation

返回一个伪随机的、均匀分布在0(含)和指定值(不含)之间的int值。

"Exclusive“表示nextInt(n)将返回一个可以为n-1但不能为n的整数。nextInt(n)n不同的可能结果,包括0。

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

票数 2
EN

Stack Overflow用户

发布于 2013-12-03 08:00:08

Random.nextInt(int n)将返回一个介于0和n之间的独占int值。由于您已经按如下方式计算了computerMode:

代码语言:javascript
复制
int computerMode = num.nextInt(1);

computerMode将始终返回0。

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

票数 3
EN

Stack Overflow用户

发布于 2013-12-03 08:13:07

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

这一行:

代码语言:javascript
复制
Int computerMode = num.nextInt(1)

应该是:

代码语言:javascript
复制
Int computerMode = num.nextInt(2)

或者像这样的东西

代码语言:javascript
复制
Boolean computerMode = num.nextBoolean()

根据Random#nextInt的文档

返回一个伪随机的、均匀分布在0(包括)和指定值(不包括)之间的int值...

因此,由于您传入的值是1,因此唯一可能返回的值是0。我也建议使用nextBoolean方法,因为看起来您无论如何都是在使用nextInt方法来生成一个类似布尔值的值。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20340166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档