贪吃蛇小游戏C语言实现
#include <stdio.h>
#include <graphics.h> //图形界面头文件
#include <time.h>
#include <conio.h>
#define N 100 //蛇的最大节数
//坐标
struct Coor
{
int x;
int y;
};
//枚举方向,当一个变量有几种可能的取值时,可以将它定义为枚举类型 变量的值只限于列举出来的值的范围内.
enum Ch{ up = 72, down = 80, left = 75, right = 77 };
//一条蛇 N节 数组
struct Snake
{
int n; //当前的节数
struct Coor scr[N]; //100节蛇的坐标数组
enum Ch ch; //蛇的方向
}snake;
//分析食物
/*************************
坐标
标志 有没有被吃的标志
**************************/
struct Food
{
struct Coor fsr;//食物坐标
int flag;//标志,食物有没有被吃掉,1代表没有
}food;
void GameInit();
void SnakeMove();
void SnakePaint();
void ChangeSnakeCh();
void FoodCoor();
void FoodPaint(); //绘制食物
void EatFood();
void GameBreak();
void OverGame();
//主函数
int main()
{
GameInit(); //初始化的函数.
//按键控制 不按键->移动循环 按键-->退出移动循环-->改变方向-->回到移动循环
while (1)
{
while (!kbhit()) //kbhit(检测键盘是否有消息) getch conio.h
{
if (food.flag == 0)
FoodCoor();
Sleep(200);
cleardevice();
FoodPaint();
SnakePaint();
SnakeMove();
EatFood();
GameBreak();
}
ChangeSnakeCh();
}
return 0;
}
//游戏初始化
void GameInit()
{
//打开一个窗口
initgraph(640, 480);
srand((unsigned int)time(NULL));
//设置背景颜色 颜色的三基色 红R 绿G 蓝B
setbkcolor(RGB(220, 120, 150)); //set bk color
cleardevice(); //使用设置好的背景颜色刷新屏幕 system("cls")
//初始化一条小蛇
rectangle(0, 0, 10, 10);
//蛇的结构初始化
snake.scr[0].x = 0; //蛇头的x,y初始化为0
snake.scr[0].y = 0;
snake.n = 1; //当前有一节蛇
snake.ch = down; //方向往下
food.flag = 0; //食物初始化被吃掉的
}
//绘制蛇
void SnakePaint()
{
//n节蛇 最大的下标是多少? n-1 100
for (int i = snake.n - 1; i >= 0; i--)
{
rectangle(snake.scr[i].x, snake.scr[i].y, snake.scr[i].x + 10, snake.scr[i].y + 10);
}
}
//right 往右走 n节蛇 C C++ win32
void SnakeMove()
{
//吃到食物以后产生一个新的蛇身
for (int i = snake.n - 1; i > 0; i--)
{
snake.scr[i].x = snake.scr[i - 1].x;
snake.scr[i].y = snake.scr[i - 1].y;
}
switch (snake.ch)
{
case up:
snake.scr[0].y -= 10;
break;
case down:
snake.scr[0].y += 10;
break;
case left:
snake.scr[0].x -= 10;
break;
case right:
snake.scr[0].x += 10;
break;
}
}
//人来控制 检测到按键getchar getch
//通过不同的按键(分支结构 switch if)
// snake.scr[0].ch
void ChangeSnakeCh()
{
//键值 wasd 上下左右(键值!=ASCII)
//上 72 下80 左75 右77
int move;
move = getch(); //头文件 conio.h
switch (move)
{
case 72: //up
if (snake.ch != down)
snake.ch = up;
break;
case 80: //down
if (snake.ch != up)
snake.ch = down;
break;
case 75:
if (snake.ch != right)
snake.ch = left;
break;
case 77:
if (snake.ch != left)
snake.ch = right;
break;
}
}
void FoodCoor() //食物坐标
{
food.fsr.x = rand() % 64 * 10; //0 10 20 30 40 50 ... 630 0-63 *10
food.fsr.y = rand() % 48 * 10; //0 10 20 30... 470 0-47 *10
food.flag = 1; //食物没有被吃
}
void FoodPaint()//绘制食物
{
solidroundrect(food.fsr.x, food.fsr.y, food.fsr.x + 10, food.fsr.y + 10, 10, 10);
}
void EatFood()//吃食物
{
if (snake.scr[0].x == food.fsr.x&&snake.scr[0].y == food.fsr.y)
{
snake.n++;
food.flag = 0;
}
}
//判断游戏退出
void GameBreak()
{
//撞墙
if (snake.scr[0].y < -1 || snake.scr[0].y>471 || snake.scr[0].x < -1 || snake.scr[0].x>631)
{
//退出
OverGame();
}
for (int i = snake.n - 1; i > 0; i--)
{
if (snake.scr[0].x == snake.scr[i].x&&snake.scr[0].y == snake.scr[i].y)
{
#include <graphics.h> //图形界面头文件
#include <time.h>
#include <conio.h>
#define N 100 //蛇的最大节数
//坐标
struct Coor
{
int x;
int y;
};
//枚举方向,当一个变量有几种可能的取值时,可以将它定义为枚举类型 变量的值只限于列举出来的值的范围内.
enum Ch{ up = 72, down = 80, left = 75, right = 77 };
//一条蛇 N节 数组
struct Snake
{
int n; //当前的节数
struct Coor scr[N]; //100节蛇的坐标数组
enum Ch ch; //蛇的方向
}snake;
//分析食物
/*************************
坐标
标志 有没有被吃的标志
**************************/
struct Food
{
struct Coor fsr;//食物坐标
int flag;//标志,食物有没有被吃掉,1代表没有
}food;
void GameInit();
void SnakeMove();
void SnakePaint();
void ChangeSnakeCh();
void FoodCoor();
void FoodPaint(); //绘制食物
void EatFood();
void GameBreak();
void OverGame();
//主函数
int main()
{
GameInit(); //初始化的函数.
//按键控制 不按键->移动循环 按键-->退出移动循环-->改变方向-->回到移动循环
while (1)
{
while (!kbhit()) //kbhit(检测键盘是否有消息) getch conio.h
{
if (food.flag == 0)
FoodCoor();
Sleep(200);
cleardevice();
FoodPaint();
SnakePaint();
SnakeMove();
EatFood();
GameBreak();
}
ChangeSnakeCh();
}
return 0;
}
//游戏初始化
void GameInit()
{
//打开一个窗口
initgraph(640, 480);
srand((unsigned int)time(NULL));
//设置背景颜色 颜色的三基色 红R 绿G 蓝B
setbkcolor(RGB(220, 120, 150)); //set bk color
cleardevice(); //使用设置好的背景颜色刷新屏幕 system("cls")
//初始化一条小蛇
rectangle(0, 0, 10, 10);
//蛇的结构初始化
snake.scr[0].x = 0; //蛇头的x,y初始化为0
snake.scr[0].y = 0;
snake.n = 1; //当前有一节蛇
snake.ch = down; //方向往下
food.flag = 0; //食物初始化被吃掉的
}
//绘制蛇
void SnakePaint()
{
//n节蛇 最大的下标是多少? n-1 100
for (int i = snake.n - 1; i >= 0; i--)
{
rectangle(snake.scr[i].x, snake.scr[i].y, snake.scr[i].x + 10, snake.scr[i].y + 10);
}
}
//right 往右走 n节蛇 C C++ win32
void SnakeMove()
{
//吃到食物以后产生一个新的蛇身
for (int i = snake.n - 1; i > 0; i--)
{
snake.scr[i].x = snake.scr[i - 1].x;
snake.scr[i].y = snake.scr[i - 1].y;
}
switch (snake.ch)
{
case up:
snake.scr[0].y -= 10;
break;
case down:
snake.scr[0].y += 10;
break;
case left:
snake.scr[0].x -= 10;
break;
case right:
snake.scr[0].x += 10;
break;
}
}
//人来控制 检测到按键getchar getch
//通过不同的按键(分支结构 switch if)
// snake.scr[0].ch
void ChangeSnakeCh()
{
//键值 wasd 上下左右(键值!=ASCII)
//上 72 下80 左75 右77
int move;
move = getch(); //头文件 conio.h
switch (move)
{
case 72: //up
if (snake.ch != down)
snake.ch = up;
break;
case 80: //down
if (snake.ch != up)
snake.ch = down;
break;
case 75:
if (snake.ch != right)
snake.ch = left;
break;
case 77:
if (snake.ch != left)
snake.ch = right;
break;
}
}
void FoodCoor() //食物坐标
{
food.fsr.x = rand() % 64 * 10; //0 10 20 30 40 50 ... 630 0-63 *10
food.fsr.y = rand() % 48 * 10; //0 10 20 30... 470 0-47 *10
food.flag = 1; //食物没有被吃
}
void FoodPaint()//绘制食物
{
solidroundrect(food.fsr.x, food.fsr.y, food.fsr.x + 10, food.fsr.y + 10, 10, 10);
}
void EatFood()//吃食物
{
if (snake.scr[0].x == food.fsr.x&&snake.scr[0].y == food.fsr.y)
{
snake.n++;
food.flag = 0;
}
}
//判断游戏退出
void GameBreak()
{
//撞墙
if (snake.scr[0].y < -1 || snake.scr[0].y>471 || snake.scr[0].x < -1 || snake.scr[0].x>631)
{
//退出
OverGame();
}
for (int i = snake.n - 1; i > 0; i--)
{
if (snake.scr[0].x == snake.scr[i].x&&snake.scr[0].y == snake.scr[i].y)
{
//退出
OverGame();
}
}
}
void OverGame()
{
cleardevice();
outtextxy(300, 200, L"game over");
getch();
closegraph();
}
![贪吃蛇小游戏C语言实现 贪吃蛇小游戏C语言实现](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzY0Mi80MjVkYTc5MzcwOTdmNDZlMDJkM2ZmMTQ2NzIzNWE0Mi5wbmc=)
}
}
}
void OverGame()
{
cleardevice();
outtextxy(300, 200, L"game over");
getch();
closegraph();
}