C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲
更新時(shí)間:2021年07月27日 15:44:28 作者:he海ng
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
本文實(shí)例為大家分享了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單貪吃蛇游戲的具體代碼,供大家參考,具體內(nèi)容如下
用指針數(shù)組來(lái)表示蛇,p[0]表示蛇頭
控制方向:w,s,a,d-->上下左右
j,k-->加速、減速
鍵盤控制需要用到線程
編譯時(shí)需要在后面加 -lpthread


代碼:
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#define X 20
#define Y 40
char head='@';//蛇頭的形狀
char body='O';//蛇身的形狀
char a[X][Y]={'O','O','O','@'};
char *p[X*Y]={&a[0][3],&a[0][2],&a[0][1],&a[0][0]};//p[0]表示蛇頭
int n=3; //蛇身的長(zhǎng)度(不帶蛇頭)
int i,j;
int f=1; //標(biāo)志位:1.右;2.上;3.左;4.下;-1.退出
int us=200000;//用于usleep,延時(shí)0.2秒
void right()
{
*p[n]=0;
for(i=n;i>0;i--)
{
p[i]=p[i-1];
}
*p[0]=body;
p[0]=p[0]+1;//蛇頭向右移
*p[0]=head;
}
void left()
{
*p[n]=0;
for(i=n;i>0;i--)
{
p[i]=p[i-1];
}
*p[0]=body;
p[0]=p[0]-1;
*p[0]=head;
}
void down()
{
*p[n]=0;
for(i=n;i>0;i--)
{
p[i]=p[i-1];
}
*p[0]=body;
p[0]=p[0]+Y;
*p[0]=head;
}
void up()
{
*p[n]=0;
for(i=n;i>0;i--)
{
p[i]=p[i-1];
}
*p[0]=body;
p[0]=p[0]-Y;
*p[0]=head;
}
void show()
{
system("clear");
for(i=0;i<Y;i++)
printf("-");
printf("\n");
for(i=0;i<X;i++)
{
for(j=0;j<Y;j++)
{
if(a[i][j]==0)
printf(" ");
else
printf("%c",a[i][j]);
}
printf("\n");
}
for(i=0;i<Y;i++)
printf("-");
printf("\nw,s,a,d->上下左右;j,k->加減速;ESC退出\n");
}
int ran()//隨機(jī)數(shù)生成*
{
srand(time(NULL));
lb:
i=rand()%X;
j=rand()%Y;
//隨機(jī)位置的值為0,則產(chǎn)生*;否則繼續(xù)找隨機(jī)位置
if(a[i][j]==0)
a[i][j]='*';
else
goto lb;
}
void eat()
{
if(f==1)//右
{
if(*(p[0]+1)=='*')
{
n++;//長(zhǎng)度增加
p[n]=p[n-1];
ran();//隨機(jī)數(shù)生成*
}
}
if(f==2)//上
{
if(*(p[0]-Y)=='*')
{
n++;//長(zhǎng)度增加
p[n]=p[n-1];
ran();//隨機(jī)數(shù)生成*
}
}
if(f==3)//左
{
if(*(p[0]-1)=='*')
{
n++;//長(zhǎng)度增加
p[n]=p[n-1];
ran();//隨機(jī)數(shù)生成*
}
}
if(f==4)//下
{
if(*(p[0]+Y)=='*')
{
n++;//長(zhǎng)度增加
p[n]=p[n-1];
ran();//隨機(jī)數(shù)生成*
}
}
}
void fail()
{
if(p[0]<&a[0][0]||p[0]>&a[X-1][Y-1])//蛇頭不在矩陣內(nèi)
{
printf("fail!\n");
f=-1;
}
if(f==1)//右
{
for(i=n;i>0;i--)
{
if((p[0]+1)==p[i])//右邊是自己的身體
{
printf("fail!\n");
f=-1;
}
}
}
if(f==2)//上
{
for(i=n;i>0;i--)
{
if((p[0]-Y)==p[i])//上邊是自己的身體
{
printf("fail!\n");
f=-1;
}
}
}
if(f==3)//左
{
for(i=n;i>0;i--)
{
if((p[0]-1)==p[i])//左邊是自己的身體
{
printf("fail!\n");
f=-1;
}
}
}
if(f==4)//下
{
for(i=n;i>0;i--)
{
if((p[0]+Y)==p[i])//下邊是自己的身體
{
printf("fail!\n");
f=-1;
}
}
}
}
void *key(void *arg)//控制方向:w,s,a,d-->上下左右
{
char k;
while(1)
{
k=getchar();
if(k=='w')//上
f=2;
if(k=='s')//下
f=4;
if(k=='a')//左
f=3;
if(k=='d')//右
f=1;
if(k=='j')//加速
us=us*4/5;
if(k=='k')//減速
us=us*5/4;
if(k==27)//ESC
{
printf("退出!\n");
f=-1;
}
usleep(100);
}
}
int main()
{
system("stty -icanon");//關(guān)閉緩沖區(qū),輸入字符無(wú)需回車直接接受
pthread_t pid;
pthread_create(&pid , NULL , key , NULL);//創(chuàng)建線程,鍵盤控制
ran();
while(1)
{
show(); //顯示
usleep(us);
fail(); //判斷是否會(huì)咬到自己
eat(); //判斷是否能吃到*
if(f==1)//右
right();
if(f==2)//上
up();
if(f==3)//左
left();
if(f==4)//下
down();
if(f==-1)//退出
{
pthread_cancel(pid);//關(guān)閉線程
return -1;
}
}
return 0;
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:
相關(guān)文章
基于QT設(shè)計(jì)一個(gè)春聯(lián)自動(dòng)生成器
春節(jié)是中國(guó)最隆重的傳統(tǒng)節(jié)日,一到過(guò)年家家戶戶肯定是要貼春聯(lián);在春節(jié)前夕,會(huì)用大紅紙張,加上濃墨書(shū)寫祝福詞語(yǔ)。本文將利用Qt框架設(shè)計(jì)一個(gè)春聯(lián)自動(dòng)生成器,需要的可以參考一下2022-01-01
QT實(shí)現(xiàn)自定義Http客戶端的示例代碼
這篇文章主要為大家詳細(xì)介紹了QT如何實(shí)現(xiàn)自定義Http客戶端的,可以實(shí)現(xiàn)支持get,post請(qǐng)求方式;支持連接超時(shí)處理;支持網(wǎng)絡(luò)錯(cuò)誤,嘗試重連等功能,感興趣的小伙伴可以學(xué)習(xí)一下2022-11-11

