鱼C论坛

 找回密码
 立即注册
查看: 31|回复: 1

[作品展示] 2048游戏(Cpp版)

[复制链接]
发表于 昨天 22:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 pyzyd 于 2025-10-13 22:46 编辑

控制台版

_屏幕录制20251013222252.gif

应用程序:

2048控制台.zip (8.06 KB, 下载次数: 0)

  1. #include <iostream>
  2. #include <random>
  3. #include <iomanip>
  4. #include <conio.h>
  5. #include <cstdlib>

  6. // 定义数据
  7. #define ROW 4
  8. #define COL 4

  9. // 设置随机数种子
  10. std::random_device rd;
  11. std::mt19937 gen(rd());

  12. enum Direction { UP = 72, DOWN = 80, LEFT = 75, RIGHT = 77 };


  13. // 定义地图
  14. int map[ROW][COL] = { 0 };


  15. void initMap();
  16. bool generateRandomNumber();
  17. bool isFull();
  18. void printMap();
  19. void moveLeft();
  20. void moveRight();
  21. void moveUp();
  22. void moveDown();
  23. bool Move();
  24. void runGame();

  25. int main() {
  26.     system("chcp 65001");
  27.     runGame();
  28.     return 0;
  29. }

  30. /*
  31. 初始化地图
  32. */
  33. void initMap() {
  34.     for (int i = 0; i < ROW; i++) {
  35.         for (int j = 0; j < COL; j++) {
  36.             map[i][j] = 0;
  37.         }
  38.     }
  39.     generateRandomNumber();
  40. }

  41. /*
  42. 生成随机数
  43. */
  44. bool generateRandomNumber() {
  45.     int count = 0;
  46.     std::uniform_int_distribution<> dis(0, ROW - 1);
  47.     if (isFull()) {
  48.         return false;
  49.     }
  50.     while (count < 2) {
  51.         int row = dis(gen);
  52.         int col = dis(gen);
  53.         if (map[row][col] == 0) {
  54.             map[row][col] = (dis(gen) == 1) ? 2 : 4;
  55.             count++;
  56.         }
  57.     }
  58.     return true;
  59. }

  60. /*
  61. 判断地图是否已满
  62. */
  63. bool isFull() {
  64.     int count = 0;
  65.     for (int i = 0; i < ROW; i++) {
  66.         for (int j = 0; j < COL; j++) {
  67.             if (map[i][j] == 0) {
  68.                 count++;
  69.             }
  70.         }
  71.     }
  72.     if (count < 2) {
  73.         return true;
  74.     }
  75.     return false;
  76. }

  77. void printMap() {
  78.     std::cout << "请用方向键(包含箭头和wasd)进行操作,点击q可以退出游戏......" << std::endl;
  79.     std::cout << std::endl;
  80.     std::cout << std::endl;
  81.     for (int i = 0; i < ROW; i++) {
  82.         for (int j = 0; j < COL; j++) {
  83.             std::cout << std::setw(5) << map[i][j] << " ";
  84.         }
  85.         std::cout << std::endl;
  86.         std::cout << std::endl;
  87.     }
  88. }

  89. void moveLeft() {
  90.     for (int i = 0; i < ROW; i++) {
  91.         for (int j = 0; j < COL - 1; j++) {
  92.             if (map[i][j] == 0) {
  93.                 int k = j + 1;
  94.                 while (k < COL && map[i][k] == 0) k++;
  95.                 if (k == COL) break;
  96.                 map[i][j] = map[i][k];
  97.                 map[i][k] = 0;
  98.             }
  99.             if (map[i][j] != 0) {
  100.                 int k = j + 1;
  101.                 while (k < COL && map[i][k] == 0) k++;
  102.                 if (k < COL && map[i][j] == map[i][k]) {
  103.                     map[i][j] *= 2;
  104.                     map[i][k] = 0;
  105.                 }
  106.             }
  107.         }
  108.     }
  109. }

  110. void moveRight() {
  111.     for (int i = 0; i < ROW; i++) {
  112.         for (int j = COL - 1; j > 0; j--) {
  113.             if (map[i][j] == 0) {
  114.                 int k = j - 1;
  115.                 while (k >= 0 && map[i][k] == 0) k--;
  116.                 if (k < 0) break;
  117.                 map[i][j] = map[i][k];
  118.                 map[i][k] = 0;
  119.             }
  120.             if (map[i][j] != 0) {
  121.                 int k = j - 1;
  122.                 while (k >= 0 && map[i][k] == 0) k--;
  123.                 if (k >= 0 && map[i][j] == map[i][k]) {
  124.                     map[i][j] *= 2;
  125.                     map[i][k] = 0;
  126.                 }
  127.             }
  128.         }
  129.     }
  130. }

  131. void moveUp() {
  132.     for (int j = 0; j < COL; j++) {
  133.         for (int i = 0; i < ROW - 1; i++) {
  134.             if (map[i][j] == 0) {
  135.                 int k = i + 1;
  136.                 while (k < ROW && map[k][j] == 0) k++;
  137.                 if (k == ROW) break;
  138.                 map[i][j] = map[k][j];
  139.                 map[k][j] = 0;
  140.             }
  141.             if (map[i][j] != 0) {
  142.                 int k = i + 1;
  143.                 while (k < ROW && map[k][j] == 0) k++;
  144.                 if (k < ROW && map[i][j] == map[k][j]) {
  145.                     map[i][j] *= 2;
  146.                     map[k][j] = 0;
  147.                 }
  148.             }
  149.         }
  150.     }
  151. }

  152. void moveDown() {
  153.     for (int j = 0; j < COL; j++) {
  154.         for (int i = ROW - 1; i > 0; i--) {
  155.             if (map[i][j] == 0) {
  156.                 int k = i - 1;
  157.                 while (k >= 0 && map[k][j] == 0) k--;
  158.                 if (k < 0) break;
  159.                 map[i][j] = map[k][j];
  160.                 map[k][j] = 0;
  161.             }
  162.             if (map[i][j] != 0) {
  163.                 int k = i - 1;
  164.                 while (k >= 0 && map[k][j] == 0) k--;
  165.                 if (k >= 0 && map[i][j] == map[k][j]) {
  166.                     map[i][j] *= 2;
  167.                     map[k][j] = 0;
  168.                 }
  169.             }
  170.         }
  171.     }
  172. }

  173. bool Move() {
  174.     int ch = _getch();

  175.     // 处理扩展按键(方向键)
  176.     if (ch == 0 || ch == 224) {
  177.         ch = _getch();
  178.         switch (ch) {
  179.         case LEFT:
  180.             moveLeft();
  181.             break;
  182.         case RIGHT:
  183.             moveRight();
  184.             break;
  185.         case UP:
  186.             moveUp();
  187.             break;
  188.         case DOWN:
  189.             moveDown();
  190.             break;
  191.         default:
  192.             return false;  // 其他扩展键
  193.         }
  194.     }
  195.     // 处理普通方向键(WASD)和退出键
  196.     else {
  197.         switch (ch) {
  198.         case 'w': case 'W':
  199.             moveUp();
  200.             break;
  201.         case 's': case 'S':
  202.             moveDown();
  203.             break;
  204.         case 'a': case 'A':
  205.             moveLeft();
  206.             break;
  207.         case 'd': case 'D':
  208.             moveRight();
  209.             break;
  210.         case 'q': case 'Q': case 27:  // ESC键
  211.             std::cout << "游戏退出!" << std::endl;
  212.             exit(0);
  213.         default:
  214.             return false;  // 其他按键(包括鼠标产生的字符)
  215.         }
  216.     }

  217.     system("cls");
  218.     return true;
  219. }

  220. void runGame()
  221. {
  222.     std::cout << "欢迎进入 2048 小游戏" << std::endl;
  223.    
  224.     initMap();
  225.     printMap();
  226.     bool quit = false;
  227.     while (!quit) {
  228.         if (Move()) {
  229.             bool ret = generateRandomNumber();
  230.             quit = !ret;
  231.         }
  232.         printMap();
  233.     }
  234.     std::cout << "Game Over!" << std::endl;
  235. }
复制代码



小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 昨天 22:47 | 显示全部楼层
看起来GIF大小没弄好,就不弄了,自己下载看吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-14 04:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表