用C語言實現(xiàn)2048游戲
本文實例為大家分享了用C語言實現(xiàn)2048游戲的具體代碼,供大家參考,具體內(nèi)容如下
我遇到的幾個問題:
問題1:如何顯示?
system("clear");//清屏
每次發(fā)生變化就清屏一次,再把內(nèi)容打印出來
問題2:怎么用鍵盤控制?
w,s,a,d-->上下左右
system("stty -icanon");//關閉緩沖區(qū),輸入字符無需回車直接接受
問題3:隨機位置?
用srand()與rand()產(chǎn)生隨機數(shù)(x,y),再判斷位置(x,y)是否為空格,不是空格就繼續(xù)產(chǎn)生隨機位置;若該位置為空格,則隨機賦值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的數(shù) { 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)//若合并后可能產(chǎn)生的空位,再移動 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)//若合并后產(chǎn)生的空位, 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)//若合并后產(chǎn)生的空位, 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)//若合并后產(chǎn)生的空位, move_right(); return (f||f1); } int ran()//隨機數(shù) { int z[8]={2,2,2,2,2,2,2,4};//出現(xiàn)2的概率比出現(xiàn)4的概率大 srand(time(NULL)); lb: i=rand()%4; j=rand()%4; //隨機位置的值為0,則隨機賦值2或4;否則繼續(xù)找隨機位置 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)//統(tǒng)計空格的個數(shù) { count++; } } } if(count==0)//沒有空格 { printf("\n很遺憾!你離成功就差一點了!\n"); return 1; } return 0; } int main() { char n;//w,s,a,d-->上下左右 system("stty -icanon");//關閉緩沖區(qū),輸入字符無需回車直接接受 ran(); while(1) { //產(chǎn)生隨機數(shù) 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)//數(shù)值為2048,游戲勝利 { printf("\n恭喜你!游戲勝利!\n"); return 1;//退出 } } } } return 0; }
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
C++中malloc與free、new與delete的詳解與應用
今天小編就為大家分享一篇關于C++中malloc與free、new與delete的詳解與應用,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12C++實現(xiàn)inline hook的原理及應用實例
這篇文章主要介紹了C++實現(xiàn)inline hook的原理及應用,需要的朋友可以參考下2014-08-08