MineSweeper游戏阵列

时间:2016-11-20 17:24:10

标签: java

我和一些问过这个问题的人有同样的问题。

我想为一些小型扫雷游戏编写一些基本内容。 现在我遇到了我的代码

的问题
public class Minesweeper1 {

     public static int[][]  makeRandomBoard(int s, int z, int n){


     int feld[][] = new int [s][z];
     for(int i = 0; i < s; i++){
         for(int j = 0; j < z; j++){
             feld[i][j] = 0;
         } 
      }
      for(int i = 0; i < n; i++){
          selectRandomPosition(s, z);
          feld[randomHeight][randomWidth] = 1;
      }
    }

所以它启动了selectRandomPosition代码:

public static int[] selectRandomPosition(int maxWidth, int maxHeight) {
    int randomHeight = StdRandom.uniform(0, maxHeight);
    int randomWidth = StdRandom.uniform(0, maxWidth);
    return new int[]{randomHeight, randomWidth};
}

这里我不允许更改任何内容,但会返回一个新数组。现在我的问题是如何在makeRandomBoard中使用新数组?因为我不知道数组的任何名称。当我使用feld[randomHeight][randomWidth] = 1;时,它表示它不知道这些变量。

他确实得到了答案: 调用方法,并将其返回值赋给变量。现在你有了一个数组名称:

// Make a call
int[] randomArray = selectRandomPosition(maxW, maxH);
// Access the width
int randomW = randomArray[0];
// Access the height
int randomH = randomArray[1];

但我现在要写什么? 我尝试过:

feld[randomW][randomH] = 1;

但似乎它不起作用。我还需要一份退货声明。 任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

我相信这是您正在寻找的解决方案:

解决方案

public class Minesweeper1 {
    // Note:
    // s == Height
    // z == Width
    public static int[][] makeRandomBoard(int s, int z, int n) {
        // Note: Misspelling of "field"?
        int feld[][] = new int [s][z];

        // Initialize the game board with no mines (value of 0)
        for(int i = 0; i < s; i++) {
            for(int j = 0; j < z; j++) {
                feld[i][j] = 0;
            } 
        }

        // Iterate through n times to place "mines" (value of 1)
        for(int i = 0; i < n; i++){
            // selectRandomPosition returns an array of length 2
            // the first index (0) = randomHeight
            // the second index (1) = randomWidth
            // Notice that z and s is flipped
            // because the first parameter is for width, which is z
            // and the second parameter is for height, which is s
            int[] position = selectRandomPosition(z, s);
            int positionX = position[1];
            int positionY = position[0];
            // The order of positionY/positionX is key!
            // If it's in the wrong order you will get an
            // IndexOutOfBoundsException!
            feld[positionY][positionX] = 1;
        }

        // Return the newly created array
        return feld;
    }

    public static int[] selectRandomPosition(int maxWidth, int maxHeight) {
        int randomHeight = StdRandom.uniform(0, maxHeight);
        int randomWidth = StdRandom.uniform(0, maxWidth);
        // Notice that this is returning a fixed array of two elements
        // the first being the Y component, and the second being the X
        // component.
        return new int[]{randomHeight, randomWidth};
    }
}

问题

传递错误的值

您正在调用selectRandomPosition错误。请记住,s是高度,z是宽度。因此,您将第一个参数的高度selectRandomPosition和第二个参数的宽度传递给public static int[] selectRandomPosition(int maxWidth, int maxHeight) 。查看方法声明:

maxWidth

这意味着您将高度传递到maxHeight,将宽度传递到s。我的解决方案为您翻转。这可能会造成混淆,因为zfeld[randomW][randomH] = 1; 并没有真正给出你的含义(高度和宽度) - 考虑重命名这些变量来帮助你。

以错误的顺序访问

你的问题是:

feld[randomH][randomW] = 1;

这是错的,它应该是:

feld[0][0] == 1
feld[0][1] == 1
feld[0][2] == 1
feld[1][0] == 1
feld[1][1] == 2
feld[1][2] == 4
feld[2][0] == 1
feld[2][1] == 3
feld[2][2] == 9

此图像显示了二维数组的外观直观表示:

Two Dimensional Array

所以访问权限是:

s

Nit-Pick:拼写错误

除了让zconst String HtmlHtml = "<html><head>" "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" /></head>";` const String HtmlHtmlClose = "</html>"; const String HtmlTitle = "<h1>Arduino-er: ESP8266 AP WebServer exercise</h1><br/>\n"; const String HtmlLedStateLow = "<big>LED is now <b>ON</b></big><br/>\n"; const String HtmlLedStateHigh = "<big>LED is now <b>OFF</b></big><br/>\n"; const String HtmlButtons = "<a href=\"LEDOn\"><button style=\"display: block; width: 100%;\">ON</button></a><br/>" "<a href=\"LEDOff\"><button style=\"display: block; width: 100%;\">OFF</button></a><br/>"; 等奇怪的变量名称在记住什么意味着什么时根本没有帮助你,你最终会返回的主变量拼写错误。你的意思是“场”吗?

变量命名很重要,可以帮助您和其他读者轻松理解您的代码。此外,您认为需要它们的地方的评论也有帮助!