2048 控制台版(c实现)

2024-08-31 01:48
文章标签 实现 控制台 2048

本文主要是介绍2048 控制台版(c实现),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这是效果图

用c++写的,其实就是用了c++的输入输出,剩下全是C的内容

代码中有详解,很简单,欢迎借鉴和交流

 

#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include <conio.h>   //为了读取方向键
#include <iomanip>	//设置控制台填充字符等
using namespace std;
int score = 0;
int map[4][4];    //棋盘void showMap()    //显示棋盘
{cout << setw(46) << "2048 by DoubleCake" << endl;cout << setw(50) << " |-----------------------|" << endl;for (int i = 0; i <= 3; i++){cout << setw(24) << "";for (int j = 0; j <= 3; j++){if (map[i][j] == 0)cout << setw(2) << "|" << setw(4) << " ";elsecout << setw(2) << "|" << setw(4) << map[i][j];if (j == 3){cout << setw(2) << "|" << endl;cout << setw(50) << " |-----------------------|" << endl;}}}
}void randNum()	//从随机位置产生数
{int m = rand() % 4;int n = rand() % 4;while (map[m][n]){m = rand() % 4;n = rand() % 4;}map[m][n] = 2;
}
void startGame() //开始游戏
{memset(map, 0, sizeof(map));randNum();showMap();
}
int moveUp()	//上移
{int i, j;int res = 0;//用来记录是否发生移动for (j = 0; j < 4; j++){//先补一次空位for (i = 1; i < 4; i++){if (map[i][j] && !map[i - 1][j]){map[i - 1][j] = map[i][j];map[i][j] = 0;//把空位补到底if (i > 1)i -= 2;res = 1;}}//从根部开始,相同的合并for (i = 1; i < 4; i++){if (map[i][j] && map[i][j] == map[i - 1][j]){map[i - 1][j] *= 2;score += map[i][j];map[i][j] = 0;res = 1;}}//再补一次空位for (i = 1; i < 4; i++){if (map[i][j] && !map[i - 1][j]){map[i - 1][j] = map[i][j];map[i][j] = 0;//把空位补到底if (i > 1)i -= 2;}}}return res;
}int moveDown()	//下移
{int i, j;int res = 0;for (j = 0; j < 4; j++){for (i = 2; i >= 0; i--){if (map[i][j] && !map[i + 1][j]){map[i + 1][j] = map[i][j];map[i][j] = 0;if (i < 2)i += 2;res = 1;}}for (i = 2; i >= 0; i--){if (map[i][j] && map[i][j] == map[i + 1][j]){map[i + 1][j] *= 2;score += map[i][j];map[i][j] = 0;res = 1;}}for (i = 2; i >= 0; i--){if (map[i][j] && !map[i + 1][j]){map[i + 1][j] = map[i][j];map[i][j] = 0;if (i < 2)i += 2;}}}return res;
}int moveLeft()
{int i, j;int res = 0;for (i = 0; i < 4; i++){for (j = 1; j < 4; j++){if (map[i][j] && !map[i][j - 1]){map[i][j - 1] = map[i][j];map[i][j] = 0;if (j > 1)j -= 2;res = 1;}}for (j = 1; j < 4; j++){if (map[i][j] && map[i][j] == map[i][j - 1]){map[i][j - 1] *= 2;score += map[i][j];map[i][j] = 0;res = 1;}}for (j = 1; j < 4; j++){if (map[i][j] && !map[i][j - 1]){map[i][j - 1] = map[i][j];map[i][j] = 0;if (j > 1)j -= 2;}}}return res;
}int moveRight()
{int i, j;int res = 0;for (i = 0; i < 4; i++){for (j = 2; j >= 0; j--){if (map[i][j] && !map[i][j + 1]){map[i][j + 1] = map[i][j];map[i][j] = 0;if (j < 2)j += 2;res = 1;}}for (j = 2; j >= 0; j--){if (map[i][j] && map[i][j] == map[i][j + 1]){map[i][j + 1] *= 2;score += map[i][j];map[i][j] = 0;res = 1;}}for (j = 2; j >= 0; j--){if (map[i][j] && !map[i][j + 1]){map[i][j + 1] = map[i][j];map[i][j] = 0;if (j < 2)j += 2;}}}return res;
}int maxNum()  //棋盘最大数
{int max = map[0][0];for (int i = 0; i <= 3; i++)for (int j = 0; j <= 3; j++)if (map[i][j]>max)max = map[i][j];return max;
}
int Win()    //判断是否胜利
{int flag = 0;if (maxNum() == 2048){cout << setw(45) << "You Win!" << endl;flag = 1;}return flag;
}
int GameOver()       //判断是否游戏结束
{int flag = 1;int i, j;//如果有空位就可以继续for (i = 0; i < 4; i++)for (j = 0; j < 4; j++)if (!map[i][j])flag = 0;//如果没有空位但是有相邻相同的数也可以继续if (flag == 1){for (i = 0; i < 4; i++){for (j = 0; j < 4; j++){if (i != 0 && map[i][j] == map[i - 1][j])flag = 0;if (i != 3 && map[i][j] == map[i + 1][j])flag = 0;if (j != 0 && map[i][j] == map[i][j - 1])flag = 0;if (j != 3 && map[i][j] == map[i][j + 1])flag = 0;}}}if (flag == 1)cout << setw(43) << "Game Over!" << endl;return flag;
}
void keydown() //读取方向
{int ch = _getch();srand((unsigned)time(NULL));switch (ch){case 72:	// topif (moveUp()){randNum();system("cls");showMap();} break;case 75:	 // leftif (moveLeft()){randNum();system("cls");showMap();} break;case 77:	// rightif (moveRight()){randNum();system("cls");showMap();} break;case 80:	// downif (moveDown()){randNum();system("cls");showMap();} break;default:break;}
}
int main() //主函数
{system("color f9");int makesure = 1;	//游戏结束后是否继续游戏while (makesure){system("cls");startGame();while (Win() + GameOver() == 0){keydown();}cout << setw(43) << "你的最后成绩为:" << score << endl;cout << setw(60) << "若要重新开始游戏请输入1,若要结束请输入0。" << endl;cin >> makesure;while (makesure != 1 && makesure != 0){cout << "输入不正确,请重新输入!" << endl;cin >> makesure;}}cout << "再见!" << endl;system("pause");return 0;
}

 

 

这篇关于2048 控制台版(c实现)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依

利用python实现对excel文件进行加密

《利用python实现对excel文件进行加密》由于文件内容的私密性,需要对Excel文件进行加密,保护文件以免给第三方看到,本文将以Python语言为例,和大家讲讲如何对Excel文件进行加密,感兴... 目录前言方法一:使用pywin32库(仅限Windows)方法二:使用msoffcrypto-too