C語(yǔ)言代碼實(shí)現(xiàn)2048游戲
我是大一新生,在寒假的實(shí)訓(xùn)課上老師讓我們用c語(yǔ)言分組編程一個(gè)小游戲,我們組選的是“2048”。由于我們組上有一個(gè)大神,于是我們把大部分的工作交給了大神做,但是實(shí)訓(xùn)完成之后我感覺(jué)到碌碌無(wú)為,什么也沒(méi)學(xué)到,自己對(duì)于c語(yǔ)言的理解也僅僅局限于書(shū)本之上,想到那些大神們已經(jīng)基本可以自己編程一些小游戲了,心里就非常著急。于是利用這個(gè)寒假,我自己獨(dú)立完成了“2048”小游戲的編程。
游戲代碼我是用Xcode編的,我是IOS小白,有些頭文件在Xcode中不能使用而我又找不到可以替代的,所以一些功能就不能實(shí)現(xiàn)比如清屏功能和儲(chǔ)存數(shù)據(jù)的功能還有音樂(lè)功能,不僅如此還存在數(shù)字對(duì)不齊的問(wèn)題。希望可以有大神能夠指導(dǎo)我,萬(wàn)分感激!
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<curses.h>
/*頭文件*/
int i,j,a[4][4]={};/*二維數(shù)組a[4][4]全為0*/
void kaishi()/*生成開(kāi)始界面*/
{
printf("Welcome to 2048\n");
printf(" 1).新游戲\n");
printf(" 2).幫助\n");
}
int defen(int a[][4])/*計(jì)分函數(shù)*/
{
int max=a[0][0];
int static sum=0;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(a[i][j]>max)
max=a[i][j];
sum+=max;
return sum;/*以最大數(shù)的累加作為得分*/
}
void jiemian(int a[][4])
{
int b[2]={2,4},c[4]={0,1,2,3},sum,n,m;
do
{
srand((int)time(NULL));/*以時(shí)間作為隨機(jī)數(shù)種子*/
m=c[rand()%4];
n=c[rand()%4];
/*隨機(jī)生成坐標(biāo)*/
if(a[m][n]==0)/*判斷是否為空格*/
{
a[m][n]=b[rand()%2];/*隨機(jī)生成2或4*/
break;/*跳出循環(huán)*/
}
}while(1);
printf("%d %d %d\n",m,n,a[m][n]);
for(i=0;i<4;i++)
{
printf("-------------------------\n");
for(j=0;j<4;j++)
{
if((m==i)&&(n==j))
printf("| %d ",a[m][n]);/*輸出隨機(jī)生成的2或4*/
else
{
if(a[i][j]>0)
printf("| %d ",a[i][j]);/*如果a[i][j]有數(shù)字,則輸出數(shù)字*/
else
printf("| ");/*如果a[i][j]無(wú)數(shù)字則輸出空格*/
}
}
printf("|\n");
}
printf("-------------------------\n");
printf(" 得分:%d\n",sum=defen(a));
}
void hebingup(int a[][4])/*向上合并*/
{
int m;
for(j=0;j<4;j++)
for(i=0;i<3;i++)
if(a[i][j]>0)/*若a[i][j]不為0則進(jìn)行判斷,否則直接跳到下一項(xiàng)*/
if(a[i][j]==a[i+1][j]&&a[i][j]!=0)/*判讀相鄰兩項(xiàng)是否相等*/
{
a[i][j]=2*a[i][j];/*上面一項(xiàng)變成兩倍*/
if(i==2)
a[i+1][j]=0;
else
for(m=i+1;m<3;m++)
{
a[m][j]=a[m+1][j];
a[m+1][j]=0;
}
/*將下面的數(shù)整體上移,再循環(huán)*/
}
}
void hebingdown(int a[][4])/*向下合并*/
{
int m;
for(j=0;j<4;j++)
for(i=3;i>0;i--)
if(a[i][j]>0)
if(a[i][j]==a[i-1][j])
{
a[i][j]=2*a[i][j];
if(i==1)
a[i-1][j]=0;
else
for(m=i-1;m>0;m--)
{
a[m][j]=a[m-1][j];
a[m-1][j]=0;
}
}
}
void hebingleft(int a[][4])/*向左合并*/
{
int m;
for(i=0;i<4;i++)
for(j=0;j<3;j++)
if(a[i][j]>0)
if(a[i][j]==a[i][j+1])
{
a[i][j]=2*a[i][j];
if(j==2)
a[i][j+1]=0;
else
for(m=j+1;m<3;m++)
{
a[i][m]=a[i][m+1];
a[i][m+1]=0;
}
}
}
void hebingright(int a[][4])/*向右合并*/
{
int m;
for(i=0;i<4;i++)
for(j=3;j>0;j--)
if(a[i][j]>0)
if(a[i][j]==a[i][j-1])
{
a[i][j]=2*a[i][j];
if(j==1)
a[i][j-1]=0;
else
for(m=j-1;m>0;m--)
{
a[i][m]=a[i][m-1];
a[i][m-1]=0;
}
}
}
void yidong(char b)
{
int x,m;
switch(b)
{
case 'w' :
for(j=0;j<4;j++)
for(i=1;i<=3;i++)
for(x=i,m=i;x>0;x--,m--)/*x為循環(huán)次數(shù),m替代i使循環(huán)繼續(xù)*/
{
if(a[m-1][j]>0)
break;/*若上一位非0,則跳到下一位*/
else
{
a[m-1][j]=a[m][j];
a[m][j]=0;
}
}
hebingup(a);
break;
case 's' :
for(j=0;j<4;j++)
for(i=2;i>=0;i--)
for(x=3-i,m=i;x>0;x--,m++)
{
if(a[m+1][j]>0)
break;
else
{
a[m+1][j]=a[m][j];
a[m][j]=0;
}
}
hebingdown(a);
break;
case 'a' :
for(i=0;i<4;i++)
for(j=1;j<=3;j++)
for(x=j,m=j;x>0;x--,m--)
{
if(a[i][m-1]>0)
break;
else
{
a[i][m-1]=a[i][m];
a[i][m]=0;
}
}
hebingleft(a);
break;
case 'd' :
for(i=0;i<4;i++)
for(j=2;j>=0;j--)
for(x=3-j,m=j;x>0;x--,m++)
{
if(a[i][m+1]>0)
break;
else
{
a[i][m+1]=a[i][m];
a[i][m]=0;
}
}
hebingright(a);
break;
}
}
int main(int argc,char *argv[])
{
int flag=1;
char c,k;
system("stty -icanon");
outloop:;
kaishi();
k=getchar();
printf("\n");
if(k=='1')
{
while(flag==1)
{
jiemian(a);
c=getchar();
printf("\n");
yidong(c);
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
if(a[i][j]==0)
{
flag=1;
goto end;/*如果棋盤(pán)中存在一個(gè)空格,則跳出判斷,繼續(xù)生成隨機(jī)數(shù)*/
}
else
flag=0;
}
end:;
}
}
if(k=='2')
{
do
{
printf("游戲規(guī)則:通過(guò)點(diǎn)擊<w>,<s>,<a>,<d>鍵來(lái)實(shí)現(xiàn)數(shù)字的上下左右的移動(dòng),使相同的數(shù)字相加,每個(gè)格子中的數(shù)的累加將作為得分,當(dāng)格子填滿(mǎn)且無(wú)法移動(dòng)時(shí),游戲結(jié)束。\n");
printf(" 3).返回\n");
k=getchar();
}while(k!=3);
goto outloop;/*跳到開(kāi)始界面*/
}
printf(" 游戲結(jié)束\n");
return 0;
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++保存HBITMAP為位圖文件的實(shí)現(xiàn)方法
這篇文章主要介紹了C++保存HBITMAP為位圖文件的實(shí)現(xiàn)方法,幫助大家更好的理解和使用c++,感興趣的朋友可以了解下2021-01-01
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之雙向循環(huán)鏈表的實(shí)例
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之雙向循環(huán)鏈表的實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-06-06
C語(yǔ)言實(shí)現(xiàn)二叉樹(shù)的基本操作
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)二叉樹(shù)的基本操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11
C語(yǔ)言結(jié)構(gòu)體簡(jiǎn)單入門(mén)講解
這篇文章主要介紹了C語(yǔ)言結(jié)構(gòu)體簡(jiǎn)單入門(mén)講解,本文講述了結(jié)構(gòu)體的基本定義和操作,講解了幾個(gè)比較實(shí)用的函數(shù)和案例,希望對(duì)你有所幫助2021-06-06
C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單餐飲管理與點(diǎn)餐系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單餐飲管理與點(diǎn)餐系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
C++?JSON庫(kù)?nlohmann::basic_json::accept的用法解析
nlohmann::basic_json::accept 是 Nlohmann JSON 庫(kù)中的一個(gè)方法,它用于檢查一個(gè)字符串是否可以解析為有效的 JSON,這篇文章主要介紹了C++?JSON庫(kù)nlohmann::basic_json::accept的用法,需要的朋友可以參考下2023-06-06

