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

时间:2013-11-21 17:25:40

标签: java

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

问题 尼姆的游戏。这是一款众所周知的游戏,有许多变种。以下变体有一个有趣的获胜策略。两名球员交替从一堆中取出弹珠。在每次移动中,玩家选择要使用多少弹珠。玩家必须至少使用一个但最多一半的弹珠。然后其他玩家转了一圈。拿最后一块大理石的玩家输了。

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




        }
    }
}}

2 个答案:

答案 0 :(得分:1)

虽然vandale是正确的,你应该在if语句的主体周围使用{},但你当前的问题是你有一个static方法(main)试图访问非类Nim的静态字段。这是不允许的。要访问非静态字段,您需要拥有该类的实例,而不是。既然你显然是初学者,我就不会深入研究所有这些意味着什么(我们会留给你的教授)。目前,您需要知道的是,因为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

答案 1 :(得分:0)

我认为你需要跟随你的if:

 if (comp="dumb")

if (comp=="smart")

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