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

相关文章

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

python实现svg图片转换为png和gif

《python实现svg图片转换为png和gif》这篇文章主要为大家详细介绍了python如何实现将svg图片格式转换为png和gif,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录python实现svg图片转换为png和gifpython实现图片格式之间的相互转换延展:基于Py

Python利用ElementTree实现快速解析XML文件

《Python利用ElementTree实现快速解析XML文件》ElementTree是Python标准库的一部分,而且是Python标准库中用于解析和操作XML数据的模块,下面小编就来和大家详细讲讲... 目录一、XML文件解析到底有多重要二、ElementTree快速入门1. 加载XML的两种方式2.

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

Android实现在线预览office文档的示例详解

《Android实现在线预览office文档的示例详解》在移动端展示在线Office文档(如Word、Excel、PPT)是一项常见需求,这篇文章为大家重点介绍了两种方案的实现方法,希望对大家有一定的... 目录一、项目概述二、相关技术知识三、实现思路3.1 方案一:WebView + Office Onl

C# foreach 循环中获取索引的实现方式

《C#foreach循环中获取索引的实现方式》:本文主要介绍C#foreach循环中获取索引的实现方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、手动维护索引变量二、LINQ Select + 元组解构三、扩展方法封装索引四、使用 for 循环替代

Spring Security+JWT如何实现前后端分离权限控制

《SpringSecurity+JWT如何实现前后端分离权限控制》本篇将手把手教你用SpringSecurity+JWT搭建一套完整的登录认证与权限控制体系,具有很好的参考价值,希望对大家... 目录Spring Security+JWT实现前后端分离权限控制实战一、为什么要用 JWT?二、JWT 基本结构