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++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c

C++归并排序代码实现示例代码

《C++归并排序代码实现示例代码》归并排序将待排序数组分成两个子数组,分别对这两个子数组进行排序,然后将排序好的子数组合并,得到排序后的数组,:本文主要介绍C++归并排序代码实现的相关资料,需要的... 目录1 算法核心思想2 代码实现3 算法时间复杂度1 算法核心思想归并排序是一种高效的排序方式,需要用

Python38个游戏开发库整理汇总

《Python38个游戏开发库整理汇总》文章介绍了多种Python游戏开发库,涵盖2D/3D游戏开发、多人游戏框架及视觉小说引擎,适合不同需求的开发者入门,强调跨平台支持与易用性,并鼓励读者交流反馈以... 目录PyGameCocos2dPySoyPyOgrepygletPanda3DBlenderFife

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符