public void toNextStep_simple() { THINK chess = new THINK(); statusMatrix = chess.getNextStep_simple(statusMatrix); //玩家下完之后的棋盘,判断电脑的操作:下子/已输 int gameresult = chess.checkFinished(statusMatrix); switch (gameresult) { case 1: finished = true; using (StreamWriter file = new StreamWriter("data.txt", true)) //将文本追加到现有文件data.txt { file.WriteLine("--" + DateTime.Now.ToString() + " 您输给了电脑!"); //拼接到一行 file.Close(); file.Dispose(); } label3.Text = "游戏结束,电脑赢了!"; break; case 10: finished = true; using (StreamWriter file = new StreamWriter("data.txt", true)) //将文本追加到现有文件data.txt { file.WriteLine("--" + DateTime.Now.ToString() + " 电脑输给了您!"); //拼接到一行 file.Close(); file.Dispose(); } label3.Text = "游戏结束,你赢了!"; break; case 100: finished = true; using (StreamWriter file = new StreamWriter("data.txt", true)) //将文本追加到现有文件data.txt { file.WriteLine("--" + DateTime.Now.ToString() + " 您与电脑打成了平局!"); //拼接到一行 file.Close(); file.Dispose(); } label3.Text = "游戏结束,打成平手!"; break; default: finished = false; label3.Text = " 请下子"; break; } }
public int[,] getNextStep(int[,] inputMatrix) { int maxWeight = 0; //假设权值最大值为maxweight,便于计算权值最大的位置 List <int> positionPool = new List <int>(); //List是一个容器类,里面装的都是类的对象 int positionPicked = 0; //记录权值相等的位置 THINK chess = new THINK(); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { statusMatrix[i, j] = inputMatrix[i, j]; } } if (chess.checkFinished(statusMatrix) == 10) //玩家已赢,电脑无需再下 { return(statusMatrix); } for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { //由于棋盘上还没有落子,当statusMatrix[i, j] == 0即棋盘为空的时候, weightMatrix[i,j] = 0。 if (statusMatrix[i, j] == 0) { weightMatrix[i, j] = 0; //第一种情况:杀 if (statusMatrix[i, 0] + statusMatrix[i, 1] + statusMatrix[i, 2] == 2) { weightMatrix[i, j] += 10000; //表示在棋盘上横向的直线上有两个电脑的棋子 } if (statusMatrix[0, j] + statusMatrix[1, j] + statusMatrix[2, j] == 2) { weightMatrix[i, j] += 10000; //表示在棋盘上纵向的直线上有两个电脑的棋子 } if (i == j && statusMatrix[0, 0] + statusMatrix[1, 1] + statusMatrix[2, 2] == 2) { weightMatrix[i, j] += 10000; //表示在棋盘上正对角线上有两个电脑的棋子 } if (i + j == 2 && statusMatrix[0, 2] + statusMatrix[1, 1] + statusMatrix[2, 0] == 2) { weightMatrix[i, j] += 10000; //表示在棋盘上另一对角线上有两个电脑的棋子 } //第二种情况:堵 if (statusMatrix[i, 0] + statusMatrix[i, 1] + statusMatrix[i, 2] == 20) { weightMatrix[i, j] += 1000; //表示在棋盘上横向的直线上有两个玩家的棋子 } if (statusMatrix[0, j] + statusMatrix[1, j] + statusMatrix[2, j] == 20) { weightMatrix[i, j] += 1000; } if (i == j && statusMatrix[0, 0] + statusMatrix[1, 1] + statusMatrix[2, 2] == 20) { weightMatrix[i, j] += 1000; } if (i + j == 2 && statusMatrix[0, 2] + statusMatrix[1, 1] + statusMatrix[2, 0] == 20) { weightMatrix[i, j] += 1000; } //第三种情况:中心点(电脑优先选择中心有利位置) if (i == 1 && j == 1) { weightMatrix[i, j] += 400; } //第四种情况:占角点(角点也是有利位置) if (i + j == 2 && i != j) { weightMatrix[i, j] += 300; } if (i == j && i != 1) { weightMatrix[i, j] += 300; } //冲二 if (statusMatrix[i, 0] + statusMatrix[i, 1] + statusMatrix[i, 2] == 2) { weightMatrix[i, j] += 1; } if (statusMatrix[0, j] + statusMatrix[1, j] + statusMatrix[2, j] == 2) { weightMatrix[i, j] += 1; } if (i == j && statusMatrix[0, 0] + statusMatrix[1, 1] + statusMatrix[2, 2] == 2) { weightMatrix[i, j] += 1; } if (i + j == 2 && statusMatrix[0, 2] + statusMatrix[1, 1] + statusMatrix[2, 0] == 2) { weightMatrix[i, j] += 1; } //特殊情况 //当[0, 0]和 [2, 2]位置上的棋子为对弈者的棋子时,在[0, 2]和 [2, 0]位置上的权值会相对减少 if (statusMatrix[0, 0] + statusMatrix[2, 2] == 20) { weightMatrix[0, 2] -= 500; weightMatrix[2, 0] -= 500; } if (statusMatrix[2, 0] + statusMatrix[0, 2] == 20) { weightMatrix[0, 0] -= 500; weightMatrix[2, 2] -= 500; } } } } //计算最大权值 for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (weightMatrix[i, j] >= maxWeight) { maxWeight = weightMatrix[i, j]; } } } for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (weightMatrix[i, j] == maxWeight) { positionPool.Add(i * 3 + j); } } } if (positionPool.Count != 0) { positionPicked = positionPool[RandomInt(positionPool.Count)]; statusMatrix[positionPicked / 3, positionPicked % 3] = 1; //计算思想来源于i * 3 + j 确定随机位置 } return(statusMatrix); }
public int[,] getNextStep_simple(int[,] inputMatrix) { int maxWeight = 0; List <int> positionPool = new List <int>(); //List是一个容器类,里面装的都是类的对象 int positionPicked = 0; THINK chess = new THINK(); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { statusMatrix[i, j] = inputMatrix[i, j]; } } if (chess.checkFinished(statusMatrix) == 10) //玩家已赢,电脑无需再下 { return(statusMatrix); } for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { //由于棋盘上还没有落子,当statusMatrix[i, j] == 0即棋盘为空的时候, weightMatrix[i,j] = 0。 if (statusMatrix[i, j] == 0) { weightMatrix[i, j] = 0; //“新手上路”电脑只会判断一种情况:杀 if (statusMatrix[i, 0] + statusMatrix[i, 1] + statusMatrix[i, 2] == 2) { weightMatrix[i, j] += 10000; //表示在棋盘上横向的直线上有两个电脑的棋子 } if (statusMatrix[0, j] + statusMatrix[1, j] + statusMatrix[2, j] == 2) { weightMatrix[i, j] += 10000; //表示在棋盘上纵向的直线上有两个电脑的棋子 } if (i == j && statusMatrix[0, 0] + statusMatrix[1, 1] + statusMatrix[2, 2] == 2) { weightMatrix[i, j] += 10000; //表示在棋盘上正对角线上有两个电脑的棋子 } if (i + j == 2 && statusMatrix[0, 2] + statusMatrix[1, 1] + statusMatrix[2, 0] == 2) { weightMatrix[i, j] += 10000; //表示在棋盘上另一对角线上有两个电脑的棋子 } } } } for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (weightMatrix[i, j] >= maxWeight) { maxWeight = weightMatrix[i, j]; } } } for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (weightMatrix[i, j] == maxWeight) { positionPool.Add(i * 3 + j); } } } if (positionPool.Count != 0) { positionPicked = positionPool[RandomInt(positionPool.Count)]; statusMatrix[positionPicked / 3, positionPicked % 3] = 1; } return(statusMatrix); }