c++实战-多子棋

打印 上一主题 下一主题

主题 994|帖子 994|积分 2982

自创的游戏,可以控制棋盘巨细之类的
核心在于控制胜利条件,需要每次扫描
代码如下:
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. #define MAX_SIZE 9
  5. // 定义棋盘为MAX_SIZE x MAX_SIZE的二维向量
  6. vector<vector<char>> board(MAX_SIZE, vector<char>(MAX_SIZE));    //稍用一下vector,比较方便
  7. int boardSize;        //小驼峰命名法,全局变量省的来回传来传去
  8. char currentPlayer;   //小驼峰命名法,全局变量省的来回传来传去
  9. // 函数声明
  10. void init(int size);
  11. void printt();
  12. bool check(int size);
  13. void exchange();
  14. void move(int size);
  15. bool judge(int size);
  16. int main()
  17. {
  18.     int size;
  19.     // 提示用户输入棋盘大小
  20.     cout << "请输入棋盘大小(5到9之间):";
  21.     cin >> size;
  22.     // 验证用户输入的棋盘大小是否在有效范围内
  23.     while (1)
  24.     {
  25.         if (size < 5 || size > 9)
  26.         {
  27.             cout << "请正确输入棋盘大小!" << endl;
  28.             cin >> size;
  29.         }
  30.         else
  31.             break;//循环到正确为止
  32.     }
  33.     boardSize = size;
  34.     init(boardSize);     // 初始化棋盘
  35.     currentPlayer = 'X'; // 设置初始玩家为'X'(棋盘行子也用X表示)(五子棋的图案)
  36.     // 主游戏循环
  37.     while (true)
  38.     {
  39.         printt();        // 打印当前棋盘状态
  40.         move(boardSize); // 执行玩家移动
  41.         // 检查当前玩家是否获胜
  42.         if (check(boardSize))
  43.         {
  44.             printt();
  45.             cout << "玩家 " << currentPlayer << " 胜利!" << endl;
  46.             break;
  47.         }
  48.         // 检查棋盘是否已满
  49.         if (judge(boardSize))
  50.         {
  51.             printt();
  52.             cout << "平局!" << endl;
  53.             break;
  54.         }
  55.         exchange(); // 切换玩家,即X 与 O
  56.     }
  57.     return 0;
  58. }
  59. // 初始化棋盘,将所有格子设置为空白
  60. void init(int size)
  61. {
  62.     for (int i = 0; i < size; i++)
  63.     {
  64.         for (int j = 0; j < size; j++)
  65.         {
  66.             board[i][j] = ' ';
  67.         }
  68.     }
  69. }
  70. // 打印棋盘当前状态
  71. void printt()
  72. {
  73.     cout << "   ";
  74.     for (int i = 0; i < boardSize; i++)
  75.     {
  76.         cout << i + 1 << "   ";
  77.     }
  78.     cout << endl;
  79.     for (int i = 0; i < boardSize; i++)
  80.     {
  81.         cout << i + 1 << " ";
  82.         for (int j = 0; j < boardSize; j++)
  83.         {
  84.             cout << " " << board[i][j] << " ";
  85.             if (j < boardSize - 1)
  86.                 cout << " ";
  87.         }
  88.         cout << endl
  89.              << endl; // 添加空行以增加纵向间距,好看的需要,同时连线直
  90.     }
  91. }
  92. // 检查一条线是否有五个连续的相同标志
  93. bool checkLine(vector<char> &line, int size)
  94. {
  95.     int count = 0;
  96.     for (int i = 0; i < size; i++)
  97.     {
  98.         if (line[i] == currentPlayer)
  99.         {
  100.             count++;
  101.             if (count == 5)
  102.             {
  103.                 return true;
  104.             }
  105.         }
  106.         else
  107.         {
  108.             count = 0;
  109.         }
  110.     }
  111.     return false;
  112. }
  113. // 检查当前玩家是否获胜
  114. bool check(int size)
  115. {
  116.     vector<char> line(MAX_SIZE);
  117.     // 检查每一行
  118.     for (int i = 0; i < size; i++)
  119.     {
  120.         for (int j = 0; j < size; j++)
  121.         {
  122.             line[j] = board[i][j];
  123.         }
  124.         if (checkLine(line, size))
  125.         {
  126.             return true;
  127.         }
  128.     }
  129.     // 检查每一列
  130.     for (int i = 0; i < size; i++)
  131.     {
  132.         for (int j = 0; j < size; j++)
  133.         {
  134.             line[j] = board[j][i];
  135.         }
  136.         if (checkLine(line, size))
  137.         {
  138.             return true;
  139.         }
  140.     }
  141.     // 检查对角线
  142.     for (int i = -size + 1; i < size; i++)
  143.     {
  144.         int index = 0;
  145.         for (int j = 0; j < size; j++)
  146.         {
  147.             int k = i + j;
  148.             if (k >= 0 && k < size)
  149.             {
  150.                 line[index++] = board[j][k];
  151.             }
  152.         }
  153.         if (index >= 5 && checkLine(line, index))
  154.         {
  155.             return true;
  156.         }
  157.     }
  158.     // 检查反对角线
  159.     for (int i = 0; i < 2 * size - 1; i++)
  160.     {
  161.         int index = 0;
  162.         for (int j = 0; j < size; j++)
  163.         {
  164.             int k = i - j;
  165.             if (k >= 0 && k < size)
  166.             {
  167.                 line[index++] = board[j][k];
  168.             }
  169.         }
  170.         if (index >= 5 && checkLine(line, index))
  171.         {
  172.             return true;
  173.         }
  174.     }
  175.     return false;
  176. }
  177. // 切换当前玩家
  178. void exchange()
  179. {
  180.     currentPlayer = (currentPlayer == 'X') ? 'O' : 'X';
  181. }
  182. // 处理玩家输入并更新棋盘
  183. void move(int size)
  184. {
  185.     int row, col;
  186.     while (true)
  187.     {
  188.         cout << "玩家 " << currentPlayer << " 请输入你的移动(行和列):";
  189.         cin >> row >> col;
  190.         row--;
  191.         col--;
  192.         if (row >= 0 && row < size && col >= 0 && col < size && board[row][col] == ' ')
  193.         {
  194.             board[row][col] = currentPlayer;
  195.             break;
  196.         }
  197.         else
  198.         {
  199.             cout << "无效的移动,请重新输入。" << endl;
  200.         }
  201.     }
  202. }
  203. // 检查棋盘是否已满
  204. bool judge(int size)
  205. {
  206.     for (int i = 0; i < size; i++)
  207.     {
  208.         for (int j = 0; j < size; j++)
  209.         {
  210.             if (board[i][j] == ' ')
  211.             {
  212.                 return false;
  213.             }
  214.         }
  215.     }
  216.     return true;
  217. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

科技颠覆者

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表