C語言開發(fā)實現(xiàn)貪吃蛇游戲
更新時間:2020年07月27日 15:19:00 作者:C 小白
這篇文章主要為大家詳細介紹了C語言開發(fā)實現(xiàn)貪吃蛇游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了C語言實現(xiàn)貪吃蛇游戲的具體代碼,供大家參考,具體內(nèi)容如下
1、最好用VS運行
2、用到的函數(shù)有:_kbhit _getch EasyX圖形庫內(nèi)一系列函數(shù)
3、蛇身與食物用矩形畫的
代碼如下:
#include<stdio.h>
#include<graphics.h> //easyx頭文件
#include<conio.h>
#include<time.h>
/********************設置各種屬性**********************/
//坐標屬性
typedef struct point {
int x, y;
}PYINT;
//蛇
struct snake {
PYINT xy[100]; //蛇的每節(jié)坐標放到數(shù)組中
int position; //方向
int num; //長度
}SNAKE;
//食物
struct food{
PYINT fdxy;
int flag; //是否存在
int grade; //成績
}FOOD;
//枚舉:方向
//也可用宏 #define
enum position
{
up, down, left, right
};
/**********************對蛇的操作*****************************/
//初始化蛇
//蛇的每節(jié)為 10x10填充的矩形
void initsnake()
{
SNAKE.xy[0].x = 0;
SNAKE.xy[0].y = 0;
//數(shù)組第一個元素為蛇頭
SNAKE.xy[1].x = 10;
SNAKE.xy[1].y = 0;
SNAKE.xy[2].x = 20;
SNAKE.xy[2].y = 0;
SNAKE.position = right; //方向 (隨便給)
SNAKE.num = 3; //數(shù)量 (隨便給)
}
//畫蛇
void Drawsnake()
{
for (int i = 0; i < SNAKE.num; i++)
{
setlinecolor(BLACK);
setfillcolor(RGB(rand() % 255, rand() % 255, rand() % 255));
fillrectangle(SNAKE.xy[i].x, SNAKE.xy[i].y, SNAKE.xy[i].x + 10, SNAKE.xy[i].y + 10);
}
}
//使蛇動起來
/*
蛇頭每向前動一格,其后緊隨蛇頭:
我們把蛇的每節(jié)坐標放到數(shù)組里(蛇頭坐標放在數(shù)組的第一個),移動時,只需使蛇頭(數(shù)組第一個元素)改變,其后與前面交換;
*/
void Movesnake()
{
for (int i = SNAKE.num; i > 0; i--) {
SNAKE.xy[i].x = SNAKE.xy[i - 1].x;
SNAKE.xy[i].y = SNAKE.xy[i - 1].y; //使每個元素向前移動
}
switch (SNAKE.position)
{
case up:
SNAKE.xy[0].y -= 10;
break;
case down:
SNAKE.xy[0].y += 10;
break;
//上下移動 X坐標不發(fā)生改變
case left:
SNAKE.xy[0].x -= 10;
break;
case right:
SNAKE.xy[0].x += 10;
break;
//左右移動 Y坐標不發(fā)生改變
}
}
/******************************按鍵操作*****************************************/
//當蛇向上運動時,按向下鍵無效(其他三個相同)
void Keydown()
{
char ch = _getch();
switch (ch)
{
case 'W':
case 'w':
case 72: //小鍵盤上的“向上”
if (SNAKE.position != down) //是否向下
SNAKE.position = up;
break;
case 'S':
case 's':
case 80: //小鍵盤上的“向下”
if (SNAKE.position != up) //是否向上
SNAKE.position = down;
break;
case 'A':
case 'a':
case 75: //小鍵盤上的“向左”
if (SNAKE.position != right) //是否向右
SNAKE.position = left;
break;
case 'D':
case 'd':
case 77: //小鍵盤上的“向右”
if (SNAKE.position != left) //是否向左
SNAKE.position = right;
break;
}
}
/******************************食物操作**************************************/
//初始化食物
void initfood()
{
FOOD.fdxy.x = rand() % 60 * 10;
FOOD.fdxy.y = rand() % 40 * 10; //把食物的坐標控制在游戲界面內(nèi)
FOOD.flag = 1; //1代表存在食物
//FOOD.grade = 0;
for (int i = 0; i < SNAKE.num; i++) {
if (FOOD.fdxy.x == SNAKE.xy[i].x&&FOOD.fdxy.y == SNAKE.xy[i].y) //如果食物出現(xiàn)在蛇身上,重新產(chǎn)生X Y的值
{
FOOD.fdxy.x = rand() % 60 * 10;
FOOD.fdxy.y = rand() % 40 * 10;
}
}
}
//畫食物
void Drawfood()
{
setlinecolor(BLACK);
setfillcolor(RGB(rand() % 255, rand() % 255, rand() % 255));
fillrectangle(FOOD.fdxy.x, FOOD.fdxy.y, FOOD.fdxy.x + 10, FOOD.fdxy.y + 10);
}
/*************************************吃食物*************************************************/
void eatfood()
{
if (SNAKE.xy[0].x == FOOD.fdxy.x&&SNAKE.xy[0].y == FOOD.fdxy.y) {
SNAKE.num++;
FOOD.flag = 0; //食物存在的標記(1:存在 0;不存在)
FOOD.grade += 10; //每吃一個食物分數(shù)加10 (每個食物是10分,可隨意改變)
}
}
/*************************************顯示分數(shù)*************************************************/
void putgrade()
{
char str[20] = " ";
sprintf_s(str, "greade: %d", FOOD.grade);
settextcolor(RED); //設置字體顏色
outtextxy(500, 50, str);
}
/***********************************游戲結(jié)束***************************************************/
//當蛇頭撞墻(蛇頭撞上自身)
//只分析一種情況
int gameover()
{
if (SNAKE.xy[0].x > 600 || SNAKE.xy[0].x < 0 | SNAKE.xy[0].y>400 || SNAKE.xy[0].y < 0) //撞墻
{
initgraph(800, 600);
settextcolor(RED);
outtextxy(600, 400, "你撞墻了");
settextcolor(YELLOW);
settextstyle(50, 50, "楷體"); //字體樣式
outtextxy(200, 250, "GAME OVER"); //指定位置輸出字符串
return 1;
}
return 0;
}
/*****************************************************************************************/
int main()
{
initgraph(600, 400);
setbkcolor(BLACK); //背景顏色
cleardevice(); //清屏:刷新屏幕
srand((unsigned int)time(NULL)); //隨機數(shù)種子
initsnake();
Drawsnake();
while (1)
{
cleardevice(); //清屏
Movesnake();
Drawsnake();
if (FOOD.flag == 0) {
initfood();
}
Drawfood();
if (_kbhit()) { //_kbhit: 檢測是否有按鍵動作
Keydown();
}
if (gameover()) { //若函數(shù)返回1:結(jié)束游戲
break;
}
eatfood();
putgrade();
Sleep(100); //延長時間 (即蛇移動的速度)
}
_getch(); //防止閃屏
closegraph(); //關閉窗口
return 0;
}
/**********************************************************/
//RGB(rand() % 255, rand() % 255, rand() % 255) 在三基色范圍內(nèi)隨機產(chǎn)生
//記得安裝EasyX插件
更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專題,分享給大家:
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

