C++2048游戏

2024-03-27 20:08
文章标签 c++ 游戏 2048

本文主要是介绍C++2048游戏,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近听说2048游戏挺好玩就上网找个玩,结果没有一个完整的所以我只好自己写一个了。
源代码:

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
#include<time.h>int null_count();//统计还有几个空格
void start_game();//开始游戏
void reset_game();//重置游戏,不清空记录
void move_left();//向左移动
void move_right();//向右移动
void move_up();//向上移动
void move_down();//向下移动
void refresh_show();//刷新显示屏
void add_rand_num();//添加随机数
void check_if_over();//检查游戏是否结束int board[4][4];
int score = 0;
int best = 0;
int if_need_add_num;
int if_game_over;
int i;
int j;
int k;int main() {start_game();
}void setColor(unsigned short ForeColor = 7, unsigned short BackGroundColor = 0)
{HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleTextAttribute(handle, ForeColor + BackGroundColor * 0x10);
}void start_game() {reset_game();char fr;while (1) {fr = _getch();//从键盘读数if (if_game_over) {if (fr == 'y' || fr == 'Y') {reset_game();continue;}else if (fr == 'n' || fr == 'N') {return;}else continue;}if_need_add_num = 0;switch (fr) {case 'a':case 'A':move_left();break;case 'd':case 'D':move_right();break;case 'w':case 'W':move_up();break;case 's':case 'S':move_down();break;}if (score > best) {best = score;}if (if_need_add_num) {add_rand_num();refresh_show();}}
}int null_count() {int n = 0;for (i = 0; i < 4; i++) {for (j = 0; j < 4; j++) {if (board[i][j] == 0) {n++;}}}return n;
}void reset_game() {score = 0;if_need_add_num = 1;if_game_over = 0;srand(time(0));int n = rand() % 16;for (i = 0; i < 4; i++) {for (j = 0; j < 4; j++) {if (n == 0) {int k = rand() % 3;if (k == 0 || k == 1) {board[i][j] = 2;}else {board[i][j] = 4;}n--;}else {board[i][j] = 0;n--;}}}add_rand_num();system("cls");refresh_show();
}void move_left() {for (i = 0; i < 4; i++) {for (j = 1, k = 0; j < 4; j++) {if (board[i][j] > 0) {if (board[i][k] == board[i][j]) {board[i][k] *= 2;k++;score = score + 2 * board[i][j];board[i][j] = 0;if_need_add_num = 1;}else if (board[i][k] == 0) {board[i][k] = board[i][j];board[i][j] = 0;if_need_add_num = 1;}else {board[i][k + 1] = board[i][j];if ((k + 1) != j) {board[i][j] = 0;if_need_add_num = 1;}k++;}}}}
}void move_right() {for (i = 0; i < 4; i++) {for (j = 2, k = 3; j >= 0; j--) {if (board[i][j] > 0) {if (board[i][k] == board[i][j]) {board[i][k] *= 2;k--;score = score + 2 * board[i][j];board[i][j] = 0;if_need_add_num = 1;}else if (board[i][k] == 0) {board[i][k] = board[i][j];board[i][j] = 0;if_need_add_num = 1;}else {board[i][k - 1] = board[i][j];if ((k - 1) != j) {board[i][j] = 0;if_need_add_num = 1;}k--;}}}}
}void move_up() {for (i = 0; i < 4; i++) {for (j = 1, k = 0; j < 4; j++) {if (board[j][i] > 0) {if (board[k][i] == board[j][i]) {board[k][i] *= 2;k++;score = score + 2 * board[j][i];board[j][i] = 0;if_need_add_num = 1;}else if (board[k][i] == 0) {board[k][i] = board[j][i];board[j][i] = 0;if_need_add_num = 1;}else {board[k + 1][i] = board[j][i];if ((k + 1) != j) {board[j][i] = 0;if_need_add_num = 1;}k++;}}}}
}void move_down() {for (i = 0; i < 4; i++) {for (j = 2, k = 3; j >= 0; j--) {if (board[j][i] > 0) {if (board[k][i] == board[j][i]) {board[k][i] *= 2;k--;score = score + 2 * board[j][i];board[j][i] = 0;if_need_add_num = 1;}else if (board[k][i] == 0) {board[k][i] = board[j][i];board[j][i] = 0;if_need_add_num = 1;}else {board[k - 1][i] = board[j][i];if ((k - 1) != j) {board[j][i] = 0;if_need_add_num = 1;}k--;}}}}
}void refresh_show() {COORD pos = { 0, 0 };SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);printf("GAME: 2048     SCORE: %6d    BEST: %6d\n", score, best);printf("*************************************************************\n\n");printf("       ┌───┬───┬───┬───┐\n");for (int i = 0; i < 4; i++){printf("       │");for (int j = 0; j < 4; j++) {if (board[i][j] != 0){if (board[i][j] < 10){if (board[i][j] == 2){setColor(14, 0);}else if (board[i][j] == 4){setColor(6, 0);}else if (board[i][j] == 8){setColor(12, 0);}printf("  %d", board[i][j]);setColor(7, 0);printf("   │");}else if (board[i][j] < 100){if (board[i][j] == 16){setColor(4, 0);}else if (board[i][j] == 32){setColor(10, 0);}else if (board[i][j] == 64){setColor(2, 0);}printf("  %d", board[i][j]);setColor(7, 0);printf("  │");}else if (board[i][j] < 1000){if (board[i][j] == 128){setColor(9, 0);}else if (board[i][j] == 256){setColor(1, 0);}else if (board[i][j] == 512){setColor(13, 0);}printf("  %d", board[i][j]);setColor(7, 0);printf(" │");}else if (board[i][j] < 10000){if (board[i][j] == 1024){setColor(5, 0);}else{setColor(15, 0);}printf(" %4d", board[i][j]);setColor(7, 0);printf(" │");}else{int n = board[i][j];for (int k = 1; k < 30; k++){n /= 2;if (n == 1){setColor(7, 0);printf("2^%2d |", k);break;}}}}else{setColor(0, 0);printf("     ");setColor(7, 0);printf(" │");}}setColor(7, 0);if (i <= 2){printf("\n       ├───┼───┼───┼───┤\n");}else printf("\n       └───┴───┴───┴───┘\n\n");}printf("*************************************************************\n\n");printf("w↑ ↓s  a←  →d    输入方向键后请按回车读入:  ");if (null_count() == 0) {check_if_over();if (if_game_over) {printf("\nGAME OVER,TRY AGAIN?[Y/N]:");}}
}void add_rand_num() {srand(time(0));int n = rand() % null_count();for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {if (board[i][j] == 0) {if (n != 0) {n--;}else {int k = rand() % 3;if (k == 0 || k == 1) {board[i][j] = 2;return;}else {board[i][j] = 4;return;}}}}}
}void check_if_over() {for (int i = 0; i < 4; i++) {for (int j = 0; j < 3; j++) {if (board[i][j] == board[i][j + 1] || board[j][i] == board[j + 1][i]) {if_game_over = 0;return;}}}if_game_over = 1;
}

以上则是代码,制作不易请勿乱喷。

这篇关于C++2048游戏的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/853247

相关文章

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现

国产游戏崛起:技术革新与文化自信的双重推动

近年来,国产游戏行业发展迅猛,技术水平和作品质量均得到了显著提升。特别是以《黑神话:悟空》为代表的一系列优秀作品,成功打破了过去中国游戏市场以手游和网游为主的局限,向全球玩家展示了中国在单机游戏领域的实力与潜力。随着中国开发者在画面渲染、物理引擎、AI 技术和服务器架构等方面取得了显著进展,国产游戏正逐步赢得国际市场的认可。然而,面对全球游戏行业的激烈竞争,国产游戏技术依然面临诸多挑战,未来的

c++的初始化列表与const成员

初始化列表与const成员 const成员 使用const修饰的类、结构、联合的成员变量,在类对象创建完成前一定要初始化。 不能在构造函数中初始化const成员,因为执行构造函数时,类对象已经创建完成,只有类对象创建完成才能调用成员函数,构造函数虽然特殊但也是成员函数。 在定义const成员时进行初始化,该语法只有在C11语法标准下才支持。 初始化列表 在构造函数小括号后面,主要用于给