C++制作贪吃蛇

用的软件是VS2017,由于编译器没有自带头文件graphics和conio,所以需要自己去网站下载。
网址:https://www.easyx.cn
在这里插入图片描述在这里插入图片描述在这里插入图片描述

首先我们需要理清我们需要做的
1、蛇的初始化,开局我们设定蛇的长度为3.
2、画蛇
3、控制蛇的移动
4、改变蛇的方向
5、食物生成
6、画食物
7、吃食物
8、 判断是否撞墙(我这里撞墙不会直接死亡)
9、终止游戏的判定
先看看需要用到的头文件、结构体和各类变量:

#include <iostream>
#include<conio.h>
#include<graphics.h>
#include<Windows.h>
#include<vector>
#include<cstdlib>
#include<ctime>
using namespace std;
struct zuobiao
{
	int x;
	int y;
};
struct SNAKE
{
	vector<zuobiao> xy;//蛇坐标
	int po=0;//蛇方向 0:向右   1:向左    2:向上   3:向下
}snake;
struct FOOD
{
	zuobiao f;
	bool flag = 0;
}food;
int k = 1;//当k=0时结束游戏
bool operator ==(const zuobiao &a,const zuobiao &b)//重载==运算符
{
	return (a.x == b.x) && (a.y == b.y);
}

还做了一个判定函数:

bool judge(zuobiao a)//判断该点是否和蛇的点重合
{
	int max = snake.xy.size();
	for (int i=1; i < max; i++)
		if (a == snake.xy[i])  return 1;
	return 0;
}

1、蛇的初始化:

void initsnake()//蛇的初始化
{
	zuobiao a;
	for (int i = 0; i < 3; i++)
	{
		a.x = 360-i*10;
		a.y = 360;
		snake.xy.push_back(a);
	}
}

2、画蛇:

void drawsnake()//画蛇
{
	int max = snake.xy.size();
	for (int i = 0; i < max; i++)
	{
		setlinecolor(WHITE);//蛇的一节的边框颜色为白色
		setfillcolor(BLACK);//填充颜色为黑色
		fillrectangle(snake.xy[i].x, snake.xy[i].y, snake.xy[i].x + 10, snake.xy[i].y + 10);
	}
}

3、移动蛇:

void movesnake()//控制蛇的移动
{
	for (int i = snake.xy.size() - 1; i > 0; i--)
		snake.xy[i] = snake.xy[i - 1];
	switch (snake.po) {
	case 0:
		snake.xy[0].x += 10;
		break;
	case 1:
		snake.xy[0].x -= 10;
		break;
	case 2:
		snake.xy[0].y -= 10;
		break;
	case 3:
		snake.xy[0].y += 10;
		break;
	}
}

4、改变蛇方向:

void changedirection()//改变方向
{
	int sw = 1;//设置一个开关,只读取按下的第一个键
	while (_kbhit())
	{
		char direction = '\0';
		direction = _getch();
		switch (direction)//改变方向
		{
		case 'W':
		case 'w':
		case 72:
			if (snake.po != 3 && sw == 1)
			{
				snake.po = 2;//向上
				sw = 0;
			}
			break;
		case 'S':
		case 's':
		case 80:
			if (snake.po != 2 && sw == 1)
			{
				snake.po = 3;//向下
				sw = 0;
			}
			break;
		case 'A':
		case 'a':
		case 75:
			if (snake.po != 0 && sw == 1)
			{
				snake.po = 1;//向左
				sw = 0;
			}
			break;
		case 'D':
		case 'd':
		case 77:
			if (snake.po != 1 && sw == 1)
			{
				snake.po = 0;//向右
				sw = 0;
			}
			break;
		}
	}
}

5、食物生成:

bool createfood()//食物生成
{
	if (food.flag == 1) return 0;
	zuobiao m;
	srand((unsigned)time(NULL));
	do {
		m.x = 10 * (rand() % 72);
		m.y = 10 * (rand() % 72);
	}while(judge(m));
	food.f = m;
	food.flag = 1;
}

6、画食物(一定要把食物生成和画食物分开):

void drawfood()//画食物
{
	setlinecolor(RED);
	setfillcolor(RED);
	fillrectangle(food.f.x + 2, food.f.y + 2, food.f.x + 7, food.f.y + 7);
}

7、吃食物:

void eatfood()//吃到食物所发生的变化
{
	if (snake.xy[0] == food.f)
	{
		int num=snake.xy.size();
		zuobiao add = snake.xy[num - 1];
		snake.xy.push_back(add);
		for(int i=num;i>0;i--)
			snake.xy[i] = snake.xy[i - 1];
		switch (snake.po)
		{
		case 0:
			snake.xy[0].x = snake.xy[1].x + 10;
			snake.xy[0].y = snake.xy[1].y;
			break;
		case 1:
			snake.xy[0].x = snake.xy[1].x - 10;
			snake.xy[0].y = snake.xy[1].y;
			break;
		case 2:
			snake.xy[0].x = snake.xy[1].x;
			snake.xy[0].y = snake.xy[1].y - 10;
			break;
		case 3:
			snake.xy[0].x = snake.xy[1].x;
			snake.xy[0].y = snake.xy[1].y + 10;
			break;
		}
		food.flag = 0;
	}
}

8、判断撞墙:

void wall()//撞墙的问题
{
	int a = snake.xy[0].x, b = snake.xy[0].y;
	if (a >= 720) snake.xy[0].x -= 720;
	else if (a < 0) snake.xy[0].x += 720;
	if (b >= 720) snake.xy[0].y -= 720;
	else if (b < 0) snake.xy[0].y += 720;
}

9、游戏结束条件:

void over()//撞到自己,然后结束游戏
{
	if (judge(snake.xy[0]))
		k = 0;
}
主函数:
int main()
{
	initgraph(720, 720);
	initsnake();
	setbkcolor(WHITE);//设置背景颜色
	cleardevice();//刷新页面
	while(k)
	{
		createfood();
		drawfood();
		drawsnake();
		changedirection();
		movesnake();
		eatfood();
		over();
		wall();
		Sleep(100);
		cleardevice();
	}
	
	settextstyle(80,50, "Microsoft YaHei UI");//设置游戏结束的字体大小和字体格式
	settextcolor(BLACK);//设置字体颜色
	outtextxy(140, 280, "游戏结束");//在坐标为(140,280)的位置输出字体
	system("pause");
	return 0;
}
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值