• [收藏]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 << "请黑方输入落子位置:
    "
     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 }
    View Code

     小知识解释:

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

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

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

  • 相关阅读:
    【iCore3 双核心板】例程九:ADC实验——电源监控
    【iCore3 双核心板】例程八:定时器PWM实验——呼吸灯
    【iCore3双核心板】扩展引脚分布
    【iCore3 双核心板】例程七:WWDG看门狗实验——复位ARM
    【iCore3 双核心板】例程六:IWDG看门狗实验——复位ARM
    【iCore3 双核心板】例程五:SYSTICK定时器实验——定时点亮LED
    【iCore3 双核心板】例程四:USART通信实验——通过命令控制LED
    【iCore3 双核心板】例程三:EXTI中断输入实验——读取ARM按键状态
    【iCore3 双核心板】例程二:读取arm按键状态
    【iCore3 双核心板】例程一:ARM驱动三色LED
  • 原文地址:https://www.cnblogs.com/-rfq/p/5931847.html
Copyright © 2020-2023  润新知