C++自编2048

版权声明:本文为博主原创文章,转载请联系博主。 https://blog.csdn.net/everlasting_20141622/article/details/52549525

我无聊的时候玩2048时总是觉得自由度太低。。。

所以我就想要自己编一个。。。

然后就有了这个

应该是没有BUG了。。。至少我自己玩是没有的

我把我这个和网上的一些对比了一下。。。

貌似我的好点啊,可以记录最高分,还有彩色的块

不多说了。。。直接上代码

#include<cstdio> 
#include<iostream> 
#include<cmath> 
#include<cstring> 
#include<cstdlib> 
#include<vector> 
#include<queue> 
#include<list> 
#include<stack> 
#include<set> 
#include<map> 
#include<string> 
#include<algorithm> 
#include<functional> 
#include<bitset> 
#include<ctime> 
#include<stdio.h> 
#include<time.h> 
#include"iostream" 
#include"cstdio" 
#include"ctime" 
#include"algorithm" 
#include"string" 
#include"cstring" 
#include"map" 
#include"set" 
#include"stack" 
#include"bitset" 
#include"list" 
#include"queue" 
#include"vector" 
#include"cmath" 
#include"functional" 
#include"cstdlib" 
#include"bitset" 
#include"stdio.h" 
#include"time.h"
#include<windows.h>
#include<conio.h>
#include<dir.h>
#include<process.h>

#define up 1
#define down 2
#define left 3
#define right 4

using namespace std;

void color(int a){//改变字体颜色 
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
    /*
    字 
    1 	深蓝色
	2 	深绿色
	3 	深青色 
	4 	深红色
	5 	深粉色
	6	深黄色
 	7 	深白色
 	8 	灰色
	9 	浅蓝色
 	10 	浅绿色 
    11 	浅青色 
    12	浅红色 
    13	浅粉色 
    14	浅黄色 
    15	浅白色 
    
    
    背景
    1~15		黑色 
    16~31		深蓝色 
    32~47		深绿色
    48~63		深青色
    64~79		深红色
    80~95		深粉色
    96~111		深黄色
    112~127 	深白色
    128~143 	灰色
    144~159 	浅蓝色
    160~175 	浅绿色
    176~191 	浅青色
    192~207 	浅红色
    208~223 	浅粉色
    224~239 	浅黄色
    240~255 	浅白色
	*/
}

void set_color(int num){//初始化数字块的颜色,我只弄到了4096 
	if(num==0){
		color(0);
		return;
	}
	if(num==2){
		color(112);
		return;
	}
	if(num==4){
		color(96);
		return;
	}
	if(num==8){
		color(224);
		return;
	}
	if(num==16){
		color(80);
		return;
	}
	if(num==32){
		color(208);
		return;
	}
	if(num==64){
		color(64);
		return;
	}
	if(num==128){
		color(192);
		return;
	}
	if(num==256){
		color(16);
		return;
	}
	if(num==512){
		color(48);
		return;
	}
	if(num==1024){
		color(176);
		return;
	}
	if(num==2048){
		color(144);
		return;
	}
	if(num==4096){
		color(160);
		return;
	}
}

void del(int num){//退格(这个非常好用) 
	for(int i=0; i<num; i++){
		printf("\b \b");
	}
}

struct node{//用来保存最高分 
	int val;
	string name;
}high[3];

int edge=4;//边长 
int game[110][110];//用来保存游戏状态的 
int x=1,y=1;//生成新的数的位置 
int num=0,score=0;//步数与分数 
bool f=true;//是否刷新 

void print_screen(){//输出此时状态 
	system("cls");
	color(8);
	printf("┏");
	for(int i=1; i<=edge; i++){
		printf("━━━┳");
	}
	del(2);
	printf("┓\n");
	for(int i=1; i<=edge; i++){
		printf("┃");
		for(int j=1; j<=edge; j++){
			set_color(game[i][j]);
			printf("      ");
			color(8);
			printf("┃");
		}
		printf("\n");
		printf("┃");
		for(int j=1; j<=edge; j++){
			set_color(game[i][j]);
			if(game[i][j]!=0)printf("% 5d ",game[i][j]);
			else printf("      ");
			color(8);
			printf("┃");
		}
		printf("\n");
		printf("┃");
		for(int j=1; j<=edge; j++){
			set_color(game[i][j]);
			printf("      ");
			color(8);
			printf("┃");
		}
		printf("\n");
		if(i!=edge){
			printf("┣");
			for(int j=1; j<=edge; j++){
				printf("━━━╋");
			}
			del(2);
			printf("┫\n");
		}
	}
	printf("┗");
	for(int i=1; i<=edge; i++){
		printf("━━━┻");
	}
	del(2);
	printf("┛\n");
	printf("步数:%d\n",num);
	printf("得分:%d\n",score);
}

void randxy(){//随机生成一个新的数字2或4 
	do{
		x=rand()%edge+1;
		y=rand()%edge+1;
	}while(game[x][y]!=0);
	int num=rand()%10;
	if(num>=2)game[x][y]=2;
	else game[x][y]=4;
}

bool check(){//判断是否死亡 
	for(int i=1; i<=edge; i++){
		for(int j=1; j<=edge; j++){
			if(game[i][j]==0){
				return true;
			}
		}
	}
	for(int i=1; i<=edge; i++){
		for(int j=1; j<=edge; j++){
			if(i-1>=1 && game[i-1][j]==game[i][j])return true;
			if(j-1>=1 && game[i][j-1]==game[i][j])return true;
			if(i+1<=edge && game[i+1][j]==game[i][j])return true;
			if(j+1<=edge && game[i][j+1]==game[i][j])return true;
		}
	}
	
	return false;
}

bool check_move(int num){//判断是否可以移动,决定是否刷新 
	vector<int>v;
	bool f1=false;
	if(num==up){
		for(int j=1; j<=edge; j++){
			f1=false;
			for(int i=1; i<=edge; i++){
				if(game[i][j]!=0 && f1==true)return true;
				if(game[i][j]!=0)v.push_back(game[i][j]);
				else f1=true;
			}
			for(int i=0; i<v.size(); i++){
				if(i+1<v.size() && v[i]==v[i+1]){
					return true;
				}
			}
			v.clear();
		}
	}
	if(num==down){
		for(int j=1; j<=edge; j++){
			f1=false;
			for(int i=edge; i>=1; i--){
				if(game[i][j]!=0 && f1==true)return true;
				if(game[i][j]!=0)v.push_back(game[i][j]);
				else f1=true;
			}
			for(int i=0; i<v.size(); i++){
				if(i+1<v.size() && v[i]==v[i+1]){
					return true;
				}
			}
			v.clear();
		}
	}
	if(num==left){
		for(int i=1; i<=edge; i++){
			f1=false;
			for(int j=1; j<=edge; j++){
				if(game[i][j]!=0 && f1==true)return true;
				if(game[i][j]!=0)v.push_back(game[i][j]);
				else f1=true;
			}
			for(int j=0; j<v.size(); j++){
				if(j+1<v.size() && v[j]==v[j+1]){
					return true;
				}
			}
			v.clear();
		}
	}
	if(num==right){
		for(int i=1; i<=edge; i++){
			f1=false;
			for(int j=edge; j>=1; j--){
				if(game[i][j]!=0 && f1==true)return true;
				if(game[i][j]!=0)v.push_back(game[i][j]);
				else f1=true;
			}
			for(int j=0; j<v.size(); j++){
				if(j+1<v.size() && v[j]==v[j+1]){
					return true;
				}
			}
			v.clear();
		}
	}
	return false;
}

void Merge(int num){//移动后合并 
	vector<int>v;
	if(num==up){
		for(int j=1; j<=edge; j++){
			for(int i=1; i<=edge; i++){
				if(game[i][j]!=0)v.push_back(game[i][j]);
				game[i][j]=0;
			}
			for(int i=0; i<v.size(); i++){
				if(i+1<v.size() && v[i]==v[i+1]){
					v[i]+=v[i];
					f=true;
					score+=v[i];
					for(int k=i+1; k<v.size(); k++){
						if(k+1<v.size()){
							v[k]=v[k+1];
						}
					}
					v.pop_back();
				}
			}
			for(int i=1; i<=v.size(); i++){
				game[i][j]=v[i-1];
			}
			v.clear();
		}
	}
	if(num==down){
		for(int j=1; j<=edge; j++){
			for(int i=edge; i>=1; i--){
				if(game[i][j]!=0)v.push_back(game[i][j]);
				game[i][j]=0;
			}
			for(int i=0; i<v.size(); i++){
				if(i+1<v.size() && v[i]==v[i+1]){
					v[i]+=v[i];
					f=true;
					score+=v[i];
					for(int k=i+1; k<v.size(); k++){
						if(k+1<v.size()){
							v[k]=v[k+1];
						}
					}
					v.pop_back();
				}
			}
			for(int i=edge,k=0; k<v.size(); i--,k++){
				game[i][j]=v[k];
			}
			v.clear();
		}
	}
	if(num==left){
		for(int i=1; i<=edge; i++){
			for(int j=1; j<=edge; j++){
				if(game[i][j]!=0)v.push_back(game[i][j]);
				game[i][j]=0;
			}
			for(int j=0; j<v.size(); j++){
				if(j+1<v.size() && v[j]==v[j+1]){
					v[j]+=v[j];
					f=true;
					score+=v[j];
					for(int k=j+1; k<v.size(); k++){
						if(k+1<v.size()){
							v[k]=v[k+1];
						}
					}
					v.pop_back();
				}
			}
			for(int j=1,k=0; k<v.size(); j++,k++){
				game[i][j]=v[k];
			}
			v.clear();
		}
	}
	if(num==right){
		for(int i=1; i<=edge; i++){
			for(int j=edge; j>=1; j--){
				if(game[i][j]!=0)v.push_back(game[i][j]);
				game[i][j]=0;
			}
			for(int j=0; j<v.size(); j++){
				if(j+1<v.size() && v[j]==v[j+1]){
					v[j]+=v[j];
					f=true;
					score+=v[j];
					for(int k=j+1; k<v.size(); k++){
						if(k+1<v.size()){
							v[k]=v[k+1];
						}
					}
					v.pop_back();
				}
			}
			for(int j=edge,k=0; k<v.size(); j--,k++){
				game[i][j]=v[k];
			}
			v.clear();
		}
	}
}

void set_edge(){//选择边长 
	char c;
	system("cls");
	printf("请选择边长:\n");
	printf("1.4*4\n");
	printf("2.5*5\n");
	printf("3.6*6\n");
	while(1){
		c=getch();
		if(c=='1'){
			edge=4;
			break;
		}
		if(c=='2'){
			edge=5;
			break;
		}
		if(c=='3'){
			edge=6;
			break;
		}
	}
}

void high_score(){//显示最高分 
	system("cls");
	color(6);
	printf("4*4\n");
	printf("最厉害的人:");
	if(high[0].val)cout<<high[0].name<<endl;
	else cout<<"无"<<endl; 
	printf("获得的分数:%d\n",high[0].val);
	printf("\n");
	
	color(9);
	printf("5*5\n");
	printf("最厉害的人:");
	if(high[1].val)cout<<high[1].name<<endl;
	else cout<<"无"<<endl; 
	printf("获得的分数:%d\n",high[1].val);
	printf("\n");
	
	color(10);
	printf("6*6\n");
	printf("最厉害的人:");
	if(high[2].val)cout<<high[2].name<<endl;
	else cout<<"无"<<endl; 
	printf("获得的分数:%d\n",high[2].val);
	printf("\n");
	system("pause");
}

void start(){//游戏开始界面 
	char c;
	kaishi:
	system("cls");
	color(14);
	printf("欢迎进入无聊的2048\n");
	color(10);
	printf("designed by ");
	color(9);
	printf("everlasting\n");
	color(14);
	printf("\n");
	color(11);
	printf("\n");
	printf("1.开始游戏\n");
	printf("2.查看高分榜\n");
	printf("0.退出游戏\n");
	while(1){
		c=getch();
		if(c=='1'){
			break;
		}
		if(c=='2'){
			high_score();
			goto kaishi;
		}
		if(c=='0'){
			exit(0);
		}
	}
}

string finding="C:\\Program Files\\2048.high_score";//最高分的文档存储位置 
WIN32_FIND_DATA file; 

void dead(){//死后记录下成绩,看是否是最高分 
	system("cls");
	printf("您最后的得分为:%d\n",score);
	printf("请留下您的昵称:");
	string s;
	cin>>s;
	if(score>=high[edge-4].val){
		high[edge-4].name=s;
		high[edge-4].val=score;
	}
	freopen(finding.c_str(),"w",stdout);
	for(int i=0;i<3; i++){
		if(high[i].val){
			cout<<1<<endl;
			cout<<high[i].name<<' '<<high[i].val<<endl;
		}
		else cout<<0<<endl;
	}
}

int main(){
	SetConsoleTitle("2048 v2.0 --everlasting");
	mkdir("C:\\Program Files (x64)");
	SetFileAttributes("C:\\Program Files (x64)",FILE_ATTRIBUTE_HIDDEN);
	if(FindFirstFile(finding.c_str(),&file)!=INVALID_HANDLE_VALUE){//如果存在,读入最高分 
		freopen(finding.c_str(),"r",stdin);
		for(int i=0; i<3; i++){
			int a;
			cin>>a;
			high[i].val=0;
			if(a==1)cin>>high[i].name>>high[i].val;
		}
		fclose(stdin);
		freopen("CON","r",stdin);
	}
	srand(time(NULL));
	memset(game,0,sizeof(game));
	char c;
	start();
	set_edge();
	while(check()){
		if(f==true){
			randxy();
			print_screen();
			num++;
		}
		f=false; 
		c=getch();
		if(c=='H'){
			f=check_move(up);
			Merge(up);
		}
		if(c=='P'){
			f=check_move(down);
			Merge(down);
		}
		if(c=='K'){
			f=check_move(left);
			Merge(left);
		}
		if(c=='M'){
			f=check_move(right);
			Merge(right);
		}
	}
	dead();
	
	return 0;
} 
阅读更多

没有更多推荐了,返回首页