pyzyd 发表于 2025-10-13 22:46:38

2048游戏(Cpp版)

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

控制台版



应用程序:



#include <iostream>
#include <random>
#include <iomanip>
#include <conio.h>
#include <cstdlib>

// 定义数据
#define ROW 4
#define COL 4

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

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


// 定义地图
int map = { 0 };


void initMap();
bool generateRandomNumber();
bool isFull();
void printMap();
void moveLeft();
void moveRight();
void moveUp();
void moveDown();
bool Move();
void runGame();

int main() {
    system("chcp 65001");
    runGame();
    return 0;
}

/*
初始化地图
*/
void initMap() {
    for (int i = 0; i < ROW; i++) {
      for (int j = 0; j < COL; j++) {
            map = 0;
      }
    }
    generateRandomNumber();
}

/*
生成随机数
*/
bool generateRandomNumber() {
    int count = 0;
    std::uniform_int_distribution<> dis(0, ROW - 1);
    if (isFull()) {
      return false;
    }
    while (count < 2) {
      int row = dis(gen);
      int col = dis(gen);
      if (map == 0) {
            map = (dis(gen) == 1) ? 2 : 4;
            count++;
      }
    }
    return true;
}

/*
判断地图是否已满
*/
bool isFull() {
    int count = 0;
    for (int i = 0; i < ROW; i++) {
      for (int j = 0; j < COL; j++) {
            if (map == 0) {
                count++;
            }
      }
    }
    if (count < 2) {
      return true;
    }
    return false;
}

void printMap() {
    std::cout << "请用方向键(包含箭头和wasd)进行操作,点击q可以退出游戏......" << std::endl;
    std::cout << std::endl;
    std::cout << std::endl;
    for (int i = 0; i < ROW; i++) {
      for (int j = 0; j < COL; j++) {
            std::cout << std::setw(5) << map << " ";
      }
      std::cout << std::endl;
      std::cout << std::endl;
    }
}

void moveLeft() {
    for (int i = 0; i < ROW; i++) {
      for (int j = 0; j < COL - 1; j++) {
            if (map == 0) {
                int k = j + 1;
                while (k < COL && map == 0) k++;
                if (k == COL) break;
                map = map;
                map = 0;
            }
            if (map != 0) {
                int k = j + 1;
                while (k < COL && map == 0) k++;
                if (k < COL && map == map) {
                  map *= 2;
                  map = 0;
                }
            }
      }
    }
}

void moveRight() {
    for (int i = 0; i < ROW; i++) {
      for (int j = COL - 1; j > 0; j--) {
            if (map == 0) {
                int k = j - 1;
                while (k >= 0 && map == 0) k--;
                if (k < 0) break;
                map = map;
                map = 0;
            }
            if (map != 0) {
                int k = j - 1;
                while (k >= 0 && map == 0) k--;
                if (k >= 0 && map == map) {
                  map *= 2;
                  map = 0;
                }
            }
      }
    }
}

void moveUp() {
    for (int j = 0; j < COL; j++) {
      for (int i = 0; i < ROW - 1; i++) {
            if (map == 0) {
                int k = i + 1;
                while (k < ROW && map == 0) k++;
                if (k == ROW) break;
                map = map;
                map = 0;
            }
            if (map != 0) {
                int k = i + 1;
                while (k < ROW && map == 0) k++;
                if (k < ROW && map == map) {
                  map *= 2;
                  map = 0;
                }
            }
      }
    }
}

void moveDown() {
    for (int j = 0; j < COL; j++) {
      for (int i = ROW - 1; i > 0; i--) {
            if (map == 0) {
                int k = i - 1;
                while (k >= 0 && map == 0) k--;
                if (k < 0) break;
                map = map;
                map = 0;
            }
            if (map != 0) {
                int k = i - 1;
                while (k >= 0 && map == 0) k--;
                if (k >= 0 && map == map) {
                  map *= 2;
                  map = 0;
                }
            }
      }
    }
}

bool Move() {
    int ch = _getch();

    // 处理扩展按键(方向键)
    if (ch == 0 || ch == 224) {
      ch = _getch();
      switch (ch) {
      case LEFT:
            moveLeft();
            break;
      case RIGHT:
            moveRight();
            break;
      case UP:
            moveUp();
            break;
      case DOWN:
            moveDown();
            break;
      default:
            return false;// 其他扩展键
      }
    }
    // 处理普通方向键(WASD)和退出键
    else {
      switch (ch) {
      case 'w': case 'W':
            moveUp();
            break;
      case 's': case 'S':
            moveDown();
            break;
      case 'a': case 'A':
            moveLeft();
            break;
      case 'd': case 'D':
            moveRight();
            break;
      case 'q': case 'Q': case 27:// ESC键
            std::cout << "游戏退出!" << std::endl;
            exit(0);
      default:
            return false;// 其他按键(包括鼠标产生的字符)
      }
    }

    system("cls");
    return true;
}

void runGame()
{
    std::cout << "欢迎进入 2048 小游戏" << std::endl;
   
    initMap();
    printMap();
    bool quit = false;
    while (!quit) {
      if (Move()) {
            bool ret = generateRandomNumber();
            quit = !ret;
      }
      printMap();
    }
    std::cout << "Game Over!" << std::endl;
}




easyx 图形版

#define _CRT_SECURE_NO_WARNINGS
#define _CRT_NON_CONFORMING_SWPRINTFS

#include <iostream>
#include <random>
#include <iomanip>
#include <conio.h>
#include <cstdlib>
#include <wchar.h>
#include <easyx.h>

// 定义数据
#define ROW 4
#define COL 4
#define SIZE 100
#define INTERVAL 15


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

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

enum Color {
    zero = RGB(205, 193, 180),
    twoTo1 = RGB(238, 228, 218),
    twoTo2 = RGB(237, 224, 200),
    twoTo3 = RGB(242, 177, 121),
    twoTo4 = RGB(245, 149, 99),
    twoTo5 = RGB(246, 124, 95),
    twoTo6 = RGB(246, 94, 59),
    twoTo7 = RGB(237, 207, 114),
    twoTo8 = RGB(237, 204, 97),
    twoTo9 = RGB(237, 200, 80), // RGB(255, 0, 128),
    twoTo10 = RGB(237, 197, 63), // RGB(145, 0, 72),
    twoTo11 = RGB(237, 194, 46), // RGB(242, 17, 158),
    back = RGB(187, 173, 160),
};

Color colors = { zero, twoTo1, twoTo2, twoTo3, twoTo4, twoTo5, twoTo6, twoTo7, twoTo8, twoTo9, twoTo10, twoTo11, back };


// 定义地图
int map = { 0 };

POINT points;

void initMap();
bool generateRandomNumber();
bool isFull();
void printMap();
void moveLeft();
void moveRight();
void moveUp();
void moveDown();
bool Move();
void runGame();
void gameInit();
void gameDraw();

int main() {
    //system("chcp 65001");
      initgraph(COL * SIZE + (COL + 1) * INTERVAL, ROW * SIZE + (ROW + 1) * INTERVAL);
    setbkcolor(back);
    cleardevice();
    runGame();
    closegraph();
    return 0;
}

/*
初始化地图
*/
void initMap() {
    for (int i = 0; i < ROW; i++) {
      for (int j = 0; j < COL; j++) {
            map = 0;
      }
    }
    generateRandomNumber();
    gameInit();
}

/*
生成随机数
*/
bool generateRandomNumber() {
    int count = 0;
    std::uniform_int_distribution<> dis(0, ROW - 1);
    if (isFull()) {
      return false;
    }
    while (count < 2) {
      int row = dis(gen);
      int col = dis(gen);
      if (map == 0) {
            map = (dis(gen) == 1) ? 2 : 4;
            count++;
      }
    }
    return true;
}

/*
判断地图是否已满
*/
bool isFull() {
    int count = 0;
    for (int i = 0; i < ROW; i++) {
      for (int j = 0; j < COL; j++) {
            if (map == 0) {
                count++;
            }
      }
    }
    if (count < 2) {
      return true;
    }
    return false;
}

bool isWin() {
    for (int i = 0; i < ROW; i++) {
      for (int j = 0; j < COL; j++) {
            if (map == 2048) {
                return true;
            }
      }
    }
    return false;
}

void printMap() {
    std::cout << "请用方向键(包含箭头和wasd)进行操作,点击q可以退出游戏......" << std::endl;
    std::cout << std::endl;
    std::cout << std::endl;
    for (int i = 0; i < ROW; i++) {
      for (int j = 0; j < COL; j++) {
            std::cout << std::setw(5) << map << " ";
      }
      std::cout << std::endl;
      std::cout << std::endl;
    }
}

void moveLeft() {
    for (int i = 0; i < ROW; i++) {
      for (int j = 0; j < COL - 1; j++) {
            if (map == 0) {
                int k = j + 1;
                while (k < COL && map == 0) k++;
                if (k == COL) break;
                map = map;
                map = 0;
            }
            if (map != 0) {
                int k = j + 1;
                while (k < COL && map == 0) k++;
                if (k < COL && map == map) {
                  map *= 2;
                  map = 0;
                }
            }
      }
    }
}

void moveRight() {
    for (int i = 0; i < ROW; i++) {
      for (int j = COL - 1; j > 0; j--) {
            if (map == 0) {
                int k = j - 1;
                while (k >= 0 && map == 0) k--;
                if (k < 0) break;
                map = map;
                map = 0;
            }
            if (map != 0) {
                int k = j - 1;
                while (k >= 0 && map == 0) k--;
                if (k >= 0 && map == map) {
                  map *= 2;
                  map = 0;
                }
            }
      }
    }
}

void moveUp() {
    for (int j = 0; j < COL; j++) {
      for (int i = 0; i < ROW - 1; i++) {
            if (map == 0) {
                int k = i + 1;
                while (k < ROW && map == 0) k++;
                if (k == ROW) break;
                map = map;
                map = 0;
            }
            if (map != 0) {
                int k = i + 1;
                while (k < ROW && map == 0) k++;
                if (k < ROW && map == map) {
                  map *= 2;
                  map = 0;
                }
            }
      }
    }
}

void moveDown() {
    for (int j = 0; j < COL; j++) {
      for (int i = ROW - 1; i > 0; i--) {
            if (map == 0) {
                int k = i - 1;
                while (k >= 0 && map == 0) k--;
                if (k < 0) break;
                map = map;
                map = 0;
            }
            if (map != 0) {
                int k = i - 1;
                while (k >= 0 && map == 0) k--;
                if (k >= 0 && map == map) {
                  map *= 2;
                  map = 0;
                }
            }
      }
    }
}

bool Move() {
    ExMessage msg;

    // 等待键盘消息
    while (true) {
      if (peekmessage(&msg, EX_KEY)) {
            if (msg.message == WM_KEYDOWN) {
                switch (msg.vkcode) {
                case VK_UP:
                case 'W':
                  moveUp();
                  return true;
                case VK_DOWN:
                case 'S':
                  moveDown();
                  return true;
                case VK_LEFT:
                case 'A':
                  moveLeft();
                  return true;
                case VK_RIGHT:
                case 'D':
                  moveRight();
                  return true;
                case VK_ESCAPE:
                case 'Q':
                  outtextxy(100, 100, _T("游戏退出!"));
                  Sleep(1000);
                  closegraph();
                  exit(0);
                default:
                  return false;// 其他按键
                }
            }
      }
      Sleep(10);// 避免CPU占用过高
    }
}

void runGame()
{
    //std::cout << "欢迎进入 2048 小游戏" << std::endl;
   
    initMap();
    //printMap();
    gameDraw();
    bool quit = false;
    bool flag = false;
    while (!quit) {
      if (Move()) {
            if (isWin()) {
                flag = true;
                break;
            }
            bool ret = generateRandomNumber();
            quit = !ret;
      }
      //printMap();
      gameDraw();
    }
    //std::cout << "Game Over!" << std::endl;
    HWND hWnd = GetHWnd();
    if (flag) {
      MessageBox(hWnd, _T("恭喜你,成功通关!"), _T("游戏结束"), MB_OK);
    }
    else {
      MessageBox(hWnd, _T("游戏结束!没能成功通关呢。"), _T("游戏结束"), MB_OK);
    }
}

void gameInit()
{
    for (int i = 0; i < ROW; i++) {
      for (int j = 0; j < COL; j++) {
            points.x = j * SIZE + (j + 1) * INTERVAL;
            points.y = i * SIZE + (i + 1) * INTERVAL;
      }
    }
}

void gameDraw()
{
    for (int i = 0; i < ROW; i++) {
      for (int j = 0; j < COL; j++) {
            setfillcolor(colors]);
            solidrectangle(points.x, points.y,
                points.x + SIZE, points.y + SIZE);
            if (map != 0) {
                settextcolor(WHITE);
                wchar_t* str = new wchar_t;
                swprintf(str, L"%d", map);
                int hight = 50;
                settextstyle(hight, 0, L"楷体");
                setbkmode(TRANSPARENT);
                int tempw = SIZE / 2 - textwidth(str) / 2;
                int temph = SIZE / 2 - textheight(str) / 2;
                outtextxy(points.x + tempw, points.y + temph, str);
            }
      }
    }
}

应用程序:


友情赠送:





pyzyd 发表于 2025-10-13 22:47:18

看起来GIF大小没弄好,就不弄了,自己下载看吧

不二如是 发表于 2025-10-14 08:33:27

期待更多分享~
页: [1]
查看完整版本: 2048游戏(Cpp版)