C語(yǔ)言實(shí)現(xiàn)貪吃蛇游戲(單人版)
本文實(shí)例為大家分享了C語(yǔ)言實(shí)現(xiàn)貪吃蛇游戲的具體代碼,供大家參考,具體內(nèi)容如下
相比于第一個(gè):貪吃蛇游戲,功能更加豐富
#include"snake.h"
//蛇的移動(dòng)
void move_snake();
//畫(huà)出蛇
void draw_snake();
//產(chǎn)生食物
void creatfood();
//判斷蛇是否吃到食物
void eatfood();
//判斷蛇是否死掉
void SnakeState();
int main()
{
//設(shè)置窗口大小
system("mode con cols=110 lines=31");
//設(shè)置標(biāo)題
SetConsoleTitleA("貪吃蛇");
//播放bgm
playmusic();
//初始化蛇
begin:
snake.CH = VK_RIGHT;//初始化方向
snake.len = 5; //初始化長(zhǎng)度
snake.SPEED = 100;//初始化蛇的移動(dòng)速度
snake.coord[1].x = SCREEN_WIDETH / 2;//初始化蛇頭的坐標(biāo)
snake.coord[1].y = SCREEN_HEIGHT / 2;
snake.coord[2].x = SCREEN_WIDETH / 2-2;//初始化蛇頭的坐標(biāo)
snake.coord[2].y = SCREEN_HEIGHT / 2;
snake.coord[3].x = SCREEN_WIDETH / 2-4;//初始化蛇頭的坐標(biāo)
snake.coord[3].y = SCREEN_HEIGHT / 2;
//初始化食物狀態(tài)
food.flag = 1;//1表示吃到食物 0表示沒(méi)有吃到食物
//初始化食物狀態(tài)
snake.flag = 1;//1活 0死
init_sence();//初始化游戲界面
while (1)
{
colormap();
gotoxy(0, 0);
printf("■");
HuiFu();
setcolor();
draw_snake();//畫(huà)蛇
Sleep(snake.SPEED);//蛇的移動(dòng)速度
move_snake();//移動(dòng)蛇
if(food.flag)
creatfood();//產(chǎn)生食物
eatfood();//判斷是否吃到食物
SnakeState();//判斷蛇是否死亡
if (!snake.flag)break;
}
system("cls");
gotoxy(SCREEN_WIDETH/2, SCREEN_HEIGHT/2-4);
printf(" GAME OVER!!!");
gotoxy(SCREEN_WIDETH / 2-6, SCREEN_HEIGHT / 2+2);
printf("你的得分是:\t\t\t%d ",snake.len-1);
gotoxy(SCREEN_WIDETH / 2-6, SCREEN_HEIGHT / 2+4);
printf("我不服再來(lái):\t\t\tCTRL ");
gotoxy(SCREEN_WIDETH / 2-6, SCREEN_HEIGHT / 2+6);
printf("算了垃圾游戲毀我青春:\t\tESC");
while (1)
{
if (GetAsyncKeyState(VK_CONTROL))
{
system("cls");
goto begin;
}
else if (GetAsyncKeyState(VK_ESCAPE))
return 0;
}
}
//蛇的移動(dòng)
void move_snake()
{
//判斷是否有按鍵操作
if (GetAsyncKeyState(up))
{
if(snake.CH!=down)snake.CH = up;
}
else if (GetAsyncKeyState(down))
{
if (snake.CH != up)snake.CH = down;
}
else if (GetAsyncKeyState(right))
{
if (snake.CH != left)snake.CH = right;
}
else if (GetAsyncKeyState(left))
{
if (snake.CH != right)snake.CH = left;
}
else if (GetAsyncKeyState(VK_F1))
{
if(snake.SPEED>=50)snake.SPEED -= 10;
}
else if (GetAsyncKeyState(VK_F2))
{
if (snake.SPEED <= 100)snake.SPEED += 10;
}
//游戲難度設(shè)置
if (snake.len >= 30 && snake.SPEED >= 10)snake.SPEED -= 2;
//根據(jù)檢測(cè)到的方向改變蛇頭的位置
switch (snake.CH)
{
case right:snake.coord[1].x += 2; break;
case left:snake.coord[1].x -= 2; break;
case up:snake.coord[1].y -= 1; break;
case down:snake.coord[1].y += 1; break;
}
}
//畫(huà)出蛇
void draw_snake()
{
//畫(huà)出蛇頭
gotoxy(snake.coord[1].x, snake.coord[1].y);
printf("□");
//畫(huà)出蛇身,直接一個(gè)for循環(huán)實(shí)現(xiàn)
for (int i = 2; i < snake.len; i++)
{
gotoxy(snake.coord[i].x, snake.coord[i].y);
printf("□");
}
//擦掉尾巴
HuiFu();
gotoxy(snake.coord[snake.len].x, snake.coord[snake.len].y);
printf(" ");
//遍歷每一節(jié)蛇
for (int i = snake.len; i >1; i--)
{
snake.coord[i].x = snake.coord[i - 1].x;
snake.coord[i].y = snake.coord[i - 1].y;
}
gotoxy(0, 0);
printf("■");
gotoxy(85, 25);
printf("得分:%d ", snake.len-1);
gotoxy(85, 22);
printf("速度:%dms/步 ", snake.SPEED);
}
//產(chǎn)生食物
void creatfood()
{
//隨機(jī)種子生成
srand((unsigned)time(NULL));
if(food.flag)
while (1)
{
food.x = rand() % 80;
food.y = rand() % 30;
if (food.x % 2 == 0 && food.x >= 2 && food.x <= 78 && food.y > 1 && food.y < 30)
{
int flag = 0;
//判斷產(chǎn)生的食物可不可能在蛇的身體上
for (int i = 1; i <= snake.len; i++)
{
if (snake.coord[i].x == food.x&&snake.coord[i].y == food.y)
{
flag = 1;
break;
}
}
if (flag)continue;
//繪制食物
else
{
colorfood();
gotoxy(food.x, food.y);
printf("⊙");
HuiFu();
food.flag = 0;
break;
}
}
}
food.flag = 0;
}
//判斷蛇是否吃到食物
void eatfood()
{
//只需要判斷蛇頭是否與食物重合
if (food.x == snake.coord[1].x&&food.y == snake.coord[1].y)
{
snake.len+=1;
food.flag = 1;
}
}
//判斷蛇是否死掉
void SnakeState()
{
if (snake.coord[1].x < 2 || snake.coord[1].x>78 || snake.coord[1].y < 1 || snake.coord[1].y>29)
snake.flag = 0;
for (int i = 2; i <= snake.len; i++)
{
if (snake.coord[1].x == snake.coord[i].x&&snake.coord[1].y == snake.coord[i].y)
snake.flag = 0;
}
}
更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專(zhuān)題,分享給大家:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語(yǔ)言切割多層字符串(strtok_r strtok使用方法)
這篇文章主要介紹了C語(yǔ)言切割多層字符串的方法,說(shuō)了strtok的弱點(diǎn),使用strtok_r的方法2013-11-11
C語(yǔ)言文件操作函數(shù)freopen詳細(xì)解析
替換一個(gè)流,或者說(shuō)重新分配文件指針,實(shí)現(xiàn)重定向。如果stream流已經(jīng)打開(kāi),則先關(guān)閉該流。如果該流已經(jīng)定向,則freopen將會(huì)清除該定向。此函數(shù)一般用于將一個(gè)指定的文件打開(kāi)一個(gè)預(yù)定義的流:標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出或者標(biāo)準(zhǔn)出錯(cuò)2013-10-10
一篇文章帶你了解C語(yǔ)言:入門(mén)基礎(chǔ)(2)
這篇文章主要介紹了C語(yǔ)言入門(mén)之基礎(chǔ)知識(shí)詳解,文中有非常詳細(xì)的C語(yǔ)言使用教程及相關(guān)基礎(chǔ)知識(shí),對(duì)正在學(xué)習(xí)c語(yǔ)言的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-08-08
C語(yǔ)言堆結(jié)構(gòu)處理TopK問(wèn)題詳解
TopK問(wèn)題即在N個(gè)數(shù)中找出最大的前K個(gè),這篇文章將詳細(xì)講解如何利用小根堆的方法解決TopK問(wèn)題,文中代碼具有一定參考價(jià)值,快跟隨小編一起學(xué)習(xí)一下吧2022-06-06
C++中jsoncpp庫(kù)和nlohmann-json庫(kù)實(shí)現(xiàn)JSON與字符串類(lèi)型轉(zhuǎn)換
jsoncpp是ROS自帶的一個(gè)JSON庫(kù),它提供了一些函數(shù)來(lái)解析和生成JSON數(shù)據(jù),在ROS中,可以使用jsoncpp庫(kù)來(lái)實(shí)現(xiàn)JSON與字符串類(lèi)型之間的轉(zhuǎn)換,這篇文章主要介紹了jsoncpp庫(kù)和nlohmann-json庫(kù)實(shí)現(xiàn)JSON與字符串類(lèi)型轉(zhuǎn)換,需要的朋友可以參考下2023-08-08
Linux?C/C++實(shí)現(xiàn)顯示NIC流量統(tǒng)計(jì)信息
NIC流量統(tǒng)計(jì)信息是由操作系統(tǒng)維護(hù)的,當(dāng)數(shù)據(jù)包通過(guò)NIC傳輸時(shí),操作系統(tǒng)會(huì)更新相關(guān)的計(jì)數(shù)器,通過(guò)讀取這些計(jì)數(shù)器,我們可以獲得關(guān)于網(wǎng)絡(luò)流量的信息,下面我們就來(lái)學(xué)習(xí)一下如何通過(guò)C/C++實(shí)現(xiàn)顯示NIC流量統(tǒng)計(jì)信息吧2024-01-01
C語(yǔ)言動(dòng)態(tài)內(nèi)存分配圖文講解
給數(shù)組分配多大的空間?你是否和初學(xué)C時(shí)的我一樣,有過(guò)這樣的疑問(wèn)。這一期就來(lái)聊一聊動(dòng)態(tài)內(nèi)存的分配,讀完這篇文章,你可能對(duì)內(nèi)存的分配有一個(gè)更好的理解2023-01-01
用位圖排序無(wú)重復(fù)數(shù)據(jù)集實(shí)例代碼(C++版)
本文講解如何用位圖排序無(wú)重復(fù)的數(shù)據(jù)集,我們使用C++實(shí)現(xiàn)一下這個(gè)方法2013-11-11

