2048游戏小代码

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<time.h>

int matrix[4][4]={0};
int flat=0;  //当满屏再次移动时,无法移动的标志
int sum=0;     //记录当前总分
void welcome();  //欢迎函数
int move();     //移动函数,同时起到重新开始游戏和结束游戏作用
void newcreat(); //生成函数
void print(); //打印函数
void init(); //初始函数,负责重新开始的清屏
int main()
{
	 int count=0,i,j,t;
	 welcome();
	 srand(time(NULL));
	 newcreat();
	 print();
	 while(1){
		  for(i=0;i<=3;i++)   //判断是否到达胜利的条件
			   for(j=0;j<=3;j++)
				    if(matrix[i][j]!=0){
				     	count++;
				     	if(matrix[i][j]==2048){
				     	 	printf("\t\t\t\t\t\t\t\t\t\t\t\t恭喜你,游戏胜利\n");
				     		break;
		    		     }
	   				 }
	 
		  t=move();
		  if(t==1){   //重新开始游戏
			   init();
			   system("cls");
			   newcreat();
			   print();
			   continue;
		  }
		  if(t==2){  //退出游戏
			   printf("\t\t\t\t\t\t\t\t\t\t\t谢谢你的来到,欢迎下次再来\n");
			   getch();
			   break;
		  }
		  if(count==16&&flat==0){   //判断是否到达失败的条件
			   printf("\t\t\t\t\t\t\t\t\t\t\t\t很遗憾,游戏失败\n");
			   break;
		  }
		  if(t!=3)
		 	   newcreat();
		  system("cls");
		  print();
		  flat=0;
		  count=0;
	 }
	 return 0;
}
void welcome()
{
	 printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
	 printf("\t\t\t\t\t\t\t\t\t\t\t");
	 printf("欢迎来到2048游戏\n");
	 printf("\t\t\t\t\t\t\t\t\t\t\t             --按回车键进入下一步(不变)\n");
	 getch();
	 system("cls");
	 printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
	 printf("\t\t\t\t\t\t\t\t\t\t\t\t");
	 printf("玩法说明\n");
	 printf("\t\t\t\t\t\t\t\t\t\t");
	 printf("通过按数字键移动数字,合并相同的数字来取得更大的数。\n");
	 printf("\t\t\t\t\t\t\t\t\t\t");
	 printf("得到2048时游戏即胜利,当然您也可以选择继续挑战。\n\n\n");
	 printf("\t\t\t\t\t\t\t\t\t\t");
	 printf("按键操作:\n");
	 printf("\t\t\t\t\t\t\t\t\t\t");
	 printf("上:w 下:s 左:a 右:d 重新开始:r 退出游戏:e\n");
	 getch();
	 system("cls");
}
int move()
{
	 char ch;
	 int i,j,k,p=-1;  //p的作用使格子的数值不能连续合并
	 ch=getch();
	 switch(ch){
	  	case 'w':
		   for(j=0;j<=3;j++){
			    for(i=3;i>=0;i--){
			     	if(matrix[i][j]==0){   //如果当前位置为空白,那么其所在列下面的数值应该往上移动  
				     	if(i+1<=3&&matrix[i+1][j]!=0){
				       		for(k=i;k<3;k++)
				       			 matrix[k][j]=matrix[k+1][j]; 
				      	    matrix[3][j]=0;   //必会出现这个位置的空白,因为数值都向上移动了
				            flat=1;
			     	 	}
		    		 }
		     		if(matrix[i][j]!=0){   //如果当前位置为数值,那么看其上方是否与其数值相同,如相同则相加,不同则不变
			      		if(i!=0&&p!=i&&matrix[i][j]==matrix[i-1][j]){
				       		matrix[i-1][j]*=2;
				       		sum+=matrix[i-1][j];
				       		p=i-1;
			      	   		for(k=i;k<3;k++)  //由于数值的合并,出现了一个多余的空白,此时应该向上移动该位置下面的数值
			        			matrix[k][j]=matrix[k+1][j];
				       		matrix[3][j]=0;   //移动之后,空白就会出现在最下方
				       		flat=1;
			     		 }
			     	  }
			   	 }
			    p=-1;
			 }
			 break;
		   
		  case 's':
			   for(j=0;j<=3;j++){
			    	for(i=0;i<=3;i++){
			    	 	if(matrix[i][j]==0){  //如果当前位置为空白,那么其所在列上面的数值应该往下移动
			      			if(i-1>=0&&matrix[i-1][j]!=0){
			      				 for(k=i;k>0;k--)
			        				matrix[k][j]=matrix[k-1][j];
			       				 matrix[0][j]=0;  //必会出现这个位置的空白,因为数值都向下移动了
			       				 flat=1;
			      			}
			     		} 
					     if(matrix[i][j]!=0){  //如果当前位置为数值,那么看其下方是否与其数值相同,如相同则相加,不同则不变
					      	if(i!=3&&p!=i&&matrix[i][j]==matrix[i+1][j]){
					      		 matrix[i+1][j]*=2;
					       		 sum+=matrix[i+1][j];
					      		 p=i+1;
					         	 for(k=i;k>0;k--) //由于数值的合并,出现了一个多余的空白,此时应该向下移动该位置上面的数值
					        		matrix[k][j]=matrix[k-1][j];
					       	  	 matrix[0][j]=0;  //移动之后,空白就会出现在最上方
					          	 flat=1;
					     	 }
					     }
					  }
					  p=-1;
				   }
				   break;
			   
		  case 'a':
		   	for(i=0;i<=3;i++){    //如果当前位置为空白,那么其所在列右方的数值应该往左移动
			    for(j=3;j>=0;j--){
			     	if(matrix[i][j]==0){
			     		 if(j+1<=3&&matrix[i][j+1]!=0){
			       			for(k=j;k<3;k++)
			       				 matrix[i][k]=matrix[i][k+1];
			       			matrix[i][3]=0; //必会出现这个位置的空白,因为数值都向左移动了
			       			flat=1;
			      		}
			     	}
			     	 if(matrix[i][j]!=0){ //如果当前位置为数值,那么看其左方是否与其数值相同,如相同则相加,不同则不变
			      		if(j!=0&&p!=j&&matrix[i][j]==matrix[i][j-1]){
			       			matrix[i][j-1]*=2;
			       			sum+=matrix[i][j-1];
			       			p=j-1;
			       			for(k=j;k<3;k++)  //由于数值的合并,出现了一个多余的空白,此时应该向左移动该位置右面的数值
			        			matrix[i][k]=matrix[i][k+1];
			       			matrix[i][3]=0;   //移动之后,空白就会出现在最右方
			       			flat=1;
			      		}
			     	}
			    }
			  	p=-1;
			  }
			  break;
		
		  case 'd':
			   for(i=0;i<=3;i++){
			    	for(j=0;j<=3;j++){  //如果当前位置为空白,那么其所在列左方的数值应该往右移动
			     		if(matrix[i][j]==0){
			      			if(j-1>=0&&matrix[i][j-1]!=0){
			       				for(k=j;k>0;k--)
			        				matrix[i][k]=matrix[i][k-1];
			      			    matrix[i][0]=0;  //必会出现这个位置的空白,因为数值都向右移动了
			        			flat=1;
			     			 }
			    		 }
			     		if(matrix[i][j]!=0){ //如果当前位置为数值,那么看其右方是否与其数值相同,如相同则相加,不同则不变
			      			if(j!=3&&p!=j&&matrix[i][j]==matrix[i][j+1]){
			      				 matrix[i][j+1]*=2;
			      				 sum+=matrix[i][j+1];
			      				 p=j+1;
			       				 for(k=j;k>0;k--)  //由于数值的合并,出现了一个多余的空白,此时应该向右移动该位置左面的数值
			       					 matrix[i][k]=matrix[i][k-1];
			       				 matrix[i][0]=0;  //移动之后,空白就会出现在最左方
			       				 flat=1;
			     			 }
			    		 }
			    	}
			    	p=-1;
			   }
			   break;  
		   
		  case 'r':
		   	return 1;
		  case 'e':
		   	return 2;
		  default :
		   	printf("\t\t\t\t\t\t\t\t\t\t\t你的输入有误,请重新输入\n");
		   	getch();
		   	return 3;
	 }
	 return 0;
 
}
void print()
{
	int i,j;
	printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
	printf("\t\t\t\t\t\t\t\t\t\t\t当前得分:%d\n",sum);
	printf("\t\t\t\t\t\t\t\t\t\t\t"); //使横向移动到中间
	for(i=0;i<=3;i++){
		printf("---------------------------\n");
		printf("\t\t\t\t\t\t\t\t\t\t\t"); //使竖线移动到中间
		printf(" |");
		for(j=0;j<=3;j++){
			if(matrix[i][j]==0)
				printf("     |");
			else
				printf("  %d  |",matrix[i][j]);
		}	
		printf("\n\t\t\t\t\t\t\t\t\t\t\t");
	}
	printf("---------------------------\n");
}
void newcreat()
{
	int i,j,k;
	i=rand()%4;
	j=rand()%4;
	while(matrix[i][j]){
		i=rand()%4;
		j=rand()%4;
	}
	k=rand()%2?2:4;
	matrix[i][j]=k;
}
void init()
{
 int i,j;
 for(i=0;i<=3;i++){
  	for(j=0;j<=3;j++){
  		 matrix[i][j]=0;
  	}
 }
 sum=0;
}
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值