用C語言實現2048遊戲
本文實例為大傢分享瞭用C語言實現2048遊戲的具體代碼,供大傢參考,具體內容如下
我遇到的幾個問題:
問題1:如何顯示?
system(“clear”);//清屏
每次發生變化就清屏一次,再把內容打印出來
問題2:怎麼用鍵盤控制?
w,s,a,d–>上下左右
system(“stty -icanon”);//關閉緩沖區,輸入字符無需回車直接接受
問題3:隨機位置?
用srand()與rand()產生隨機數(x,y),再判斷位置(x,y)是否為空格,不是空格就繼續產生隨機位置;若該位置為空格,則隨機賦值2或4.
代碼:
#include <stdio.h> #include <stdlib.h> #include <time.h> int a[4][4]; int i,j,k; int move_up() { int f=0;//有移動過,則f=1,沒移動過則為0 for(j=0;j<4;j++) { for(i=1;i<4;i++) { if(a[i][j]!=0)//找到不是0的數 { for(k=0;k<i;k++) { if(a[k][j]==0)//其上的第一個0 { a[k][j]=a[i][j]; a[i][j]=0; f=1; break; } } } } } return f; } int move_down() { int f=0; for(j=0;j<4;j++) { for(i=2;i>=0;i--) { if(a[i][j]!=0) { for(k=3;k>i;k--) { if(a[k][j]==0) { a[k][j]=a[i][j]; a[i][j]=0; f=1; break; } } } } } return f; } int move_left() { int f=0; for(i=0;i<4;i++) { for(j=1;j<4;j++) { if(a[i][j]!=0) { for(k=0;k<j;k++) { if(a[i][k]==0) { a[i][k]=a[i][j]; a[i][j]=0; f=1; break; } } } } } return f; } int move_right() { int f=0; for(i=0;i<4;i++) { for(j=2;j>=0;j--) { if(a[i][j]!=0) { for(k=3;k>j;k--) { if(a[i][k]==0) { a[i][k]=a[i][j]; a[i][j]=0; f=1; break; } } } } } return f; } int up() { int f=0;//合並過,f=1,沒和並過則為0 //移動 int f1=move_up();//移動過f1=1 //合並 for(j=0;j<4;j++) { for(i=0;i<3;i++) { if(a[i][j]==a[i+1][j]&&a[i][j]!=0) { a[i][j]=2*a[i][j]; a[i+1][j]=0; f=1; } } } if(f==1)//若合並後可能產生的空位,再移動 move_up(); return (f||f1);//移動過或合並過,則返回1;否則返回0 } int down() { int f=0; //移動 int f1=move_down(); //合並 for(j=0;j<4;j++) { for(i=3;i>0;i--) { if(a[i][j]==a[i-1][j]&&a[i][j]!=0) { a[i][j]=2*a[i][j]; a[i-1][j]=0; f=1; } } } if(f==1)//若合並後產生的空位, move_down(); return (f||f1); } int left() { int f=0; //移動 int f1=move_left(); //合並 for(i=0;i<4;i++) { for(j=0;j<3;j++) { if(a[i][j]==a[i][j+1]&&a[i][j]!=0) { a[i][j]=2*a[i][j]; a[i][j+1]=0; f=1; } } } if(f==1)//若合並後產生的空位, move_left(); return (f||f1); } int right() { int f=0; //移動 int f1=move_right(); //合並 for(i=3;i>=0;i--) { for(j=3;j>0;j--) { if(a[i][j]==a[i][j-1]&&a[i][j]!=0) { a[i][j]=2*a[i][j]; a[i][j-1]=0; f=1; } } } if(f==1)//若合並後產生的空位, move_right(); return (f||f1); } int ran()//隨機數 { int z[8]={2,2,2,2,2,2,2,4};//出現2的概率比出現4的概率大 srand(time(NULL)); lb: i=rand()%4; j=rand()%4; //隨機位置的值為0,則隨機賦值2或4;否則繼續找隨機位置 if(a[i][j]==0) a[i][j]=z[rand()%8]; else goto lb; } int fail()//失敗 { int count=0; for(i=0;i<4;i++) { for(j=0;j<3;j++) { if(a[i][j]==a[i][j+1])//左右相鄰相等--》還沒輸 { return 0; } } } for(i=0;i<3;i++) { for(j=0;j<4;j++) { if(a[i][j]==a[i+1][j])//上下相鄰相等--》還沒輸 { return 0; } } } for(i=0;i<4;i++) { for(j=0;j<4;j++) { if(a[i][j]==0)//統計空格的個數 { count++; } } } if(count==0)//沒有空格 { printf("\n很遺憾!你離成功就差一點瞭!\n"); return 1; } return 0; } int main() { char n;//w,s,a,d-->上下左右 system("stty -icanon");//關閉緩沖區,輸入字符無需回車直接接受 ran(); while(1) { //產生隨機數 ran(); //顯示 system("clear");//清屏 printf("\n---------------------------------\n"); for(i=0;i<4;i++) { printf("|"); for(j=0;j<4;j++) { if(a[i][j]==0) printf(" |"); else printf("%5d |",a[i][j]); } printf("\n---------------------------------\n"); } printf("\n\nw,s,a,d-->上下左右;ESC退出遊戲!\n"); lab: n=getchar(); switch(n) { case 'w': //上 if(0==up())//若既不移動又不合並 { if(1==fail())//判斷是不是遊戲失敗 return -1; else goto lab; } break; case 's': //下 if(0==down()) { if(1==fail()) return -1; else goto lab; } break; case 'a': //左 if(0==left()) { if(1==fail()) return -1; else goto lab; } break; case 'd': //右 if(0==right()) { if(1==fail()) return -1; else goto lab; } break; case 27: //ESC printf("\n退出遊戲!\n"); return 0; default: goto lab; } //判斷是否勝利 for(i=0;i<4;i++) { for(j=0;j<4;j++) { if(a[i][j]==2048)//數值為2048,遊戲勝利 { printf("\n恭喜你!遊戲勝利!\n"); return 1;//退出 } } } } return 0; }
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。