基于c语言的贪吃蛇小游戏–The First
大三考研党,二跨计算机考研,想做一个踏踏实实的程序员,写下了自己的第一篇博客,长路漫漫,不会寂寞。
此程序过于简陋,只是简单的实现了贪吃蛇的功能,并没有友好的图像界面,也缺乏人机互动,后续也可能会加以改进。
实现效果如下:
以下是我的基本思路
- 图形界面的背景以及贪吃蛇的形象
- 定义贪吃蛇的属性
- 定义随机出现的食物
- 蛇的移动以及身体的增长
- 制定游戏规则
1.图形界面以及贪吃蛇身体的制作
#include <graphics.h>//图形库的头文件
#include <mmsystem.h>//多媒体设备接口 音乐 视频 麦克风
#pragma comment(lib,"winmm.lib")
//初始化函数
void InitSnake()
{
initgraph(640, 480);//初始化一个图形界面,创建一个画板
mciSendString("open 听海.mp3 alias bk",0,0,0);//背景音乐
mciSendString("Play bk repeat",0,0,0);
//setbkcolor(RGB(0, 0, 0));//画板背景颜色
SNAKE.szb[0].x = 0; //蛇的初始位置
SNAKE.szb[0].y = 0; //蛇的初始位置
SNAKE.n = 1; //蛇的长度
SNAKE.ch = right_s; //移动方向
rectangle(SNAKE.szb[0].x, SNAKE.szb[0].y, 10, 10);//画一个矩形 //小蛇
}
2.贪吃蛇的属性
#define SNAKE_LENGTH 100//蛇的最大长度
#define SNAKE_SIZE 10 //蛇的大小
//坐标结构体
struct Coor
{
int x;
int y;
}COOR;
//蛇的属性结构体
struct Snake
{
Coor szb[SNAKE_LENGTH];//蛇的每一节的坐标
int n; //蛇的当前长度
CH ch; //蛇的方向
}SNAKE;
3.随机出现的食物
#define random(x) (rand()%x/SNAKE_SIZE*SNAKE_SIZE)//产生食物的随机数
//食物坐标结构体
struct Food
{
int food_x;
int food_y;
}food;
//标志结构体
struct Flag
{
int flag_food = 0; //判断食物是否被吃掉 0被吃掉 1未被吃掉
int flag_over = 0; //判断游戏是否结束 0未结束 1结束
}FLAG;
本文由于采用随机函数random产生随机数,实际并非加粗样式随机数,故每次产生食物的位置,顺序不会改变,有待改进
4.蛇的移动以及身体的增长
//在界面上面画蛇
void DrawSnake()
{
setcolor(RGB(0, 0, 0));//将蛇最后一节剪除
rectangle(SNAKE.szb[SNAKE.n].x, SNAKE.szb[SNAKE.n].y,
SNAKE.szb[SNAKE.n].x + SNAKE_SIZE, SNAKE.szb[SNAKE.n].y + SNAKE_SIZE);
setcolor(RGB(255, 255, 255));//蛇的背景颜色
for (int i = SNAKE.n - 1; i >= 0; i--)//画出蛇的每一节
{
rectangle(SNAKE.szb[i].x, SNAKE.szb[i].y,
SNAKE.szb[i].x + SNAKE_SIZE, SNAKE.szb[i].y + SNAKE_SIZE);
}
}
//蛇的移动
void MoveSnake()
{
for (int i = SNAKE.n - 1; i >= 0; i--) //蛇的每一节坐标前移
{
SNAKE.szb[i+1].x = SNAKE.szb[i].x;
SNAKE.szb[i+1].y = SNAKE.szb[i].y;
}
switch (SNAKE.ch)
{
case up_s:
SNAKE.szb[0].y -= SNAKE_SIZE;
break;
case down_s:
SNAKE.szb[0].y += SNAKE_SIZE;
break;
case left_s:
SNAKE.szb[0].x -= SNAKE_SIZE;
break;
case right_s:
SNAKE.szb[0].x += SNAKE_SIZE;
break;
}
DrawSnake();
}
//吃食物变大
void StrongSnake()
{
if (!FLAG.flag_food)//随机产生一个食物
{
food.food_x = random(640);//食物坐标
food.food_y = random(480);
setcolor(RGB(255, 255, 255));//食物的背景颜色
rectangle(food.food_x, food.food_y,
food.food_x + SNAKE_SIZE, food.food_y + SNAKE_SIZE);
FLAG.flag_food = 1;
}
if (SNAKE.szb[0].x == food.food_x && SNAKE.szb[0].y == food.food_y)
{
SNAKE.n++;
FLAG.flag_food = 0;
}
}
通过不断更新图形界面,使蛇的位置发生改变,从而进行移动以及变大
5.应用按键实现蛇的转向
//改变蛇的方向 键盘
void ChangSnake()
{
int move;
move = _getch();//接受键盘数据
switch (move)
{
case up_s:
if (SNAKE.ch != down_s)
{
SNAKE.ch = up_s;
}
break;
case down_s:
if (SNAKE.ch != up_s)
{
SNAKE.ch = down_s;
}
break;
case left_s:
if (SNAKE.ch != right_s)
{
SNAKE.ch = left_s;
}
break;
case right_s:
if (SNAKE.ch != left_s)
{
SNAKE.ch = right_s;
}
break;
}
}
6.结束界面
//结束标志
void GameOver()
{
for (int i = SNAKE.n - 1; i > 2; i--)
{
if (SNAKE.szb[0].x == SNAKE.szb[i].x && SNAKE.szb[0].y == SNAKE.szb[i].y)
{
FLAG.flag_over = 1;
}
}
if (SNAKE.szb[0].x > 640 || SNAKE.szb[0].x < 0 || SNAKE.szb[0].y > 480 || SNAKE.szb[0].y < 0)
{
FLAG.flag_over = 1;
}
}
//结束界面
void OverSnake()
{
cleardevice();
setcolor(YELLOW);
settextstyle(100, 0, "宋体");
outtextxy(100, 50, "GAME OVER");
mciSendString("stop bk", 0, 0, 0);
getchar();
closegraph();
}
由此,实现了一个简单的贪吃蛇小游戏,代码链接:程序源码