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);
}
}
}
}
应用程序:
友情赠送:
看起来GIF大小没弄好,就不弄了,自己下载看吧 期待更多分享~
页:
[1]