#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]; } } }
讯享网
效果图,由于简单的测试,没有细测试!功能可实现!特点在于,可以识别键盘上的上下左右键!


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/67688.html