用C語(yǔ)言實(shí)現(xiàn)2048游戲
本文實(shí)例為大家分享了用C語(yǔ)言實(shí)現(xiàn)2048游戲的具體代碼,供大家參考,具體內(nèi)容如下
我遇到的幾個(gè)問(wèn)題:
問(wèn)題1:如何顯示?
system("clear");//清屏
每次發(fā)生變化就清屏一次,再把內(nèi)容打印出來(lái)
問(wèn)題2:怎么用鍵盤(pán)控制?
w,s,a,d-->上下左右
system("stty -icanon");//關(guān)閉緩沖區(qū),輸入字符無(wú)需回車(chē)直接接受
問(wèn)題3:隨機(jī)位置?
用srand()與rand()產(chǎn)生隨機(jī)數(shù)(x,y),再判斷位置(x,y)是否為空格,不是空格就繼續(xù)產(chǎn)生隨機(jī)位置;若該位置為空格,則隨機(jī)賦值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;//有移動(dòng)過(guò),則f=1,沒(méi)移動(dòng)過(guò)則為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)//其上的第一個(gè)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;//合并過(guò),f=1,沒(méi)和并過(guò)則為0 //移動(dòng) int f1=move_up();//移動(dòng)過(guò)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)生的空位,再移動(dòng) move_up(); return (f||f1);//移動(dòng)過(guò)或合并過(guò),則返回1;否則返回0 } int down() { int f=0; //移動(dòng) 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; //移動(dòng) 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; //移動(dòng) 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()//隨機(jī)數(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; //隨機(jī)位置的值為0,則隨機(jī)賦值2或4;否則繼續(xù)找隨機(jī)位置 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])//左右相鄰相等--》還沒(méi)輸 { return 0; } } } for(i=0;i<3;i++) { for(j=0;j<4;j++) { if(a[i][j]==a[i+1][j])//上下相鄰相等--》還沒(méi)輸 { return 0; } } } for(i=0;i<4;i++) { for(j=0;j<4;j++) { if(a[i][j]==0)//統(tǒng)計(jì)空格的個(gè)數(shù) { count++; } } } if(count==0)//沒(méi)有空格 { printf("\n很遺憾!你離成功就差一點(diǎn)了!\n"); return 1; } return 0; } int main() { char n;//w,s,a,d-->上下左右 system("stty -icanon");//關(guān)閉緩沖區(qū),輸入字符無(wú)需回車(chē)直接接受 ran(); while(1) { //產(chǎn)生隨機(jī)數(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())//若既不移動(dòng)又不合并 { 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; }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Qt鍵盤(pán)事件實(shí)現(xiàn)圖片在窗口上下左右移動(dòng)
這篇文章主要為大家詳細(xì)介紹了Qt鍵盤(pán)事件實(shí)現(xiàn)圖片在窗口上下左右移動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08詳解C語(yǔ)言中的符號(hào)常量、變量與算術(shù)表達(dá)式
這篇文章主要介紹了C語(yǔ)言中的符號(hào)常量、變量與算術(shù)表達(dá)式,是C語(yǔ)言入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-11-11C++設(shè)計(jì)模式編程中的觀(guān)察者模式使用示例
這篇文章主要介紹了C++設(shè)計(jì)模式編程中的觀(guān)察者模式使用示例,觀(guān)察者模式在被觀(guān)察者和觀(guān)察者之間建立一個(gè)抽象的耦合,需要的朋友可以參考下2016-03-03C++中malloc與free、new與delete的詳解與應(yīng)用
今天小編就為大家分享一篇關(guān)于C++中malloc與free、new與delete的詳解與應(yīng)用,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12簡(jiǎn)單總結(jié)C++中的修飾符類(lèi)型
這篇文章主要介紹了C++中的修飾符類(lèi)型總結(jié),是C++入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2016-05-05C++實(shí)現(xiàn)inline hook的原理及應(yīng)用實(shí)例
這篇文章主要介紹了C++實(shí)現(xiàn)inline hook的原理及應(yīng)用,需要的朋友可以參考下2014-08-08