1 #include<iostream> 2 #include<iomanip> 3 using namespace std; 4 5 const int X = 21; //棋盘行数 6 const int Y = 21; //棋盘列数 7 char p[X][Y]; //定义棋盘 8 int m = 0;//定义临时点,保存输入坐标 9 int n = 0; 10 11 void display() //输出棋盘 12 { 13 for (int i = 0; i < X; i++) 14 cout << setw(3) << setfill(' ') << i; 15 cout << endl; 16 for ( int i = 1; i < Y; i++) 17 { 18 cout << setw(3) << setfill(' ') << i; 19 for (int j = 1; j < X; j++) 20 cout << setw(3) << setfill(' ') << p[i][j]; 21 cout << endl; 22 } 23 24 } 25 26 void black() //黑方落子 27 { 28 cout << "请黑方输入落子位置: " 29 << "请输入落子的行数:"; 30 cin >> m; 31 cout << "请输入落子的列数:"; 32 cin >> n; 33 if (m <= 0 || m >= X || n >= Y || n <= 0) 34 { 35 cout << "超出棋盘范围,请重新输入正确坐标! "; 36 black(); 37 } 38 else if ((p[m][n] == 1) || p[m][n] == 2) 39 { 40 cout << "该点已有棋子,请重新选取落子点! "; 41 black(); 42 } 43 else 44 p[m][n] = 1; //黑方用1来表示 45 system("cls"); 46 display(); 47 } 48 49 void red() //红方落子 50 { 51 cout << "请红方输入落子位置: " 52 << "请输入落子的行数:"; 53 cin >> m; 54 cout << "请输入落子的列数:"; 55 cin >> n; 56 if (m >= X || m <= 0 || n <= 0 || n >= Y) 57 { 58 cout << "超出棋盘范围,请重新输入正确坐标! "; 59 red(); 60 } 61 else if ((p[m][n] == 1) || p[m][n] == 2) 62 { 63 cout << "该点已有棋子,请重新选取落子点! "; 64 red(); 65 } 66 else 67 p[m][n] = 2; //红方用2来表示 68 system("cls"); 69 display(); 70 } 71 72 int evalue() //只需要判断落子点为中心的九点“米”字是否连续即可 73 { 74 int k = 0, r = 0; 75 /*斜线判断*/ 76 for (k = 3; k < X - 2; k++) //两条,其中的p[k][r]!='-'是排除空子的情况 77 { 78 for (r = 3; r < Y - 2; r++) 79 { 80 if (p[k][r] != '-'&&p[k - 2][r - 2] == p[k][r] 81 &&p[k - 1][r - 1] == p[k][r] && p[k + 1][r + 1] == p[k][r] 82 &&p[k + 2][r + 2] == p[k][r]) 83 return 1; 84 else if (p[k][r] != '-'&&p[k + 2][r - 2] == p[k][r] 85 && p[k + 1][r - 1] == p[k][r] 86 && p[k - 1][r + 1] == p[k][r] && p[k - 2][r + 2] == p[k][r]) 87 return 1; 88 } 89 } 90 /*横线判断*/ 91 for (k = 1; k < X; k++) //p[k][r]!='-'是排除空子的情况 92 for (r = 3; r < Y - 2; r++) 93 if (p[k][r] != '-'&&p[k][r - 2] == p[k][r] 94 && p[k][r - 1] == p[k][r] 95 && p[k][r + 1] == p[k][r] && p[k][r + 2] == p[k][r]) 96 return 1; 97 /*竖线判断*/ 98 for (k = 3; k < X - 2; k++) //p[k][r]!='-'是排除空子的情况 99 for (r = 1; r < Y; r++) 100 if (p[k][r] != '-'&&p[k - 2][r] == p[k][r] 101 && p[k - 1][r] == p[k][r] 102 && p[k + 1][r] == p[k][r] && p[k + 2][r] == p[k][r]) 103 return 1; 104 return 0; 105 } 106 107 int main() 108 { 109 memset(p, '-', 441); //初始化为‘-’ 110 cout << "欢迎使用简易双人对战五子棋游戏 " 111 << "五子棋棋谱如下: "; 112 display(); 113 while (1) 114 { 115 red(); 116 if (evalue()) 117 { 118 cout << "红方赢! "; 119 break; 120 } 121 black(); 122 if (evalue()) 123 { 124 cout << "黑方赢! "; 125 break; 126 } 127 } 128 return 0; 129 }
小知识解释:
setw和setfill函数(#include<iomanip>)
setw(n)使得输出结果右对齐,左边默认用空格填充,若设置了setfill,则用setfill里面的字符来填充。
如果输出选项少于n,则填充,否则不会填充,自然输出。相关代码解释见"C++小知识积累"