[收藏]C++简单五子棋

自古美人都是妖i 提交于 2020-01-24 06:09:10
  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 }
View Code

 小知识解释:

       setw和setfill函数(#include<iomanip>)

       setw(n)使得输出结果右对齐,左边默认用空格填充,若设置了setfill,则用setfill里面的字符来填充。

       如果输出选项少于n,则填充,否则不会填充,自然输出。相关代码解释见"C++小知识积累"

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!