本代码不够完美,没有积分项,希望读者给个意见,怎样做?
好了,上代码!
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#define SIZE 4
//1024 小游戏
//输出矩阵
void print_arry(int a[][SIZE]);
//填数组
int random_arry(int a[][SIZE]);
//读入键盘上下右左 1 2 3 4
int toward_key();
//向上移动
void up_move(int a[][SIZE]);
//向下移动
void down_move(int a[][SIZE]);
//向右移动
void right_move(int a[][SIZE]);
//向左移动
void left_move(int a[][SIZE]);
void main()
{
int a[SIZE][SIZE]={0},n;
random_arry(a);
print_arry(a);
while(1)
{
done:
n=toward_key();
switch(n)
{
case 1:up_move(a);break;
case 2:down_move(a);break;
case 3:right_move(a);break;
case 4:left_move(a);break;
default:printf("输入错误!\n请重新输入!\n");goto done;
}
n=random_arry(a);
if(!n)
{
printf("游戏结束!\n");
break;
}
print_arry(a);
}
}
void print_arry(int a[][SIZE])
{
printf("1024小游戏:\n\n");
for(int i=0;i<SIZE;i++)
{
for(int j=0;j<SIZE;j++) printf("%5d\t",a[i][j]);
printf("\n\n");
}
printf("\n");
}
int random_arry(int a[][SIZE])
{
srand(time(0));
//如果空为0,直接结束函数
int t=0;
for(int i=0;i<SIZE;i++) for(int j=0;j<SIZE;j++) if(0 == a[i][j]) t++;
if(0 == t)
{
printf("game over!\n");
return 0;
}
//没有则随机填空
while(1)
{
t=rand()%(SIZE*SIZE);
if(0 == a[t/SIZE][t%SIZE]) //如果该位为空
{
a[t/SIZE][t%SIZE]=2;
return 1;
}
}
}
int toward_key()
{
char ch[4],t=0;
while((ch[t++]=getchar())!='\n'); //最后一个用于装\0或者\n
if(ch[0]==27&&ch[1]==91) //确定是方向键
return ch[2]-64; //ch[3]的可能取值 'A' 'B' 'C' 'D' 故才取的第三位
return 0;//否者不是方向键
}
void up_move(int a[][SIZE])
{
static int b[SIZE][SIZE];
//清除0后放在b中
for(int i=0;i<SIZE;i++) //列号
{
for(int j=0,t=0;j<SIZE;j++) //行号
{
if(a[j][i] != 0) b[t++][i]=a[j][i];
}
}
//初始化a 全部赋值为0 为下一步再次重新赋值做准备
for(int i=0;i<SIZE*SIZE;i++) a[i/SIZE][i%SIZE]=0;
//相同的加法
for(int i=0;i<SIZE;i++) //列号
{
for(int j=0;j<SIZE-1;j++) //行号
{
if(b[j][i] == b[j+1][i]) //相加----x2等效 前一个x2后一个变0
{
b[j][i]*=2;
b[j+1][i]=0;
}
}
}
//清除0后放在a中
for(int i=0;i<SIZE;i++) //列号
{
for(int j=0,t=0;j<SIZE;j++) //行号
{
if(b[j][i] != 0) a[t++][i]=b[j][i];
}
}
}
void down_move(int a[][SIZE])
{
static int b[SIZE][SIZE];
for(int i=0;i<SIZE;i++) //列号
{
for(int j=SIZE-1,t=SIZE-1;j >= 0;j--) //行号
{
if(a[j][i] != 0) b[t--][i]=a[j][i];
}
}
for(int i=0;i<SIZE*SIZE;i++) a[i/SIZE][i%SIZE]=0;
for(int i=0;i<SIZE;i++) //列号
{
for(int j=SIZE-1;j > 0;j--) //行号
{
if(b[j][i] == b[j-1][i])
{
b[j][i]*=2;
b[j-1][i]=0;
}
}
}
for(int i=0;i<SIZE;i++) //列号
{
for(int j=SIZE-1,t=SIZE-1;j >= 0;j--) //行号
{
if(b[j][i] != 0) a[t--][i]=b[j][i];
}
}
}
void left_move(int a[][SIZE])
{
static int b[SIZE][SIZE];
for(int i=0;i<SIZE;i++) //行号
{
for(int j=0,t=0;j<SIZE;j++) //列号
{
if(a[i][j] != 0) b[i][t++]=a[i][j];
}
}
for(int i=0;i<SIZE*SIZE;i++) a[i/SIZE][i%SIZE]=0;
for(int i=0;i<SIZE;i++) //行号
{
for(int j=0;j<SIZE-1;j++) //列号
{
if(b[i][j] == b[i][j+1])
{
b[i][j]*=2;
b[i][j+1]=0;
}
}
}
for(int i=0;i<SIZE;i++) //行号
{
for(int j=0,t=0;j<SIZE;j++) //列号
{
if(b[i][j] != 0) a[i][t++]=b[i][j];
}
}
}
void right_move(int a[][SIZE])
{
static int b[SIZE][SIZE];
for(int i=0;i<SIZE;i++) //行号
{
for(int j=SIZE-1,t=SIZE-1;j>=0;j--) //列号
{
if(a[i][j] != 0) b[i][t--]=a[i][j];
}
}
for(int i=0;i<SIZE*SIZE;i++) a[i/SIZE][i%SIZE]=0;
for(int i=0;i<SIZE;i++)
{
for(int j=SIZE-1,t=SIZE-1;j > 0;j--) //列号
{
if(b[i][j] == b[i][j-1])
{
b[i][j]*=2;
b[i][j-1]=0;
}
}
}
for(int i=0;i<SIZE;i++) //行号
{
for(int j=SIZE-1,t=SIZE-1;j>=0;j--) //列号
{
if(b[i][j] != 0) a[i][t--]=b[i][j];
}
}
}
效果图,由于简单的测试,没有细测试!功能可实现!特点在于,可以识别键盘上的上下左右键!