今天做了一个实验题,要求用回溯法实现简单的井字棋游戏,可以理解为人机大战,胜利的条件为任一方在3*3的棋盘上自己的棋子在任何方向上有3个子连在一起,就算赢了。
一. 思路
1. 初始化。无论你做什么程序,第一步都需要初始化,我们需要将棋盘初始化每个位子的子都显示为0,如果人下了一个子,那么显示为P,机器下了一个子,显示为C。调用一个print函数将初始化的棋盘输出来。如果人先走棋,就输入所要走的横坐标和纵坐标即可。如果是机器先走,那么在初始化的时候就应该随机初始化一个机器要走的地方,然后利用print函数将棋盘输出。
2. 走棋之前。我们需要定义一个函数去判断每一次棋盘是怎样的。也就是有没有人获胜,或者平局。所有获胜的情况总共也没几种,是可以全部写在if中的。然后如果棋盘没有空的地方,而且没有一方获胜,那么就是平局。所以每次不管是谁,走棋之前都要判断两个角色是否赢了比赛,或者是否棋盘为空。
3. 开始下棋:人和机器不断切换。人走完,角色切换到机器,机器走完角色切换到人就行了。
(1)如果是人走棋,输入横纵坐标,然后根据横纵坐标找到棋盘位置,如果那个位置还没被占用,就将那个位置改为P。再次print即可。
(2)如果是机器走棋,它会用回溯法去遍历在当前情况下,所有可能的情况,并且他会走一个能让他赢得概率最大的情况。然后将那个地方改为C,再次print即可。
二. 代码
package cn.chinatelecom.test;
import java.util.Random;
import java.util.Scanner;
public class jingziqi {
char[][] chess = new char[3][3];
char player,computer;
boolean playerF;
boolean detectWin(char player) {//判断玩家player是否胜利
for(int i=0;i<3;i++)
if(chess[i][0]==player&&chess[i][1]==player&&chess[i][2]==player) {
return true;
}else {
if(chess[0][i]==player&&chess[1][i]==player&&chess[2][i]==player)
return true;
}
if(chess[0][0]==