本文最后更新于 2023-12-09,文章内容可能已经过时。

2048

所做的第一个真正意义上的大项目.大一上学期使用C语言完成.

第一次体会到撰写大量,复杂代码的成就感和满足感.

#include <stdio.h>
#include <stdlib.h>
#include<conio.h>
#include <time.h>
void  shuchu(int  zu[][4])
{
 	int hang,lie;
    for(hang=0;hang<4;hang++)
	{
	   for(lie=0;lie<4;lie++)
	   {
	   	printf("%5d",zu[hang][lie]);
	   }
	   printf("\n");
	   printf("\n"); 
	}
}
void jieshu(int zu[][4])
{
	int hang,lie;
    for(hang=0;hang<4;hang++)
	{
	   for(lie=0;lie<4;lie++)
	   {
	   	if(zu[hang][lie]==2048)
		   {
		   	system("cls");
	   		printf("游戏胜利!!!!!\n");
			printf("我艹,兄弟牛逼!!!!!\n");
			printf("这么垃圾的游戏你都玩完了!!!!!\n");
			printf("拜拜~~~~~\n");
			printf("PS:"); 
			printf("第一个游戏,设计于2021.11.15\n");
			printf("出品 熊的抒情进攻");
			exit(0); 
		   }
       }
	} 	
	
	
}
void duiqi(int zu[][4],int shuru) 
{
	int hang,lie,i,j,swap;
	if(shuru==119)
	{
		for(lie=0; lie<4;lie++) {
			j=0;
			for(i=0; i<24; i++,j++) {

				if(zu[j][lie]==0&&zu[j+1][lie]!=0) {
					swap=zu[j][lie];
					zu[j][lie]=zu[j+1][lie];
					zu[j+1][lie]=swap;
				}
				if(j==2)j=-1;
			}
		}
	}
	if(shuru==115) 
	{
		for(lie=0; lie<4;lie++) {
			j=0;
			for(i=0; i<24; i++,j++) {
	
				if(zu[j][lie]!=0&&zu[j+1][lie]==0) {
					swap=zu[j][lie];
					zu[j][lie]=zu[j+1][lie];
					zu[j+1][lie]=swap;
				}
				if(j==2)j=-1;
			}
		}
	}
	if(shuru==97)
	{
		for(hang=0; hang<4;hang++)
		{
			j=0;
			for(i=0; i<24; i++,j++)
			{
				if(zu[hang][j]==0&&zu[hang][j+1]!=0)
				{
					swap=zu[hang][j];
					zu[hang][j]=zu[hang][j+1];
					zu[hang][j+1]=swap;
				}
				if(j==2)j=-1;
			}
		}
	}
	if(shuru==100) 
	{
		for(hang=0; hang<4;hang++) {
			j=0;
			for(i=0; i<24; i++,j++)
			{
	
				if(zu[hang][j]!=0&&zu[hang][j+1]==0)
				{
					swap=zu[hang][j];
					zu[hang][j]=zu[hang][j+1];
					zu[hang][j+1]=swap;
				}
				if(j==2)j=-1;
			}
		}
	}

}
void hebing(int zu[][4],int shuru) 
{
	int hang,lie,i;
	if(shuru==119) 
	{
		for(lie=0; lie<4; lie++) {
			for(i=0; i<3; i++) {
				if(zu[i][lie]==zu[i+1][lie]) {
					zu[i][lie]=zu[i][lie]*2;
					zu[i+1][lie]=0;
				}
			}
		}
	}
	if(shuru==115)
	{
		for(lie=0; lie<4; lie++) {
			for(i=0; i<3; i++) {
				if(zu[i][lie]==zu[i+1][lie]) {
					zu[i+1][lie]=zu[i][lie]*2;
					zu[i][lie]=0;
				}
			}
		}
	}
	if(shuru==97)
	{
		for(hang=0; hang<4; hang++) {
			for(i=0; i<3; i++) {
				if(zu[hang][i]==zu[hang][i+1]) {
					zu[hang][i]=zu[hang][i]*2;
					zu[hang][i+1]=0;
				}
			}
		}
	}
	if(shuru==100)
	{
		for(hang=0; hang<4; hang++) {
			for(i=0; i<3; i++) {
				if(zu[hang][i]==zu[hang][i+1]) {
					zu[hang][i+1]=zu[hang][i]*2;
					zu[hang][i]=0;
				}
			}
		}
	}
}
void suijishu(int zu[][4])
{
   srand((unsigned)time(NULL));
   int sui1,sui2,hang,lie,count=0;
   int sui[16];
   sui1=rand();
   if(sui1%2==0)sui1=2;
   if(sui1%2==1)sui1=4;
   for(hang=0;hang<4;hang++)
	{
	   for(lie=0;lie<4;lie++)
	   {
	   	if(zu[hang][lie]==0)
		   {
		   	sui[count]=hang*10+lie;
		   	count++;
		   }
	   }
	}
	sui2=rand()%count;
	hang=sui[sui2]/10;
	lie=sui[sui2]%10;
    zu[hang][lie]=sui1;	
}
void  chuli(int zu[][4],int shuru)
{
	 duiqi(zu,shuru);
	 hebing(zu,shuru);
	 jieshu(zu);
	 duiqi(zu,shuru);
	 suijishu(zu);
}

int main()
{
	int ping=1,pan1,pan2,shuru,hang,lie; 
	int zu[4][4];
	for(hang=0;hang<4;hang++)
	{
	   for(lie=0;lie<4;lie++)
	   {
	   	zu[hang][lie]=0;
	   } 
	} 
	suijishu(zu);	
	for(;;)
	{
		if(ping==1) 
		{
			system("cls");
			printf("****************************\n");
			printf("*                          *\n");
			printf("*    欢迎来到2048小游戏!   *\n");
			printf("*       >开始游戏          *\n");
			printf("*        游戏说明          *\n");
			printf("*        退出游戏          *\n");
			printf("*                          *\n");
			printf("****************************\n");
			pan1=getch();
			if(pan1==13) 			
			{
			  for(;;)
			  {	
			    system("cls");
				shuchu(zu);
                shuru=getch(); 
                chuli(zu,shuru);
		      }
			}
			else {
				pan2=getch();
				switch(pan2) 
				{
					case 72: {
						ping = 3;
						continue;
					}
					case 80: {
						ping = 2;
						continue;
					}
				}
	          }
       } 	 
		if(ping==2) 
		{
			system("cls");
			printf("****************************\n");
			printf("*                          *\n");
			printf("*    欢迎来到2048小游戏!   *\n");
			printf("*        开始游戏          *\n");
			printf("*        >游戏说明         *\n");
			printf("*        退出游戏          *\n");
			printf("*                          *\n");
			printf("****************************\n");
			pan1=getch();
			if(pan1==13) {
				system("cls");
				printf("1.手指向一个方向滑动,所有格子会向那个方向运动。(请使用wasd键)\n");
				printf("2.相同数字的两个格子,相撞时数字会相加。\n");
				printf("3.每次滑动时,空白处会随机刷新出一个数字的格子(2或4)。\n");
				printf("4.当界面不可运动时(当界面全部被数字填满时),游戏结束。\n");
				printf("5.当界面中最大数字是2048时,游戏胜利。\n");
				printf("6.按回车键返回\n");
				if(getch()==13)
				{
					ping = 2;
					continue;
				}
			} 
			else {
				pan2=getch();
				switch(pan2) 
				{
					case 72: {
						ping = 1;
						continue;
					}
					case 80: {
						ping = 3;
						continue;
					}
				}
	          }
       } 
       	if(ping==3) 
		{
			

			system("cls");
			printf("****************************\n");
			printf("*                          *\n");
			printf("*    欢迎来到2048小游戏!   *\n");
			printf("*        开始游戏          *\n");
			printf("*        游戏说明          *\n");
			printf("*        >退出游戏         *\n");
			printf("*                          *\n");
			printf("****************************\n");
			pan1=getch();
			if(pan1==13) {
			     exit(0);
			} 
			else {
				pan2=getch();
				switch(pan2) 
				{
					case 72: {
						ping = 2;
						continue;
					}
					case 80: {
						ping = 1;
						continue;
					}
				}
	          }
	   } 

   }
   return 0;
}