C语言设计的简单2048小游戏

//***************************************************************************//
//**************************刚学代码的小白************************************//
//想必大家小时候或者现在都玩过2048这款小游戏
//在此我用从学习c语言到现在所学知识简单完成此游戏
//大概思路:
//			1、创建一个菜单函数,在里面写入要执行的指令
//			2、通过一个二维数组来实现界面
//			3、通过合并相同值来实现上下左右移动
//			4、最后用文件操作来保存游戏和读档

//***************************************************************************//
#include<stdio.h>
#include<getch.h>
#include<stdbool.h>
#include<time.h>
#include<stdlib.h>

//创建一个二维数组
int arr[4][4];

//bool类型定义一个标志位来判断是否移动
bool IS_MOVE_MERGE = true;

//显示界面
void display(){
	system("clear");	//清空屏幕
	for(int i=0;i<4;i++){
		printf("---------------------\n");
		for(int j=0;j<4;j++){
			if(0 == arr[i][j]){
			printf("|    ",arr[i][j]);
			}else
			printf("|%4d",arr[i][j]);
		}
		printf("|\n");
	}
		printf("---------------------");
}

void clear()
{
	for(int i=0;i<4;i++)
	{
		for(int j=0;j<4;j++)
		{
			arr[i][j] == 0;
		}
	}
}

//判断是否满屏
bool is_null(void){
	for(int i=0;i<4;i++){
		for(int j=0;j<4;j++){
			if(0 == arr[i][j]){
				return true;	
			}	
		}	
	}	
	return false;
}
//创建一个数
void creat_num(){
	while(is_null() && IS_MOVE_MERGE){
		int x = rand()%4; //产生0-3的随机数
		int y = rand()%4; //产生0-3的随机数
		if(arr[x][y] == 0){
			arr[x][y] = 2;
			break;
		}
	}
}
//up
void up(){
	for(int j=0;j<4;j++){
		int end = 0;
		for(int i=1;i<4;i++){
			for(int m=i;m>end && arr[m][j];m--){
				if(arr[m][j] == arr[m-1][j]){
					arr[m-1][j] *= 2;
					arr[m][j] = 0;
					end = m;
					IS_MOVE_MERGE = true;
				}
				else if(0 == arr[m-1][j]){
					arr[m-1][j] = arr[m][j];
					arr[m][j] = 0;
					IS_MOVE_MERGE = true;
			} 
		}	
	}	
}
}
//down
void down(){
	for(int j=0;j<4;j++){
		int end = 3;
		for(int i=2;i>=0;i--){
			for(int m=i;m<end && arr[m][j];m++){
				if(arr[m][j] == arr[m+1][j]){
					arr[m+1][j] *= 2;
					arr[m][j] = 0;
					end = m;
					IS_MOVE_MERGE = true;
				}
				else if(0 == arr[m+1][j]){
					arr[m+1][j] = arr[m][j];
					arr[m][j] = 0;
					IS_MOVE_MERGE = true;
			} 
		}	
	}	
}
}
//right
void right(){
	for(int i=0;i<4;i++){
		int end = 3;
		for(int j=2;j>=0;j--){
			for(int m=j;m<end && arr[i][m];m++){
				if(arr[i][m] == arr[i][m+1]){
					arr[i][m+1] *= 2;
					arr[i][m] = 0;
					end = m;
					IS_MOVE_MERGE = true;
				}
				else if(0 == arr[i][m+1]){
					arr[i][m+1] = arr[i][m];
					arr[i][m] = 0;
					IS_MOVE_MERGE = true;
			} 
		}	
	}	
}
}
//left
void left()
{
	for(int i=0;i<4;i++)
	{
		int end = 0;
		for(int j=1;j<4;j++)
		{
			for(int m=j;m>end && arr[i][m];m--)
			{
				if(arr[i][m] == arr[i][m-1])
				{
					arr[i][m-1] *= 2;
					arr[i][m] = 0;
					end = m;
					IS_MOVE_MERGE = true;
				}
				else if(0 == arr[i][m-1])
				{
					arr[i][m-1] = arr[i][m];
					arr[i][m] = 0;
					IS_MOVE_MERGE = true;
				} 
			}	
		}	
	}
}

//存档操作
void save()
{
	FILE *fwp = fopen("2048.txt","w");
	fwrite(arr,sizeof(int),16,fwp);
	printf("存档成功...");
	fclose(fwp);
}

//读档操作
void load()
{
	FILE *frp = fopen("2048.txt","r");
	if(frp == NULL)
	{
		printf("没有存档,请开始游戏...\n");
		return;
	}
	IS_MOVE_MERGE = false;
	fread(arr,sizeof(int),16,frp);
	fclose(frp);
}

//判断是否还能继续
bool is_over(void){
	if(is_null()){
		return false;
	}
	for(int x=0;x<4;x++){
		for(int y=0;y<3;y++){
			if(arr[x][y] == arr[x][y+1]){
				return false;	
			}	
		}	
	}
	for(int x=0;x<3;x++){
		for(int y=0;y<4;y++){
			if(arr[x][y] == arr[x+1][y]){
				return false;	
			}		
		}	
	}
	return true;
}

//重新开始游戏
int begin()
{
	srand(time(NULL));
	while(1)
	{
		creat_num();
		display();
		if(is_over())
		{
			printf("game is over!\n");
			printf("返回存档位置(1)、重新开始(2)、结束(3)\n");
			char val = getch();
			if(val == '3')
			{
				return 0;	
			}
			else if('1' == val)
			{
				load();
			}
			else if('2' == val)
			{
				begin();
			}
		}
		IS_MOVE_MERGE = false;
		switch(getch())
		{
			case 183: up();      break; //up
			case 184: down();    break;//down
			case 185: right();   break;//right
			case 186: left();    break;//left
			case 115: save();    return 0;
			case 'q': system("rm 2048.txt");  return 0; 
		}		
	}
}

//继续游戏
int go_on()
{
	load();
	while(1)
	{
		srand(time(NULL));
		creat_num();
		display();
		if(is_over())
		{
			printf("game is over!\n");
			printf("返回存档位置(1)、重新开始(2)、结束(3)\n");
			char val = getch();
			if(val == '3')
			{
				return 0;	
			}
			else if('1' == val)
			{
				load();
			}
			else if('2' == val)
			{
				begin();
			}
		}
		IS_MOVE_MERGE = false;
		switch(getch())
		{
			case 183: up();      break; //up
			case 184: down();    break;//down
			case 185: right();   break;//right
			case 186: left();    break;//left
			case 115: save();    return 0;
			case 'q': system("rm 2048.txt");  return 0;
		}
	}
}


	

void menu()
{
	system("clear");
	printf("------欢迎来到2048------\n");
	printf("1、重新开始\n");
	printf("2、继续游戏\n");
	printf("3、退出\n");
	printf("-----------------------\n");
}
			
int main(){
	menu();
	while(1){
		switch(getch())
		{
			case '1':begin();	break;		 
			case '2':go_on();	break;
			case '3':			return 0;
 		}
	}
}
//-----------------------------------------------------------------//
//总结:
//		总的来说C语言毕竟就这么点知识
//		单个运用和练习可能会比较简单,但是一起运用的话就会比较困难
//		在想成为优秀的程序员前,还是需要努力的学习新知识和熟练运用已学的知识
//		在这里也祝热爱打代码或者生活所迫的新手小白程序员们能不被现实打败 fighting!
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值