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