C语言 2048小游戏

C语言之前写的2048小游戏,全是函数、数组

#include<stdio.h>
#include<stdlib.h> 
#include<time.h>
#include<conio.h>
//全局变量 数组
int a[4][4]={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};
int main()
{
//定义变量 
	//矩阵相关的变量 
	int i,j;//为产生随机数而使用的横纵坐标 
	int x,y;//横纵坐标 
	//分数类变量 
	int new_score=0;
	int total_score=0;
	//交互过程变量
	int key; 
	
//定义函数 
	//输出矩阵函数 
	void print_matrix(); 
	//生成随机数2或4函数
	int rand_number2or4();
	//生成随机坐标函数
	int coordinate_x();
	//初始化两个坐标为2函数
	void begin();
	//读取键盘操作 
	int keyboard();
	//上
	void up(); 
	//下
	void down();
	//左
	void left();
	//右 
	void right();
	//贴边
	void  magin();
	//键盘操作后随机产生一个数 
	void new_number();
	
//主体
	//准备工作 
	srand((int)time(NULL));//产生随机数的种子 
	//初始化 
	begin();//初始化两个坐标为2 
	print_matrix();//输出矩阵
	 
	//用户交互过程(每个循环读取一次键盘,用方向键操作) 
	for(;;)
	{
		key=keyboard();
		if(key==1)//上 
		{
			up();
			new_number();
			print_matrix(); 	
		}
		
		if(key==2)//下 
		{
			down();
			new_number();
			print_matrix(); 		
		}
		
		if(key==3)//左 
		{
			left();
			new_number();
			print_matrix();	
		}
		
		if(key==4)//右 
		{
			right();
			new_number();
			print_matrix();
		}
	}
	 
	//输出矩阵
	print_matrix();  
}

//函数

	//目的:输出矩阵 
	//输入:无
	//输出:4*4矩阵 
	//返回值:无返回值 
	void print_matrix()
	{
		int i,j;//i表示行坐标,j表示列坐标,取值分别为0,1,2,3 
		for(i=0;i<=3;i++)
		{
			for(j=0;j<=3;j++) 
			{
				printf("%d\t",a[i][j]);
			}
			printf("\n\n");
		}
	} 
	
	//目的:产生1~100的随机数
	//输入:无
	//输出:100以内的随机数
	//返回值:100以内的随机数 
	int rand_number100()
	{
		int num;//num表示0~100的随机数 
		num=rand()%100;
//		printf("随机数是%d\n",num);
		return num;
	}
	
	
	//目的:产生随机数2或4,概率比例为2:4=10:1 
	//输入:无
	//输出:随机数2或4
	//返回值:随机数2或4 
	int rand_number2or4()
	{
		int rand_number100();//声明函数
		int remainder=0;//remainder表示余数 
		int num1;//num1的范围是2,4 
		remainder=rand_number100()%10; 
		if(remainder==0)//若num是10的倍数则num1是4,否则是2
		{
			num1=4;
		}
		else num1=2;
//		printf("随机数2或4为%d\n\n",num1);
		return num1;
	} 
	
	
	//目的:产生随机数(0,1,2,3)概率比例为 1:1:1:1 
	//输入:无
	//输出:随机数(0,1,2,3)
	//返回值:随机数(0,1,2,3)
	int coordinate_x()
	{
		int rand_number100();//声明函数
		int num_x;//num_x的范围是2,4
		num_x=rand_number100()%4;
//		printf("随机数坐标为%d\n\n",num_x);
		return num_x;
	}
	
	
	//目的:初始化两个坐标为2 
	//输入:无
	//输出:初始化成功 
	//返回值:无
	void begin()
	{
		int x1,y1,x2,y2; 
		for(;;)//生成两个不相同的随机坐标 
		{
			x1=coordinate_x();//随机横坐标
			y1=coordinate_x();//随机纵坐标
			x2=coordinate_x();//随机横坐标
			y2=coordinate_x();//随机纵坐标
			if(x1!=x2&&y1!=y2)
			{
				break;
			}
		}
		a[x1][y1]=2; 
		a[x2][y2]=2;
		printf("坐标初始化成功:(%d,%d),(%d,%d)\n\n",x1+1,y1+1,x2+1,y2+1);
	} 
	
	
	//目的:读取方向键 
	//输入:方向键 
	//输出:读出的方向键 
	//返回值:上1,下2,左3,右4
	int keyboard()
	{
		int key;// 上1,下2,左3,右4
		int ch1=0;
        int ch2=0;
        if (ch1=getch())
        { 
			ch2=getch();//第一次调用getch(),返回值224
            switch (ch2)//第二次调用getch()
            {
              	case 72: printf("你的操作 : ↑ \n");key=1;break;  
              	case 80: printf("你的操作 : ↓ \n");key=2;break; 
              	case 75: printf("你的操作 : ← \n");key=3;break;
              	case 77: printf("你的操作 : → \n");key=4;break;                                   
              	default: printf("按键错误 \n");break;
              	break;
            }
        }  
//      printf("key=%d\n",key);
        return key;	
	}
	 
	 
	//目的:向上运算 
	//输入:无,只在key=1的条件下调用 
	//输出:无
	//返回值:无
	void up()
	{
		int i,j;//横纵坐标,0,1,2,3 
		int t;//t表示增量
		void  magin();
		//找出每一列值相同的元素并相加 
		for(j=0;j<=3;j++)//j表示相同纵坐标 
		{
//			printf("\nj=%d\n",j);
			for(i=0;i<=3;i++)//一竖列第i个元素 0,1,2,3 
			{
//				printf("i=%d\n",i);
				for(t=1;t==1||(t==2&&a[i+t-1][j]==0&&t<=3-i)||(t==3&&a[t-1][j]==0&&a[t-2][j]==0&&t<=3-i);t++)
				{
//					printf("t=%d\n",t);
					if(a[i][j]==a[i+t][j]&&a[i][j]!=0)
					{
//						printf("找到相同元素\n");//即使是0也没有关系 
						a[i][j]=2*a[i][j];
						a[i+t][j]=0;
						t++;
						i=i+t-1;
						continue;//直接跳入下一次循环(t++) 
					}
					if(t>3-i)break;
				}
			}
		}
		magin();
	} 
	
	
	//目的:向下运算 
	//输入:无,只在key=1的条件下调用 
	//输出:无
	//返回值:无
	void down()
	{
		int i,j;
		int temp1,temp2;
		void up(); //声明up函数 
		//上下调换数组(先上下换,再调用up函数,再上下换) 
		for(j=0;j<=3;j++) 
		{
			temp1=a[0][j];
			temp2=a[1][j];
			a[0][j]=a[3][j];
			a[1][j]=a[2][j];
			a[3][j]=temp1;
			a[2][j]=temp2;
		}

		up();//调用up函数
		
		//上下调换数组 
		for(j=0;j<=3;j++) 
		{
			temp1=a[0][j];
			temp2=a[1][j];
			a[0][j]=a[3][j];
			a[1][j]=a[2][j];
			a[3][j]=temp1;
			a[2][j]=temp2;
		}
	}
	
	
	//目的:向左运算 (先转置,再调用up函数,再转置) 
	//输入:无,只在key=2的条件下调用 
	//输出:无
	//返回值:无
	void left()
	{
		int i,j;
		int temp1,temp2,temp3,temp4,temp5,temp6;
		void up(); //声明up函数 
		//转置数组(先转置,再调用up函数,再转置) 

		temp1=a[1][0];
		temp2=a[2][0];
		temp3=a[3][0];
		temp4=a[2][1];
		temp5=a[3][1];
		temp6=a[3][2];
		
		a[1][0]=a[0][1];
		a[2][0]=a[0][2];
		a[3][0]=a[0][3];
		a[2][1]=a[1][2];
		a[3][1]=a[1][3];
		a[3][2]=a[2][3];
		
		a[0][1]=temp1;
		a[0][2]=temp2;
		a[0][3]=temp3;
		a[1][2]=temp4;
		a[1][3]=temp5;
		a[2][3]=temp6;
		
		up();//调用up函数
		
		//转置数组 
		temp1=a[1][0];
		temp2=a[2][0];
		temp3=a[3][0];
		temp4=a[2][1];
		temp5=a[3][1];
		temp6=a[3][2];
		
		a[1][0]=a[0][1];
		a[2][0]=a[0][2];
		a[3][0]=a[0][3];
		a[2][1]=a[1][2];
		a[3][1]=a[1][3];
		a[3][2]=a[2][3];
		
		a[0][1]=temp1;
		a[0][2]=temp2;
		a[0][3]=temp3;
		a[1][2]=temp4;
		a[1][3]=temp5;
		a[2][3]=temp6;	
	}	
	
	//目的:向右运算 (先上下调换,在转置,再调用up函数,再转置,在上下调换) 
	//输入:无,只在key=4的条件下调用 
	//输出:无
	//返回值:无
	void right()
	{
		int i,j;
		int temp1,temp2;
		void up(); //声明up函数 
		
		//左右调换数组 
		for(i=0;i<=3;i++) 
		{
			temp1=a[i][0];
			temp2=a[i][1];
			a[i][0]=a[i][3];
			a[i][1]=a[i][2];
			a[i][3]=temp1;
			a[i][2]=temp2;
		}
		
		//left函数
		left();
		
		//左右调换数组 
		for(i=0;i<=3;i++) 
		{
			temp1=a[i][0];
			temp2=a[i][1];
			a[i][0]=a[i][3];
			a[i][1]=a[i][2];
			a[i][3]=temp1;
			a[i][2]=temp2;
		}
	
	}
	
	//目的:向上贴边 
	//输入:无,只在向上求和完毕后调用 
	//输出:无
	//返回值:无
	void  magin()
	{
		int i,j,t;
		int temp;
		for(j=0;j<=3;j++)
		{
			for(i=0;i<=3;i++)
			{
				if(a[i][j]==0)
				{
					for(t=1;t<=3-i;t++)
					{
						if(a[i+t][j]!=0)//则a[i+t][j]和a[i][j]互换 
						{
							temp=a[i+t][j];
							a[i+t][j]=a[i][j];
							a[i][j]=temp;
							break;
						}
					}
				}
			}
		}	
	} 
	
	//目的:键盘操作后随机产生一个数(仅在每次操作后调用,产生的数不能覆盖非0数) 
	//输入:无
	//输出:无
	//返回值:无
	void new_number()
	{
		int x1,y1,number; 
		int coordinate_x();
		int rand_number2or4();
		for(;;)//生成两个不相同的随机坐标 
		{
			x1=coordinate_x();//随机横坐标
			y1=coordinate_x();//随机纵坐标
			if(a[x1][y1]==0)
			{
				break;
			}
		}
		number=rand_number2or4();
		a[x1][y1]=number; 
		printf("随机产生:a[%d][%d]=%d\n",x1+1,y1+1,number);
	}
	

猜你喜欢

转载自blog.csdn.net/sinat_42483341/article/details/86511591