首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nim游戏示例静态和随机问题

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

Stack Overflow用户
提问于 2013-11-22 01:25:40
回答 2查看 2.9K关注 0票数 0

我的循环出了点问题。我认为循环在理论上工作得很好,只是当我尝试堆积时,它会告诉我它需要是静态的。我将其更改为静态,然后随机数生成器不再工作,任何建议将不胜感激。

质疑尼姆的游戏。这是一个广为人知的游戏,有许多变体。下面的变种有一个有趣的获胜策略。两个玩家交替地从一堆弹珠中取出弹珠。在每一步中,玩家选择要拿多少个弹珠。玩家必须拿到至少一个但最多半个弹珠。然后另一个玩家转身。拿到最后一颗弹珠的玩家输了。

例如。如果初始堆从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。这始终是合法的举动,除非当前堆的大小比2的幂小1。在这种情况下,计算机进行随机合法移动(介于1和n/2之间的值)。

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

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

我的代码

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




        }
    }
}}
EN

回答 2

Stack Overflow用户

发布于 2013-11-22 04:37:17

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

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

代码语言:javascript
复制
Random generator= new Random();

这不是静态的。因此需要将其更改为

代码语言:javascript
复制
static Random generator = new Random();

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

代码语言:javascript
复制
int turn= generator.nextInt(2);

应该是

代码语言:javascript
复制
static int turn = generator.nextInt(2);

诸若此类。静电是粘性的。静态对象只能访问其他静态对象。

另一种可能更好的替代方法是将这些声明移动到main方法中。因为您没有使用任何其他方法,所以没有理由在顶级声明它们,也不必将它们声明为static

票数 1
EN

Stack Overflow用户

发布于 2013-11-22 01:37:52

我认为你需要在if后面加上花括号:

代码语言:javascript
复制
 if (comp="dumb")

代码语言:javascript
复制
if (comp=="smart")

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

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

https://stackoverflow.com/questions/20127832

复制
相关文章

相似问题

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