基于c语言的贪吃蛇小游戏--The First

基于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();
}

由此,实现了一个简单的贪吃蛇小游戏,代码链接:程序源码

猜你喜欢

转载自blog.csdn.net/weixin_42762173/article/details/90607996