对五子棋胜负的一个模拟判断

  在这个模拟中,采用文件来存储棋盘状况。data.txt的内容类似下面这样,0表示未下子,1表示黑子,2表示白子:0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 1 0 0 0 0 0 0 1 2 2 2 2 1 1 2 0 0 0 0 0 0 0 0 2 1 0 1 1 2 0 0 0 0 0 0 0 0 2 1 1 1 2 2 2 2 1 0 0 0 0 0 1 2 2 1 1 2 1 2 0 1 0 0 0 0 0 0 1 2 1 1 1 1 2 0 1 0 0 0 0 0 0 1 2 2 2 2 1 1 2 0 0 0 0 0 0 0 0 0 0 2 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

  先将文件中的数据读取到一个字符数组中,然后对数组内容进行遍历判断。分横、竖、左右斜、右左斜四种情况判断。若出现一方胜的情况,则将胜负标志变量置为1或者2并跳出判断,最后根据胜负标志变量来输出哪方胜并输出取胜的起始坐标点。源代码如下:

#include #include #include using namespace std; int main() { ifstream ifile("data.txt"); char data[15][15]; // 将data.txt中的数据读到字符数组中 int i,j; for(i=0;i!=15;++i) { for(j=0;j!=15;++j) { string tmp; ifile >> tmp; data[i][j] = tmp[0]; } } // 判断 char winFlag = '0'; for(i=0;i!=15;++i) { if(winFlag!='0') { i--; break; } for(j=0;j!=15;++j) { // 横 if(j<=10 && data[i][j]!='0' && data[i][j]==data[i][j+1] && data[i][j]==data[i][j+2] && data[i][j]==data[i][j+3] && data[i][j]==data[i][j+4]) { winFlag = data[i][j]; break; } // 竖 if(i<=10 && data[i][j]!='0' && data[i][j]==data[i+1][j] && data[i][j]==data[i+2][j] && data[i][j]==data[i+3][j] && data[i][j]==data[i+4][j]) { winFlag = data[i][j]; break; } // 左向右斜 if(i<=10 && j<=10 && data[i][j]!='0' && data[i][j]==data[i+1][j+1] && data[i][j]==data[i+2][j+2] && data[i][j]==data[i+3][j+3] && data[i][j]==data[i+4][j+4]) { winFlag = data[i][j]; break; } // 右向左斜 if(i<=10 && j>=4 && data[i][j]!='0' && data[i][j]==data[i+1][j-1] && data[i][j]==data[i+2][j-2] && data[i][j]==data[i+3][j-3] && data[i][j]==data[i+4][j-4]) { winFlag = data[i][j]; break; } } } // winFlag为0代表无胜负,为1代表黑方胜,为2代表白方胜 string showWord[3] = {"No one wins!", "Black win!", "White wins!"}; cout << showWord[winFlag-'0'] << endl; if(i!=14||j!=14) { cout << "Start coordinate : " << i << " , " << j << endl; } ifile.close(); return 0; }

 

  以上方法中使用的是全棋盘判断……接tbo1988同学的意见,可以在某方落子后根据该子坐标判断一横条、一竖条、两斜条就可以了。按这个思路小改一下以后,虽然代码量没怎么减,可是效率上却是大大提高了。

  以下程序流程即用户输入一个坐标,然后函数judgment根据此坐标对棋盘一横条、一竖条、两斜条进行判断,然后返回胜负标志变量。此函数基本上可以直接用于后来将基于MFC的五子棋游戏中。

#include #include #include using namespace std; #define NUM 15 char judgment(int x, int y, char data[NUM][NUM]) { int i; char winFlag = '0'; for(i=0;i!=5;++i) { if( (y-i>=0 && y-i+4=0 && x-i+4=0 && y-i>=0 && x-i+4=0 && y+i=0 && // 右向左斜 data[x-i][y+i]==data[x-i+1][y+i-1] && data[x-i][y+i]==data[x-i+2][y+i-2] && data[x-i][y+i]==data[x-i+3][y+i-3] && data[x-i][y+i]==data[x-i+4][y+i-4]) ) { winFlag = data[x][y]; break; } } return winFlag; } int main() { ifstream ifile("data.txt"); char data[NUM][NUM]; // 将data.txt中的数据读到字符数组中 int i,j; for(i=0;i!=NUM;++i) { for(j=0;j!=NUM;++j) { string tmp; ifile >> tmp; data[i][j] = tmp[0]; } } cout << "input x coordinate: "; cin >> i; cout << "input y coordinate: "; cin >> j; char winFlag = judgment(i,j,data); // winFlag为0代表无胜负,为1代表黑方胜,为2代表白方胜 string showWord[3] = {"No one wins!", "Black win!", "White wins!"}; cout << showWord[winFlag-'0'] << endl; ifile.close(); return 0; }

你可能感兴趣的:(C/C++)