C++实战贪食蛇
学了那么久的C++语法,没有点小项目来玩玩的话是会感觉挺枯燥的。这篇文章记录C++的贪食蛇,简单易懂。
首先使用的是多文件的写法,代码开起来不会太多。直接开始吧。
一、总体思路
把需要的蛇、食物、坐标都封装成类,然后在主函数中去调用。蛇的形状就用多个矩形连起来来代替。食物是随机在界面中产生,食物也是用矩形来代替。食物中有一个属性是用来标识蛇有没有吃掉食物的。蛇吃了食物就把标记变换,然后if判断判断标记是否改变得出食物是否被吃掉。食物被吃掉之后,在可见的界面中随机一个位置产生一个食物,然后蛇自己的身体增一。所以蛇中就必须有一个属性是用来表示蛇身长度的或者说大小。蛇和食物都是需要定位的,所以也封装了一个点类,当蛇头碰到食物的时候,也就是蛇头的坐标等于食物的坐标的时候,就是吃的过程。然后就是蛇的移动和改方向(改方向需要按键交互,只需改变蛇的头部方向即可,蛇身的节点直接使用上一个节点的坐标即可)。最后是结束游戏的判断,有主要的两个条件会使游戏结束:一是蛇头碰到墙,二是蛇头碰到自己的身体。第一个只需判断是否出界即可,第二个就比较有意思,先把蛇头的坐标记录下来,然后就用循环去判断蛇头的坐标是否等于蛇身中每个节点的坐标 。条件成立就结束游戏,不成立就继续。这里为什么要记录下来呢?因为不记录下来的话,蛇头和第一个要判断的蛇身节点判断结束后蛇头就变了,变的速度很快。所以要记录下来才行,不记录直接判断的话是有Bug的。
1.1 开发环境
Visual Studio 2019
1.2 插件
easyX 如果没有的话直接在网上下载就好,用不到五分钟。使用的时候直接包含头文件easyx.h
#include<easyx.h>
1.3 自定义的头文件和源文件
封装类,采用面向对象和面向过程的相互结合。
每个类写在一个头文件中。
已经分别创建三个头文件
类 | 头文件 | 源文件 |
---|---|---|
Point | point.h | point.cpp |
Snake | snake.h | snake.cpp |
Food | food.h | food.cpp |
1.3.1 头文件
- Point类(点,用来定位),在自定义头文件"point.h"中。
#pragma once
//创建一个点类,用于定位蛇和食物
class Point
{
public:
//缺省的方式写构造函数
Point(int x=0,int y=0):x(x),y(y){
}
int& getX(); //X坐标的接口
int& getY(); //Y坐标的接口
protected:
int x;
int y;
};
- Snake类(蛇,封装蛇的属性和行为),在自定义头文件"snake.h"中。
#pragma once
#include<easyx.h> //包含图形库头文件,画图使用
#include"point.h"
#include<ctime> //包含时间头文件,我们想让蛇的身体一闪一闪的
#include"food.h" //包含食物头文件,因为等下的吃食物的函数中要用到Food的对象
class Snake
{
public:
//枚举
enum posNum
{
//分别是0 1 2 3 的别名
LEFT,RIGHT,UP,DOWN
};
//缺省的方式写构造函数,传的是点的个数
Snake(int size = 100);
void drawSnake(); //画蛇
void moveSnake(); //移动蛇
void keyDown(); //按键交互
void eatFood(Food& food); //吃食物
bool GameOver(); //判断游戏是否结束
int& getCurSize(); //获取当前的大小,主要用于统计最后的分数
protected:
Point* pos; //点类的指针
int curSize; //当前蛇身的大小
int position; //方向,按键交互的时候就是改变蛇头的方向即可
};
- Food类(食物,封装行为和属性),在自定义头文件"food.h"中
#pragma once
#include<easyx.h>
#include"point.h"
#include<ctime>
class Food
{
//声明Snake类是Food类的友元类,方便Snake直接访问到Food的成员
friend class Snake;
public:
Food();
void drawFood();<