小时候经常玩的贪吃蛇游戏

完成基本贪吃蛇游戏元素

初始化函数

源代码

运行结果

蛇 食物 地图

void init()
{
	//生成食物要用到随机种子
	srand((unsigned int)time(NULL));
	initgraph(640, 480);
	setbkcolor(BLUE);
	//要初始化蛇 食物
	for (int i = 0; i < 3; i++) //xy[0]这个位置做蛇头
	{
		snake.xy[2 - i].x = 10 * i;
		snake.xy[2 - i].y = 0;
	}
	snake.num = 3;
	snake.direction = right;
	food();
}

蛇 我们要用到数据 数据首先得存
变量 数组 结构体
蛇 一节一节的躯干 用图形画出来
每一节躯干都是一样的 长得一毛一样
有什么不一样? 位置不一样 数组存什么?
int a[100]={0}; //位置是x,y
结构体
食物自己长在地上 随机的 随机数
a[1]=a[0] 001 蛇的每一节被后一节代替

void draw()
{
	//蛇 食物
	//蛇的躯干有个座标//fillrectangle
	for (int i = 0; i < snake.num; i++)//画蛇
	{
		setlinecolor(RED);
		fillrectangle(snake.xy[i].x, snake.xy[i].y, snake.xy[i].x + 10, snake.xy[i].y + 10);
	}
	//画食物
	fillrectangle(foodxy.x, foodxy.y, foodxy.x + 10, foodxy.y + 10);
}

蛇的移动 通过什么?键盘
绘蛇和食物graphics.h
循环以上

void move()
{
	//移动蛇
	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 (dir = snake.direction)
	{
	case right:snake.xy[0].x += 10; break;
	case left:snake.xy[0].x -= 10; break;
	case down:snake.xy[0].y += 10; break;
	case up:snake.xy[0].y -= 10; break;
	}
}

判断游戏的结束 蛇自食 蛇撞墙
我们没按键的时候 蛇动不动?
_getch()阻塞式 _kbhit()非阻塞 有按键它的返回值就非0 键盘监听
无按键它的返回值就是0
while(_kbhit()) 当键盘没有按的时候
{ _getch();}

void over()
{
	//游戏结束
	//蛇自食 撞墙
	if (snake.xy[0].x > 640 || snake.xy[0].x<0 || snake.xy[0].y>480 || snake.xy[0].y < 0)
	{
		MessageBox(GetHWnd(), L"游戏失败!!", L"游戏结束", 0);
		exit(0);
	}
	for (int i = 1; i < snake.num; i++)
	if (snake.xy[0].x == snake.xy[i].x&&snake.xy[0].y == snake.xy[i].y)
	{
		MessageBox(GetHWnd(), L"游戏失败!!", L"游戏结束", 0);
		exit(0);
	}
}

我们要通过按键改变蛇的方向

二;源代码

#include<stdio.h>
#include<conio.h>//按键
#include<graphics.h>//画蛇专用
#include<time.h>//随机种子 随机数
#include<stdlib.h>
#include<mciapi.h>
#pragma comment(lib,"winmm.lib")
#define MAX 100
typedef struct { int x; int y; }PLACE;//位置
struct mySnake//蛇
{
	int num;       //记蛇体节数
	PLACE xy[MAX];//蛇皮数组
	char direction;//方向
}snake;
PLACE foodxy;//食物位置
enum direction{ up, down, left, right };
//函数声明 函数原型
char dir;//上一次方向
void init();//初始化
void food();//生成食物
void keyDown();//蛇头动向
void move();//移动蛇
void draw();//绘蛇和食物
void eat();//蛇恰饭
void over();//游戏结束判断
void run();//运行
int main()
{
	run();
	return 0;
}
void init()
{
	//生成食物要用到随机种子
	srand((unsigned int)time(NULL));
	initgraph(640, 480);
	setbkcolor(BLUE);
	//要初始化蛇 食物
	for (int i = 0; i < 3; i++) //xy[0]这个位置做蛇头
	{
		snake.xy[2 - i].x = 10 * i;
		snake.xy[2 - i].y = 0;
	}
	snake.num = 3;
	snake.direction = right;
	food();
}
void keyDown()
{
	//确定方向
	//顺序结构 循环结构 分支结构
	switch (_getch())//wa 这个问题的根源在哪
	{
	case 'w'://蛇先往右 还没动就往左了 把原先的方向改变了 但是还没动
	case 'W':if (dir != down)
		snake.direction = up; break;
	case 's':
	case 'S':if (dir != up)
		snake.direction = down; break;
	case 'a':
	case 'A':if (dir != right)
		snake.direction = left; break;
	case 'd':
	case 'D':if (dir != left)
		snake.direction = right; break;
	}
}
void move()
{
	//移动蛇
	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 (dir = snake.direction)
	{
	case right:snake.xy[0].x += 10; break;
	case left:snake.xy[0].x -= 10; break;
	case down:snake.xy[0].y += 10; break;
	case up:snake.xy[0].y -= 10; break;
	}
}
void draw()
{
	//蛇 食物
	//蛇的躯干有个座标//fillrectangle
	for (int i = 0; i < snake.num; i++)//画蛇
	{
		setlinecolor(RED);
		fillrectangle(snake.xy[i].x, snake.xy[i].y, snake.xy[i].x + 10, snake.xy[i].y + 10);
	}
	//画食物
	fillrectangle(foodxy.x, foodxy.y, foodxy.x + 10, foodxy.y + 10);
}
void food()
{
	foodxy.x = rand() % 64 * 10;
	foodxy.y = rand() % 48 * 10;
	//食物不能长在蛇的身上
	int i = 0;
	while (i < snake.num)
	if (foodxy.x == snake.xy[i++].x&&foodxy.y == snake.xy[i++].y)
	{
		foodxy.x = rand() % 64 * 10;
		foodxy.y = rand() % 48 * 10;
		i = 0;
	}
}
void eat()
{
	if (snake.xy[0].x == foodxy.x&&snake.xy[0].y == foodxy.y)
	{
		snake.num++;
		food();
	}
}
void over()
{
	//游戏结束
	//蛇自食 撞墙
	if (snake.xy[0].x > 640 || snake.xy[0].x<0 || snake.xy[0].y>480 || snake.xy[0].y < 0)
	{
		MessageBox(GetHWnd(), L"游戏失败!!", L"游戏结束", 0);
		exit(0);
	}
	for (int i = 1; i < snake.num; i++)
	if (snake.xy[0].x == snake.xy[i].x&&snake.xy[0].y == snake.xy[i].y)
	{
		MessageBox(GetHWnd(), L"游戏失败!!", L"游戏结束", 0);
		exit(0);
	}
}
void run()
{
	init();
	mciSendString(L"open mm.mp3", 0, 0, 0);
	mciSendString(L"play mm.mp3", 0, 0, 0);
	while (1)
	{
		cleardevice();//清除图形屏幕
		while (_kbhit())//无按键返回0,按键返回 !0 
			keyDown();
		move();
		eat();
		over();
		draw();
		Sleep(300);//蛇移动间隔时间
	}//当蛇往右走的时候 按了wa
}

三;运行结果

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章