当前位置: 首页 > article >正文

C++之2048(2.0版)

Hello大家好,你们的阳了个阳C++又回来啦!

不知道是不是还有人记得我两年前的这篇C++之2048的博客呢?当时的代码是我们的C++小盆友ta的主页提供的,最近刚好翻到,觉得还可以优化一下,于是呢就有了这篇博客。

那么话不多说,我们进入代码介绍:


代码介绍

这篇代码大体来说可以分为四个板块:

板块一

#include<bits/stdc++.h>
#include<windows.h>
#include<conio.h>
using namespace std;
char input;
int gamemap[10][10],gamemapb[10][10];
void green(){
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
}
void red(){
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
}
void cls(){
	system("cls");
}
void output(string s){
	for(int i=0;i<s.size();i++){
		cout<<s[i];
		if(s[i]=='\n') Sleep(150);
		else Sleep(25);
	}
	return;
}

这一部分主要就是一些准备工作,包括自定义颜色函数,自定义输出函数以及一些杂七杂八的没用的东西

板块二

void gamerule(){
	output("屏幕上会随机生成2的正整次方数\n\n可以向上下左右四个方向滑动屏幕\n\n相同的两个数碰到一起后会乘以2\n\n当出现1024时,通关成功\n\n当无法滑屏时,通关失败\n\n按任意键继续……\n\n");
	input=_getch();
	return;
}
void information(int maxnumber){
	cls();
	cout<<"目标:1024  当前最大值:"<<maxnumber<<"\n\n向上滑屏请按W\n\n向下滑屏请按S\n\n向左滑屏请按A\n\n向右滑屏请按D\n\n重新开始请按F\n\n"; 
	return;
}
void printmap(){
	for(int i=1;i<=4;i++){
		for(int j=1;j<=4;j++){
			if(gamemap[i][j]==0)
				green();
			else
				red();
			cout<<std::left<<setw(4)<<gamemap[i][j];			
		}
		cout<<"\n\n";
	}
	green();
	return;
}
void cleanmap(){
	for(int i=1;i<=4;i++)
		for(int j=1;j<=4;j++)
			gamemap[i][j]=0;
	return;
}
int judge(int maxnumber){
	for(int i=1;i<=4;i++)
		for(int j=1;j<=4;j++)
			maxnumber=max(maxnumber,gamemap[i][j]);
	return maxnumber;
}
void win(){
	cls();
	cout<<"\n\n恭喜你,通关成功!!!\n\n";
	exit(0);
}
void lose(){
	cls();
	red();
	cout<<"\n\n很遗憾,通关失败……\n\n";
	exit(0);
}

这一段也是准备工作,但是和前一板块相比关系稍微近了一点,包括游戏规则,基本信息,还有打印和重置地图等等功能

板块三

void randmap(){
	int j=rand()%3+1;
	j=pow(2,j);
	while(1){
		int x=rand()%4+1,y=rand()%4+1;
		if(gamemap[x][y]==0){
			gamemap[x][y]=j;
			return;
		}
	}
}
bool same(int a[10][10],int b[10][10]){
	for(int i=1;i<=4;i++)
		for(int j=1;j<=4;j++)
			if(a[i][j]!=b[i][j])
				return 0;
	return 1;
}
void copymap(){
	for(int i=1;i<=4;i++)
		for(int j=1;j<=4;j++)
			gamemapb[i][j]=gamemap[i][j];
	return;
}
void up(){
	for(int i=2;i<=4;i++){
		for(int j=1;j<=4;j++){
			int k=i;
			if(gamemapb[i][j]==0)
				continue;
			while(k>1){
				if(gamemapb[k-1][j]==0){
					swap(gamemapb[k-1][j],gamemapb[k][j]);
					k--;
					continue;
				}
				if(gamemapb[k-1][j]==gamemapb[k][j]){
					gamemapb[k-1][j]*=2;
					gamemapb[k][j]=0;
					break;
				}
				break;
			}
		}
	}
	return;
}
void down(){
	for(int i=3;i>=1;i--){
		for(int j=1;j<=4;j++){
			int k=i;
			if(gamemapb[i][j]==0)
				continue;
			while(k<4){
				if(gamemapb[k+1][j]==0){
					swap(gamemapb[k+1][j],gamemapb[k][j]);
					k++;
					continue;
				}
				if(gamemapb[k+1][j]==gamemapb[k][j]){
					gamemapb[k+1][j]*=2;
					gamemapb[k][j]=0;
					break;
				}
				break;
			}
		}
	}
	return;
}
void left(){
	for(int i=1;i<=4;i++){
		for(int j=2;j<=4;j++){
			int k=j;
			if(gamemapb[i][j]==0)
				continue;
			while(k>1){
				if(gamemapb[i][k-1]==0){
					swap(gamemapb[i][k-1],gamemapb[i][k]);
					k--;
					continue;
				}
				if(gamemapb[i][k-1]==gamemapb[i][k]){
					gamemapb[i][k-1]*=2;
					gamemapb[i][k]=0;
					break;
				}
				break;
			}
		}
	}
	return;
}
void right(){
	for(int i=1;i<=4;i++){
		for(int j=3;j>=1;j--){
			int k=j;
			if(gamemapb[i][j]==0)
				continue;
			while(k<4){
				if(gamemapb[i][k+1]==0){
					swap(gamemapb[i][k+1],gamemapb[i][k]);
					k++;
					continue;
				}
				if(gamemapb[i][k+1]==gamemapb[i][k]){
					gamemapb[i][k+1]*=2;
					gamemapb[i][k]=0;
					break;
				}
				break;
			}
		}
	}
	return;
}
void savemap(){
	for(int i=1;i<=4;i++)
		for(int j=1;j<=4;j++)
			gamemap[i][j]=gamemapb[i][j];
	return;
}
bool moveable(){
	copymap();
	up();
	if(!same(gamemap,gamemapb))
		return 1;
	down();
	if(!same(gamemap,gamemapb))
		return 1;
	left();
	if(!same(gamemap,gamemapb))
		return 1;
	right();
	if(!same(gamemap,gamemapb))
		return 1;
	return 0;
}
void gamestart(){
	int maxnumber=0;
	randmap();
	while(moveable()){
		cls();
		maxnumber=judge(maxnumber);
		if(maxnumber>=1024)
			win();
		information(maxnumber);
		printmap();
		cout<<"请输入指令:\n\n";
		input=_getch();
		if(input=='F'||input=='f'){
			cleanmap();
			gamestart();
		}
		copymap();
		if(input=='w'||input=='W')
			up();
		if(input=='s'||input=='S')
			down();
		if(input=='a'||input=='A')
			left();
		if(input=='d'||input=='D')
			right();
		if(same(gamemapb,gamemap))
			continue;
		savemap();
		randmap();
	}
	lose();
	return;
}

这一部分是游戏正正的核心,如随机生成数字,滑屏等等重要的函数基本上都包含在里面

板块四

void start(){
	output("欢迎来到2048小游戏\n\n");
	output("进入游戏请按1\n\n");
	output("阅读规则请按2\n\n");
	input=_getch();
	cls();
	if(input=='1')
		gamestart();
	else{
		gamerule();
		cls();
		start();
	}
}
int main(){
	srand(time(NULL));
	green();
	start();
	return 0;
}

最后是游戏启动函数和主函数,把它们单独分出一个版块纯粹是语法原因(绝对不是作者想水字数

完整代码

#include<bits/stdc++.h>
#include<windows.h>
#include<conio.h>
using namespace std;
char input;
int gamemap[10][10],gamemapb[10][10];
void green(){
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
}
void red(){
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
}
void cls(){
	system("cls");
}
void output(string s){
	for(int i=0;i<s.size();i++){
		cout<<s[i];
		if(s[i]=='\n') Sleep(150);
		else Sleep(25);
	}
	return;
}
void gamerule(){
	output("屏幕上会随机生成2的正整次方数\n\n可以向上下左右四个方向滑动屏幕\n\n相同的两个数碰到一起后会乘以2\n\n当出现1024时,通关成功\n\n当无法滑屏时,通关失败\n\n按任意键继续……\n\n");
	input=_getch();
	return;
}
void information(int maxnumber){
	cls();
	cout<<"目标:1024  当前最大值:"<<maxnumber<<"\n\n向上滑屏请按W\n\n向下滑屏请按S\n\n向左滑屏请按A\n\n向右滑屏请按D\n\n重新开始请按F\n\n"; 
	return;
}
void printmap(){
	for(int i=1;i<=4;i++){
		for(int j=1;j<=4;j++){
			if(gamemap[i][j]==0)
				green();
			else
				red();
			cout<<std::left<<setw(4)<<gamemap[i][j];			
		}
		cout<<"\n\n";
	}
	green();
	return;
}
void cleanmap(){
	for(int i=1;i<=4;i++)
		for(int j=1;j<=4;j++)
			gamemap[i][j]=0;
	return;
}
int judge(int maxnumber){
	for(int i=1;i<=4;i++)
		for(int j=1;j<=4;j++)
			maxnumber=max(maxnumber,gamemap[i][j]);
	return maxnumber;
}
void win(){
	cls();
	cout<<"\n\n恭喜你,通关成功!!!\n\n";
	exit(0);
}
void lose(){
	cls();
	red();
	cout<<"\n\n很遗憾,通关失败……\n\n";
	exit(0);
}
void randmap(){
	int j=rand()%3+1;
	j=pow(2,j);
	while(1){
		int x=rand()%4+1,y=rand()%4+1;
		if(gamemap[x][y]==0){
			gamemap[x][y]=j;
			return;
		}
	}
}
bool same(int a[10][10],int b[10][10]){
	for(int i=1;i<=4;i++)
		for(int j=1;j<=4;j++)
			if(a[i][j]!=b[i][j])
				return 0;
	return 1;
}
void copymap(){
	for(int i=1;i<=4;i++)
		for(int j=1;j<=4;j++)
			gamemapb[i][j]=gamemap[i][j];
	return;
}
void up(){
	for(int i=2;i<=4;i++){
		for(int j=1;j<=4;j++){
			int k=i;
			if(gamemapb[i][j]==0)
				continue;
			while(k>1){
				if(gamemapb[k-1][j]==0){
					swap(gamemapb[k-1][j],gamemapb[k][j]);
					k--;
					continue;
				}
				if(gamemapb[k-1][j]==gamemapb[k][j]){
					gamemapb[k-1][j]*=2;
					gamemapb[k][j]=0;
					break;
				}
				break;
			}
		}
	}
	return;
}
void down(){
	for(int i=3;i>=1;i--){
		for(int j=1;j<=4;j++){
			int k=i;
			if(gamemapb[i][j]==0)
				continue;
			while(k<4){
				if(gamemapb[k+1][j]==0){
					swap(gamemapb[k+1][j],gamemapb[k][j]);
					k++;
					continue;
				}
				if(gamemapb[k+1][j]==gamemapb[k][j]){
					gamemapb[k+1][j]*=2;
					gamemapb[k][j]=0;
					break;
				}
				break;
			}
		}
	}
	return;
}
void left(){
	for(int i=1;i<=4;i++){
		for(int j=2;j<=4;j++){
			int k=j;
			if(gamemapb[i][j]==0)
				continue;
			while(k>1){
				if(gamemapb[i][k-1]==0){
					swap(gamemapb[i][k-1],gamemapb[i][k]);
					k--;
					continue;
				}
				if(gamemapb[i][k-1]==gamemapb[i][k]){
					gamemapb[i][k-1]*=2;
					gamemapb[i][k]=0;
					break;
				}
				break;
			}
		}
	}
	return;
}
void right(){
	for(int i=1;i<=4;i++){
		for(int j=3;j>=1;j--){
			int k=j;
			if(gamemapb[i][j]==0)
				continue;
			while(k<4){
				if(gamemapb[i][k+1]==0){
					swap(gamemapb[i][k+1],gamemapb[i][k]);
					k++;
					continue;
				}
				if(gamemapb[i][k+1]==gamemapb[i][k]){
					gamemapb[i][k+1]*=2;
					gamemapb[i][k]=0;
					break;
				}
				break;
			}
		}
	}
	return;
}
void savemap(){
	for(int i=1;i<=4;i++)
		for(int j=1;j<=4;j++)
			gamemap[i][j]=gamemapb[i][j];
	return;
}
bool moveable(){
	copymap();
	up();
	if(!same(gamemap,gamemapb))
		return 1;
	down();
	if(!same(gamemap,gamemapb))
		return 1;
	left();
	if(!same(gamemap,gamemapb))
		return 1;
	right();
	if(!same(gamemap,gamemapb))
		return 1;
	return 0;
}
void gamestart(){
	int maxnumber=0;
	randmap();
	while(moveable()){
		cls();
		maxnumber=judge(maxnumber);
		if(maxnumber>=1024)
			win();
		information(maxnumber);
		printmap();
		cout<<"请输入指令:\n\n";
		input=_getch();
		if(input=='F'||input=='f'){
			cleanmap();
			gamestart();
		}
		copymap();
		if(input=='w'||input=='W')
			up();
		if(input=='s'||input=='S')
			down();
		if(input=='a'||input=='A')
			left();
		if(input=='d'||input=='D')
			right();
		if(same(gamemapb,gamemap))
			continue;
		savemap();
		randmap();
	}
	lose();
	return;
}
void start(){
	output("欢迎来到2048小游戏\n\n");
	output("进入游戏请按1\n\n");
	output("阅读规则请按2\n\n");
	input=_getch();
	cls();
	if(input=='1')
		gamestart();
	else{
		gamerule();
		cls();
		start();
	}
}
int main(){
	srand(time(NULL));
	green();
	start();
	return 0;
}

老规矩,如果喜欢这篇博客的话,请一键三连,关注我,看更多有趣的C++游戏代码,我们下期博客再见,BYEBYE!!!


http://www.kler.cn/a/419054.html

相关文章:

  • 深度学习基础2
  • jdk各个版本介绍
  • 分布式FastDFS存储的同步方式
  • 基于TensorFlow的手写体数字识别训练与测试
  • 使用 `aircrack-ng`扫描、获取握手包
  • 智能化Kubernetes管理:AI与ChatGPT提升运维效率的创新实践
  • go并发设计模式runner模式
  • 初级数据结构——二叉搜索树
  • 【Linux】MDNS:局域网域名解析
  • 网络安全之IP伪造
  • 【k8s】kubelet 的相关证书
  • java并发面试复习
  • MyBlog(五) -- 用户注册页面完善
  • 群控系统服务端开发模式-应用开发-短信工厂结构封装
  • Harmony NEXT-越过相机读写权限上传图片至项目云存储中
  • Solidity基础语法
  • 纯Go语言开发人脸检测、瞳孔/眼睛定位与面部特征检测插件-助力GoFly快速开发框架
  • js对于json的序列化、反序列化有哪几种方法
  • 计算机网络基础篇
  • idea 自动导包,并且禁止自动导 *(java.io.*)
  • 数据结构之堆:原理与实现
  • 《Python基础》之类的定义、封装、继承
  • ubuntu 安装docker-compose
  • PHP操作redis删除指定前缀的key值
  • Apache storm安装教程(单机版)
  • 简单图论农场派对