Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Nim游戏示例静态和随机问题_Java - Fatal编程技术网

Java Nim游戏示例静态和随机问题

Java Nim游戏示例静态和随机问题,java,Java,我的循环有问题。我认为这个循环在理论上很好,只是当我试着把它堆积起来时,它说它需要是静态的。我将其更改为静态,然后随机数生成器不再工作。如有任何建议,将不胜感激 问题: 尼姆的游戏。这是一款著名的游戏,有很多变体。下面的变体有一个有趣的获胜策略。两名玩家轮流从一堆弹珠中取出弹珠。在每一步中,一名玩家选择要拿多少颗弹珠。玩家必须至少拿走一个但最多拿走一半的弹珠。然后,另一个玩家轮流。拿最后一块弹珠的玩家输了 比如说。如果最初的堆开始于100,那么玩家1可以在1-50个弹珠之间的任何地方进行。让我们

我的循环有问题。我认为这个循环在理论上很好,只是当我试着把它堆积起来时,它说它需要是静态的。我将其更改为静态,然后随机数生成器不再工作。如有任何建议,将不胜感激

问题: 尼姆的游戏。这是一款著名的游戏,有很多变体。下面的变体有一个有趣的获胜策略。两名玩家轮流从一堆弹珠中取出弹珠。在每一步中,一名玩家选择要拿多少颗弹珠。玩家必须至少拿走一个但最多拿走一半的弹珠。然后,另一个玩家轮流。拿最后一块弹珠的玩家输了

比如说。如果最初的堆开始于100,那么玩家1可以在1-50个弹珠之间的任何地方进行。让我们假设玩家1需要20个弹珠,将这堆弹珠减少到80个。玩家2可以携带1-40颗弹珠。直到所有的弹珠都消失为止

编写一个程序,让计算机与人类对手进行对抗。生成一个介于10和100之间的随机整数,以表示桩的初始尺寸。生成一个介于0和1之间的随机整数,以决定是计算机还是人进行第一轮。生成一个介于0和1之间的随机整数,以决定计算机是玩聪明游戏还是玩愚蠢游戏。在愚蠢的模式下,只要计算机有一个回合,它就会从堆中随机抽取一个合法值(介于1和n/2之间)。在智能模式下,计算机会剥离足够多的弹珠,使弹珠的大小为2减1的幂次方,即3、7、15、31或63。这始终是一个合法的举动,除非当前桩的大小是1小于2的幂。在这种情况下,计算机进行随机合法移动(值介于1和n/2之间)

您将注意到,当计算机第一次移动时,不能在智能模式下击败它,除非堆大小恰好为15、31或63。当然,一个拥有第一回合并且知道获胜策略的人类玩家可以战胜计算机

注意:当处理的数字是奇数时,您不必担心舍入问题。只需使用整数除法,它将截断除法的小数位数(删除而不舍入)

我的代码

import java.util.Random;
import java.util.Scanner;
public class Nim
{ Random generator= new Random();
    int turn= generator.nextInt(2);
 int pile= generator.nextInt(91) + 10;
    int smartDumb= generator.nextInt(2);
   Scanner in= new Scanner(System.in);

     public static void main(String [] args){
      String Comp;
         int currentPile= pile;

          while (pile>0){
             int take=0;

              if(smartDumb==1)
                                Comp="dumb";
                                else Comp= "smart";
                if (turn == 1)
                       turn = 0;
                else
                       turn = 1;
                       {
                             if (turn==0){
                                 System.out.println("Please take some marbles.");
                                 currentPile=pile-in.nextInt();
                                 turn=1;
                                }
                                else 
                                 if (comp="dumb")
                                 take= generator.nextInt(1,currentPile);
                                 Currentpile= currentPile-take;

                                if (comp=="smart")
                                if (currentPile > 64)
                                    currentPile=63;
                                if (currentPile > 32 && currentPile < 63)
                                    currentPile=31;
                                if (currentPile > 16 && currentPile < 31)
                                    currentPile=15;
                                if (currentPile > 8 && currentPile < 15)
                                    currentPile=7;
                                if (currentPile > 4 && currentPile < 7)
                                currentPile=3;
                                if (currentPile == 2)
                                currentPile = 1;
                                if (currentPile==1)
                                currentPile=0;

                                System.out.println("The game is over!");
                                break;




        }
    }
}}
import java.util.Random;
导入java.util.Scanner;
公共类Nim
{随机生成器=新随机();
int turn=发电机下一个(2);
int pile=发电机。nextInt(91)+10;
int smartDumb=generator.nextInt(2);
扫描仪输入=新扫描仪(系统输入);
公共静态void main(字符串[]args){
字符串Comp;
int currentPile=桩;
而(桩>0){
int-take=0;
如果(smartDumb==1)
Comp=“dumb”;
else Comp=“智能”;
如果(圈数==1)
匝数=0;
其他的
圈数=1;
{
如果(转动==0){
System.out.println(“请拿一些弹珠。”);
currentPile=pile in.nextInt();
圈数=1;
}
其他的
如果(comp=“dumb”)
take=发电机.nextInt(1,电流桩);
Currentpile=Currentpile take;
如果(组件==“智能”)
如果(currentPile>64)
电流桩=63;
如果(currentPile>32&¤tPile<63)
currentPile=31;
如果(电流桩>16和电流桩<31)
电流桩=15;
如果(currentPile>8&¤tPile<15)
电流桩=7;
如果(currentPile>4&¤tPile<7)
电流桩=3;
如果(currentPile==2)
电流桩=1;
如果(currentPile==1)
currentPile=0;
System.out.println(“游戏结束了!”);
打破
}
}
}}

我想你需要在你的if's之后使用大括号:

 if (comp="dumb")


将代码分解成更小的子例程也是非常有益的,这样您就可以一次测试/调试更小的代码块

虽然vandale正确地认为您应该在if语句体周围使用
{}
,但您的直接问题是您有一个
静态
方法(
main
)试图访问类
Nim
的非静态字段。这是不允许的。为了访问非静态字段,您需要该类的实例,而不需要。因为你显然是一个初学者,所以我不会深入探讨这一切意味着什么(我们将留给你的教授)。现在,您需要知道的是,由于
main
static
,因此它只能访问自己的变量(在它内部定义的变量)或在它外部定义的其他
static
变量

现在出现编译错误的原因是
main
正在尝试使用

Random generator= new Random();
这不是静态的。所以这需要改为

static Random generator = new Random();
当然,下一行重复同样的错误

int turn= generator.nextInt(2);
应该是

static int turn = generator.nextInt(2);
等等。静电是粘性的。静态对象只能访问其他静态对象

另一个可能更好的选择是将这些声明移动到
main
方法中。由于您没有使用任何其他方法,因此没有理由在顶层声明它们,您也不必声明它们
static

“当我试图帮助你的时候
static int turn = generator.nextInt(2);