
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 << "请黑方输入落子位置:\n"
29 << "请输入落子的行数:";
30 cin >> m;
31 cout << "请输入落子的列数:";
32 cin >> n;
33 if (m <= 0 || m >= X || n >= Y || n <= 0)
34 {
35 cout << "超出棋盘范围,请重新输入正确坐标!\n";
36 black();
37 }
38 else if ((p[m][n] == 1) || p[m][n] == 2)
39 {
40 cout << "该点已有棋子,请重新选取落子点!\n";
41 black();
42 }
43 else
44 p[m][n] = 1; //黑方用1来表示
45 system("cls");
46 display();
47 }
48
49 void red() //红方落子
50 {
51 cout << "请红方输入落子位置:\n"
52 << "请输入落子的行数:";
53 cin >> m;
54 cout << "请输入落子的列数:";
55 cin >> n;
56 if (m >= X || m <= 0 || n <= 0 || n >= Y)
57 {
58 cout << "超出棋盘范围,请重新输入正确坐标!\n";
59 red();
60 }
61 else if ((p[m][n] == 1) || p[m][n] == 2)
62 {
63 cout << "该点已有棋子,请重新选取落子点!\n";
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 << "欢迎使用简易双人对战五子棋游戏\n"
111 << "五子棋棋谱如下:\n";
112 display();
113 while (1)
114 {
115 red();
116 if (evalue())
117 {
118 cout << "红方赢!\n";
119 break;
120 }
121 black();
122 if (evalue())
123 {
124 cout << "黑方赢!\n";
125 break;
126 }
127 }
128 return 0;
129 }
小知识解释:
setw和setfill函数(#include<iomanip>)
setw(n)使得输出结果右对齐,左边默认用空格填充,若设置了setfill,则用setfill里面的字符来填充。
如果输出选项少于n,则填充,否则不会填充,自然输出。相关代码解释见"C++小知识积累"
来源:https://www.cnblogs.com/-rfq/p/5931847.html
