首页 > 代码库 > [收藏]C++简单五子棋

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

技术分享
  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++小知识积累"

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