2048这款游戏好几个月以前就火了,可是一直没有仔细玩过,这两天闲着无事研究了如下玩法,仍是蛮有意思的。而后,这两天在学习Linux程序设计,因而就萌生了在Linux下写一个2048的想法,固然是运行在Terminal下的。闲话很少说,Let’s begin.数组
做为一只菜狗,在Terminal下只能用基础的curses函数库来作界面了,so,在编译的时候不要忘了 -lcurses。功能很简单,如今16个框中选两个分别赋值为2 ,而后按照上下左右的方向向对应方向合并相同的数字,而且在剩余的框中随机找一个赋值为2或4(听说出现的几率是9:1,因此我就按照9:1来设计了)。只作除了简单的功能,计分、失败这些功能还没加,找个时间再改吧。wsad表明上下左右,r表明replay,q是quit。好了,到了贴代码的环节了。以下函数
#include <unistd.h> #include <curses.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #define LEN 4 #define SCR 1 void printGraphics(int arr[LEN][LEN]); void movePoints(int arr[LEN][LEN],char); void initilizeGraphics(int arr[LEN][LEN]); int main(void) { int arrayOfGame[LEN][LEN]; char command; int i,j; #ifdef SCR initscr(); move(3,20); printw("%s","2048"); move(4,4); printw("--------------------------------------"); move(10,4); printw("--------------------------------------"); move(11,4); printw("%s","Press 'q' to quit!"); move(12,4); printw("%s","Press 'r' to replay!"); #endif initilizeGraphics(arrayOfGame); printGraphics(arrayOfGame); command=getc(stdin); while(command!='q') { if(command=='w'||command=='a'||command=='s'||command=='d') { movePoints(arrayOfGame,command); printGraphics(arrayOfGame); } if(command=='r') { initilizeGraphics(arrayOfGame); printGraphics(arrayOfGame); } command=getc(stdin); } #ifdef SCR endwin(); #endif return 0; } void initilizeGraphics(int arrGraphics[LEN][LEN]) { int num,i,j; for(i=0;i<LEN;i++) for(j=0;j<LEN;j++) arrGraphics[i][j]=0; srand((unsigned)time(NULL)); num=rand()%16; arrGraphics[num/LEN][num%LEN]=2; srand((unsigned)time(NULL)); num=rand()%16; while(arrGraphics[num/LEN][num%LEN]==2) { num=rand()%16; } arrGraphics[num/LEN][num%LEN]=2; } void printGraphics(int arrayGraphics[LEN][LEN]) { int i=0,j=0; for(i=0;i<LEN;i++) { #ifdef SCR move(5+i,10); #endif for(j=0;j<LEN;j++) { #ifdef SCR printw("%d\t",arrayGraphics[i][j]); #else printf("%d\t",arrayGraphics[i][j]); #endif } #ifdef SCR printw("\n"); #else printf("\n"); #endif } #ifdef SCR printw("\n"); refresh(); #else printf("\n"); #endif } void movePoints(int arr[LEN][LEN],char comm) { int checkZero[16]={-1}; int backup[LEN][LEN]={0}; int i=0,j=0,k=0,num=0; int changed=0; int outNum; for(i=0;i<LEN;i++) { for(j=0;j<LEN;j++) backup[i][j]=arr[i][j]; } switch(comm) { case 'w': for(j=0;j<LEN;j++) { for(i=0;i<LEN;i++) { if(arr[i][j]!=0) { for(k=i+1;k<LEN;k++) { if(arr[k][j]!=0) { if(arr[k][j]==arr[i][j]) { arr[i][j]*=2; arr[k][j]=0; break; } else break; } } } } } for(j=0;j<LEN;j++) { for(i=0;i<LEN;i++) { if(arr[i][j]==0) { for(k=i+1;k<LEN;k++) { if(arr[k][j]!=0) { arr[i][j]=arr[k][j]; arr[k][j]=0; break; } } } } } break; case 'a': for(i=0;i<LEN;i++) { for(j=0;j<LEN;j++) { if(arr[i][j]!=0) { for(k=j+1;k<LEN;k++) { if(arr[i][k]!=0) { if(arr[i][k]==arr[i][j]) { arr[i][j]*=2; arr[i][k]=0; break; } else break; } } } } } for(i=0;i<LEN;i++) { for(j=0;j<LEN;j++) { if(arr[i][j]==0) { for(k=j+1;k<LEN;k++) { if(arr[i][k]!=0) { arr[i][j]=arr[i][k]; arr[i][k]=0; break; } } } } } break; case 's': for(j=0;j<LEN;j++) { for(i=LEN-1;i>=0;i--) { if(arr[i][j]!=0) { for(k=i-1;k>=0;k--) { if(arr[k][j]!=0) { if(arr[k][j]==arr[i][j]) { arr[i][j]*=2; arr[k][j]=0; break; } else break; } } } } } for(j=0;j<LEN;j++) { for(i=LEN-1;i>=0;i--) { if(arr[i][j]==0) { for(k=i-1;k>=0;k--) { if(arr[k][j]!=0) { arr[i][j]=arr[k][j]; arr[k][j]=0; break; } } } } } break; case 'd': for(i=0;i<LEN;i++) { for(j=LEN-1;j>=0;j--) { if(arr[i][j]!=0) { for(k=j-1;k>=0;k--) { if(arr[i][k]!=0) { if(arr[i][k]==arr[i][j]) { arr[i][j]*=2; arr[i][k]=0; break; } else break; } } } } } for(i=0;i<LEN;i++) { for(j=LEN-1;j>=0;j--) { if(arr[i][j]==0) { for(k=j-1;k>=0;k--) { if(arr[i][k]!=0) { arr[i][j]=arr[i][k]; arr[i][k]=0; break; } } } } } break; } k=0; for(i=0;i<LEN;i++) { for(j=0;j<LEN;j++) { if(arr[i][j]==0) { checkZero[k]=i*LEN+j; k++; } if(arr[i][j]!=backup[i][j]) //对比处理事后的数组和原数组,若发生改变则将changed置1 changed=1; } } if((k>0)&&(changed==1)) // { srand((unsigned)time(NULL)); num=rand()%k; outNum=((num%10)<9)?2:4; // arr[checkZero[num]/LEN][checkZero[num]%LEN]=outNum; } }