随机化tictactoe

时间:2013-12-03 06:50:39

标签: java eclipse

我有一段时间通过eclipse创建了一个tictactoe程序。它运作良好,我点击空框放置O,然后程序输入X。但是,我使用了一个非常简单的代码来放置X' s:

 public int putX(){
 for(int i=0; i<3;i++)
  for(int j = 0;j<3;j++) {
     if(position[i][j]==' ') {
       position[i][j]='X';
       return 0;
     }
  }
  return -1; //some error occurred. This is odd. No cells were free.
 }

因此,X只是放在每列的行中,直到下一列。有人能告诉我一个随机化这个程序的简单方法吗?

1 个答案:

答案 0 :(得分:1)

我们想要做的是生成所有可能点的数组,并随机选择其中一个点。我们使用for循环迭代3x3数组中的所有点,并将有效的数据添加到临时数组中,然后我们选择一个随机索引,并在那里放置一个X.

String[] list = new String[9]; // maximum 9 points
int size = 0;

for(int i = 0; i < 3; i++) {
    for(int j = 0; j < 3; j++) {
        if(position[i][j] == ' ') {
            list[size] = "" + i + j;
            size++;
        }
    }
}

int index = (int) (Math.random() * (size+1));
position[Integer.parseInt(list[index].charAt(0))][Integer.parseInt(list[index].charAt(1))] = 'X';

或者,我们可以将它们存储在String中,而不是将点的x,y坐标存储在java.awt.Point中,而不是:

Point[] list = new Point[9]; // maximum 9 points
int size = 0;

for(int i = 0; i < 3; i++) {
    for(int j = 0; j < 3; j++) {
        if(position[i][j] == ' ') {
            list[size] = new Point(i, j);
            size++;
        }
    }
}

int index = (int) (Math.random() * (size+1));
position[list[index].getX()][list[index].getY()] = 'X';

正如您所看到的,使用Point的代码实际上是相同的,但是我们可以直接从Class中访问它们,而不是从String中解析坐标。

你还应检查以确保剩下一些元素,通过检查for循环后大小是否仍为0。如果是这样,你应该返回-1(你现有的代码所做的)。否则,在整个代码结束时返回0。