用C語(yǔ)言實(shí)現(xiàn)貪吃蛇小游戲
本文實(shí)例為大家分享了C語(yǔ)言實(shí)現(xiàn)貪吃蛇小游戲的具體代碼,供大家參考,具體內(nèi)容如下
實(shí)現(xiàn)功能
蛇最開(kāi)始三節(jié),向右移動(dòng)。用戶可以通過(guò)按上下左右來(lái)控制蛇的移動(dòng),食物隨機(jī)產(chǎn)生,蛇吃到食物后蛇的身體會(huì)變長(zhǎng)。蛇撞墻或者撞到自己身體后,游戲結(jié)束。

怎么實(shí)現(xiàn)
要實(shí)現(xiàn)一個(gè)貪吃蛇小游戲,首先要想清楚游戲里有什么,怎樣實(shí)現(xiàn)功能。
很明顯游戲中只有兩樣?xùn)|西,蛇和食物。
所以要建立蛇和食物信息,然后將蛇和食物進(jìn)行初始化,在將蛇和食物畫出來(lái)。
實(shí)現(xiàn)的功能有:
1. 蛇的移動(dòng)
2. 按鍵控制蛇的移動(dòng)
3. 食物的產(chǎn)生
4. 蛇吃食物后蛇身體變長(zhǎng)
5. 游戲的結(jié)束
用結(jié)構(gòu)體建立蛇和食物的信息
struct COOR{//位置,x,y坐標(biāo)
int x;
int y;
};
struct SNAKE{//蛇的基礎(chǔ)信息
int size;//節(jié)數(shù)
int speed;//運(yùn)動(dòng)速度
char dir;//運(yùn)動(dòng)方向
struct COOR xy[MAX];//位置
}snakes;
struct FOOD{//食物信息
struct COOR fooddir;//食物位置
int flag;//判斷食物是否被吃掉,1未被吃掉,0被吃掉
}food;
實(shí)現(xiàn)功能的函數(shù):
蛇:
void snakeInit(){//初始化蛇的信息
void drawSnake(){//畫蛇
void moveSnake(){//蛇的移動(dòng)
void coorSnake(){//按鍵控制蛇的運(yùn)動(dòng)方向
食物:
void initFood(){//初始化食物的信息
void drawFood(){//畫食物
其它:
int gameOver(){//游戲結(jié)束情況
void gameInit(){//初始化窗口范圍
代碼
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<graphics.h>
#include<conio.h>
#include<Windows.h>
#define MAX 200
HWND hwnd = NULL;
enum DIR{//枚舉移動(dòng)方向
UP,
DOWN,
LEFT,
RIGHT,
};
struct COOR{//位置,x,y坐標(biāo)
int x;
int y;
};
struct SNAKE{//蛇的基礎(chǔ)信息
int size;//節(jié)數(shù)
int speed;//運(yùn)動(dòng)速度
char dir;//運(yùn)動(dòng)方向
struct COOR xy[MAX];//位置
}snakes;
struct FOOD{//食物信息
struct COOR fooddir;//食物位置
int flag;//判斷食物是否被吃掉,1未被吃掉,0被吃掉
}food;
void snakeInit(){//初始化蛇的信息
snakes.size = 3;//開(kāi)始節(jié)數(shù)
snakes.dir = RIGHT;//開(kāi)始運(yùn)動(dòng)方向
snakes.speed = 10;
int i = 0;
for (; i < snakes.size; i++){//每一節(jié)書的位置,注意將第一節(jié)作為頭
snakes.xy[i].x = 40 - 10 * i;
snakes.xy[i].y = 10;
}
}
void drawSnake(){//畫蛇
int i = 0;
for (; i < snakes.size; i++){
setlinecolor(BLACK);//畫線的顏色
setfillcolor(RED);//填充色
//fillrectangle(snakes.xy[i].x, snakes.xy[i].y, snakes.xy[i].x + 10, snakes.xy[i].y+10);//矩形
fillcircle(snakes.xy[i].x, snakes.xy[i].y, 5);//圓形
}
}
void moveSnake(){//蛇的移動(dòng)
//snakes.xy[0].x++;
int i = 0;
for (i = snakes.size-1; i >0; i--){//蛇身跟著舌頭運(yùn)動(dòng)
snakes.xy[i].x = snakes.xy[i-1].x;
snakes.xy[i].y = snakes.xy[i-1].y;
}
switch (snakes.dir){
case UP:
snakes.xy[0].y-=snakes.speed;
break;
case DOWN:
snakes.xy[0].y+=snakes.speed;
break;
case LEFT:
snakes.xy[0].x-=snakes.speed;
break;
case RIGHT:
snakes.xy[0].x+=snakes.speed;
break;
default:
break;
}
}
void coorSnake(){//按鍵控制蛇的運(yùn)動(dòng)方向
if (_kbhit()){ //等待獲取按鍵
char c = _getch();//獲得按鍵
switch (c){
case 72:
case'w':
if (snakes.dir != DOWN){
snakes.dir = UP;
}
break;
case 80:
case's':
if (snakes.dir != UP){
snakes.dir = DOWN;
}
break;
case 75:
case'a':
if (snakes.dir != RIGHT){
snakes.dir = LEFT;
}
break;
case 77:
case'd':
if (snakes.dir != LEFT){
snakes.dir = RIGHT;
}
break;
default:
break;
}
}
}
void initFood(){//初始化食物的信息
food.flag = 1;
while (1){
START:
food.fooddir.x = rand() % 63 * 10;//食物位置隨機(jī)
food.fooddir.y = rand() % 47 * 10;
for (int i = 0; i < snakes.size; i++){//防止食物生成在蛇身上。
if (food.fooddir.x == snakes.xy[i].x&&food.fooddir.y == snakes.xy[i].y){
goto START;
}
else{
break;
}
}
break;
}
}
void drawFood(){//畫食物
//food.fooddir.x = 100;
//food.fooddir.y = 200;
setlinecolor(BLACK);
setfillcolor(RED);
fillcircle(food.fooddir.x, food.fooddir.y, 5);
}
void eatFood(){//蛇吃食物
if (snakes.xy[0].x - food.fooddir.x <= 5 && snakes.xy[0].y - food.fooddir.y <= 5 \
&& food.fooddir.x - snakes.xy[0].x <= 5 && food.fooddir.y - snakes.xy[0].y <= 5 && food.flag == 1){
food.flag = 0;
snakes.size++;
}
}
int gameOver(){//游戲結(jié)束情況
if (snakes.xy[0].x < 5 || snakes.xy[0].y <= 0 || snakes.xy[0].x > 635 || snakes.xy[0].y > 478){
MessageBox(hwnd, "GAME OVER!","你撞墻了!", MB_OK);
return 1;
}
for (int i = 1; i < snakes.size; i++){
if (snakes.xy[0].x == snakes.xy[i].x&&snakes.xy[0].y == snakes.xy[i].y){
MessageBox(hwnd, "GAME OVER!", "你撞了自己",MB_OK);
return 1;
}
}
return 0;
}
void gameInit(){
hwnd=initgraph(640, 480);//設(shè)置窗口大小
setbkcolor(GREEN);//設(shè)置窗口顏色
}
int main(){
srand((unsigned long)time(NULL));//生成隨機(jī)數(shù)
gameInit();
cleardevice();//刷新窗口
snakeInit();
initFood();
while (1){
cleardevice();
if (food.flag == 0){
initFood();
}
drawFood();
drawSnake();
coorSnake();
eatFood();
moveSnake();
//eatFood();
if (gameOver()){
break;
}
//stopGame();
Sleep(100);
}
getchar();//防止閃屏
closegraph();
system("pause");
return 0;
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語(yǔ)言rand和srand函數(shù)使用方法介紹
rand()函數(shù)用來(lái)產(chǎn)生隨機(jī)數(shù),但是,rand()的內(nèi)部實(shí)現(xiàn)是用線性同余法實(shí)現(xiàn)的,是偽隨機(jī)數(shù),由于周期較長(zhǎng),因此在一定范圍內(nèi)可以看成是隨機(jī)的。srand()用來(lái)設(shè)置rand()產(chǎn)生隨機(jī)數(shù)時(shí)的隨機(jī)數(shù)種子。參數(shù)seed是整數(shù),通??梢岳胻ime(0)或geypid(0)的返回值作為seed2023-02-02
C語(yǔ)言實(shí)現(xiàn)短字符串壓縮的三種方法詳解
這篇文章主要和大家分享一下smaz,shoco,unisox2三種短字符串壓縮算法,并分別探索它們各自的壓縮率與壓縮和解壓縮性能,需要的可以參考一下2022-08-08
C語(yǔ)言實(shí)現(xiàn)推箱子項(xiàng)目
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)推箱子項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08
C語(yǔ)言可變參數(shù)與函數(shù)參數(shù)的內(nèi)存對(duì)齊詳解
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言可變參數(shù)與函數(shù)參數(shù)的內(nèi)存對(duì)齊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03
vs2019中使用MFC構(gòu)建簡(jiǎn)單windows窗口程序
今天發(fā)現(xiàn)網(wǎng)上好多MFC代碼都不能用,給大家分享一個(gè)簡(jiǎn)單的MFC窗口語(yǔ)言,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06
使用Qt開(kāi)發(fā)實(shí)現(xiàn)字幕滾動(dòng)效果
我們經(jīng)常能夠在外面看到那種滾動(dòng)字幕,那么就拿qt來(lái)做一個(gè)吧,文章通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有有一定的參考價(jià)值,需要的朋友可以參考下2023-11-11
C++實(shí)現(xiàn)比特幣系統(tǒng)的源碼
這篇文章主要介紹了C++實(shí)現(xiàn)比特幣系統(tǒng)的源碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01

