【问题标题】:Nim Game Example Static and Random IssuesNim 游戏示例静态和随机问题
【发布时间】:2013-11-21 17:25:39
【问题描述】:

我的循环有问题。我认为这个循环在理论上可以正常工作,只是当我尝试堆放它时,它说它需要是静态的。我将其更改为静态,然后随机数的生成器不再起作用,任何建议将不胜感激。

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

例如。如果初始堆从 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 和 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;




        }
    }
}}

【问题讨论】:

  • “当我试着堆它时说它需要是静态的”你描述你的问题很糟糕。在我看来,问题的主要部分是描述你的游戏。你想要做的是发布你尝试编译时得到的错误(称为堆栈跟踪)

标签: java


【解决方案1】:

虽然 vandale 是正确的,您应该在 if 语句的主体周围使用 {},但您的直接问题是您有一个 static 方法 (main) 试图访问 @ 类的非静态字段987654324@。这是不允许的。为了访问非静态字段,您需要拥有该类的实例,而您没有。由于您显然是初学者,因此我不会深入研究所有这些意味着什么(我们将把它留给您的教授)。现在,您需要知道的是,由于mainstatic,它唯一可以访问的变量是它自己的变量(在其中定义的变量),或者在它之外定义的其他static 变量。

您现在收到编译错误的原因是因为 main 正在尝试使用

Random generator= new Random();

这不是静态的。所以需要改成

static Random generator = new Random();

当然,下一行重复了同样的错误。

int turn= generator.nextInt(2);

应该是

static int turn = generator.nextInt(2);

等等。静电是粘性的。静态事物只能访问其他静态事物。

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

【讨论】:

    【解决方案2】:

    我认为你的 if 后面需要大括号:

     if (comp="dumb")
    

    if (comp=="smart")
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-18
      • 2021-07-24
      • 1970-01-01
      • 1970-01-01
      • 2015-05-07
      • 2017-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多