貪吃蛇(也叫做貪食蛇)游戲是一款休閑益智類(lèi)游戲,有PC和手機(jī)等多平臺(tái)版本。既簡(jiǎn)單又耐玩。該游戲通過(guò)控制蛇頭方向吃蛋,從而使得蛇變得越來(lái)越長(zhǎng)。
我們的今天的目標(biāo)就是:用C語(yǔ)言來(lái)實(shí)現(xiàn)一個(gè)貪吃蛇項(xiàng)目,也不用太復(fù)雜c語(yǔ)言小游戲程序c語(yǔ)言小游戲程序,初學(xué)者能看懂就行!
貪吃蛇小程序,主要采用C語(yǔ)言描述,采用數(shù)組進(jìn)行數(shù)據(jù)存儲(chǔ)的圖形化操作界面,會(huì)涉及一點(diǎn)點(diǎn)C++ 知識(shí)(特別少的一點(diǎn)點(diǎn)),但是有C語(yǔ)言基礎(chǔ)就夠用了,編譯器:,會(huì)涉及部分庫(kù)函數(shù)的安裝及使用,不過(guò)也很簡(jiǎn)單啦!
效果展示:
看到了這個(gè)效果之后,那我們就動(dòng)手來(lái)實(shí)現(xiàn)吧!
希望大家都能輕松實(shí)現(xiàn)這個(gè)項(xiàng)目!另外涉及到的# 需要額外安裝圖形庫(kù)插件easyX哦~
代碼如下:
int score = 0;
int gamespeed = 100; //蛇運(yùn)行速度
static void Init(void); /*圖形驅(qū)動(dòng)*/
static void Close(void); /*圖形結(jié)束*/
static void Game_interface(void); /*游戲界面*/
static void GameOver(void); /*結(jié)束游戲*/
static void GamePlay(void); /*游戲過(guò)程*/
static void PrScore(void); /*輸出成績(jī)*/
/*主函數(shù)*/
int main(void)
{
Init();
Game_interface();
GamePlay();
Close();
return 0;
}
/*圖形驅(qū)動(dòng)*/
static void Init(void)
{
int gd=9,gm=2;
initgraph(&gd,&gm," ");
cleardevice();
}
/* 開(kāi)始畫(huà)面,左上角坐標(biāo)為(50,40),右下角坐標(biāo)為(610,460)的圍墻 */
static void Game_interface(void)
{
int i;
setcolor(LIGHTCYAN); /*setbkcolor(LIGHTGREEN);*/
setlinestyle(PS_SOLID,0,1); /*設(shè)置線(xiàn)型*/
for(i=50;i<=600;i+=10) /*畫(huà)邊框*/
{
rectangle(i,40,i+10,49); /*上邊框*/
rectangle(i,451,i+10,460); /*下邊框*/
}
for(i=40;i<=450;i+=10)
{
rectangle(50,i,59,i+10); /*左邊框*/
rectangle(601,i,610,i+10); /*右邊框*/
}
}
/* 游戲主函數(shù) */
static void GamePlay(void)
{
int i;
srand(time(NULL)); /*隨機(jī)數(shù)發(fā)生器*/
food.yes = 1; /*1表示需要出現(xiàn)新食物,0表示已經(jīng)存在食物*/
snake.life = 0; /*活著*/
snake.direction = 1; /*方向往右*/
snake.x[0] = 100;
snake.y[0] = 100;
snake.x[1] = 110;
snake.y[1] = 100;
snake.node = 2; /*節(jié)數(shù)*/
PrScore(); /*輸出得分*/
while(1) /*可以重復(fù)玩游戲,壓ESC鍵結(jié)束*/
{
while( !kbhit() ) /*在沒(méi)有按鍵的情況下,蛇自己移動(dòng)*/
{
if(food.yes == 1) /*需要出現(xiàn)新食物*/
{
food.x = rand()%400 + 60;
food.y = rand()%350 + 60;
while(food.x%10 != 0) /*食物隨機(jī)出現(xiàn)后必須讓食物能夠在整格內(nèi),這樣才可以讓蛇吃到*/
food.x++;
while(food.y%10 != 0)
food.y++;
food.yes = 0; /*畫(huà)面上有食物了*/
}
if(food.yes == 0) /*畫(huà)面上有食物了就要顯示*/
{
setcolor(GREEN);
rectangle(food.x,food.y,food.x + 10,food.y - 10);
}
for(i=snake.node-1;i>0;i--) /*蛇的每個(gè)環(huán)節(jié)往前移動(dòng),也就是貪吃蛇的關(guān)鍵算法*/
{
snake.x[i] = snake.x[i-1];
snake.y[i] = snake.y[i-1];
}
/*1,2,3,4表示右,左,上,下四個(gè)方向,通過(guò)這個(gè)判斷來(lái)移動(dòng)蛇頭*/
switch(snake.direction)
{
case 1:
snake.x[0] += 10;
break;
case 2:
snake.x[0] -= 10;
break;
case 3:
snake.y[0] -= 10;
break;
case 4:
snake.y[0] += 10;
break;
}
/* 從蛇的第四節(jié)開(kāi)始判斷是否撞到自己 */
for(i=3;i
{
if((snake.x[i] == snake.x[0]) && (snake.y[i] == snake.y[0]))
{
GameOver(); /*顯示失敗*/
snake.life = 1;
break;
}
}
if((snake.x[0] < 55) || (snake.x[0] > 595) || (snake.y[0] < 55) || (snake.y[0] > 455)) /*蛇是否撞到墻壁*/
{
GameOver(); /*本次游戲結(jié)束*/
snake.life = 1; /*蛇死*/
}
if(snake.life == 1) /*以上兩種判斷以后,如果蛇死就跳出內(nèi)循環(huán),重新開(kāi)始*/
break;
if((snake.x[0] == food.x) && (snake.y[0] == food.y)) /*吃到食物以后*/
{
setcolor(BLACK); /*把畫(huà)面上的食物東西去掉*/
rectangle(food.x,food.y,food.x+10,food.y-10);
snake.x[snake.node] = -20;
snake.y[snake.node] = -20;
/* 新的一節(jié)先放在看不見(jiàn)的位置,下次循環(huán)就取前一節(jié)的位置 */
snake.node++; /*蛇的身體長(zhǎng)一節(jié)*/
food.yes = 1; /*畫(huà)面上需要出現(xiàn)新的食物*/
score += 10;
PrScore(); /*輸出新得分*/
}
setcolor(RED); /*畫(huà)出蛇*/
for(i=0;i
rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10);
Sleep(gamespeed);
setcolor(BLACK); /*用黑色去除蛇的的最后一節(jié)*/
rectangle(snake.x[snake.node-1],snake.y[snake.node-1],
snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);
} /*endwhile(!kbhit)*/
if(snake.life == 1) /*如果蛇死就跳出循環(huán)*/
break;
key=getch(); /*接收按鍵*/
if (key == ESC) break; /*按ESC鍵退出*/
switch(key)
{
case UP:
if(snake.direction != 4) /*判斷是否往相反的方向移動(dòng)*/
snake.direction = 3;
break;
case RIGHT:
if(snake.direction != 2)
snake.direction = 1;
break;
case LEFT:
if(snake.direction != 1)
snake.direction = 2;
break;
case DOWN:
if(snake.direction != 3)
snake.direction = 4;
break;
}
}/*endwhile(1)*/
}
/*游戲結(jié)束*/
static void GameOver(void)
{
cleardevice();
PrScore();
setcolor(RED);
setfont(56,0,"黑體");
outtextxy(200,200,"GAME OVER");
getch();
}
/*輸出成績(jī)*/
static void PrScore(void)
{
char str[10];
setfillstyle(YELLOW);
bar(50,15,220,35);
setcolor(BROWN);
setfont(16,0,"宋體");
sprintf(str,"score:%d",score);
outtextxy(55,16,str);
}
static void Close(void)
{
closegraph();
}
char key; /*控制按鍵*/
struct Food
{
int x; /*食物的橫坐標(biāo)*/
int y; /*食物的縱坐標(biāo)*/
int yes; /*判斷是否要出現(xiàn)食物的變量*/
}food; /*食物的結(jié)構(gòu)體*/
struct Snake
{
int x[N];
int y[N];
int node; /*蛇的節(jié)數(shù)*/
int direction; /*蛇移動(dòng)方向*/
int life; /* 蛇的生命,0活著,1死亡*/
}snake;
此外,我也給大家分享我收集的其他資源,從最零基礎(chǔ)開(kāi)始的教程到C語(yǔ)言C++項(xiàng)目案例,幫助大家在學(xué)習(xí)C語(yǔ)言的道路上披荊斬棘!
整理分享(多年學(xué)習(xí)的源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門(mén)教程)最重要的是你可以在群里面交流提問(wèn)編程問(wèn)題哦!
歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長(zhǎng)比自己琢磨更快哦!
友情鏈接: 餐飲加盟
地址:北京市海淀區(qū) 電話(huà):010- 郵箱:@126.com
備案號(hào):冀ICP備2024067069號(hào)-3 北京科技有限公司版權(quán)所有