用的软件是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;
}