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);
}