参考:https://github.com/silence1772/GreedySnake
个人github:https://github.com/okJiang/GreedySnake
更新:
- 实现了
food.h
类:随机生成一个food
- 实现了
snake
吃food
的操作,吃掉之后snake
长度+1,并重新生成一个food
- 实现了
map.h
类:一个简易的地图边框,正在用set
实现蛇撞墙结束游戏的功能
踩坑:
-
构造/析构函数声明了必须要实现,大括号内为空也行。
-
不对类成员元素造成改变的函数,最好在声明的小括号后面/实现的大括号前面加上
const
,例如下面,
// Point.h中
void Clear() const;
int getx() const;
int gety() const;
void ChangePosition(const int x, const int y);
void Print(std::string s);
void Print(std::string s) const;
bool operator==(const Point& p) const;
bool operator<(const Point& p) const;
virtual ~Point();
// Point.cpp中
bool Point::operator==(const Point& p) const
{
return (p.getx() == x)&&(p.gety() == y);
}
int Point::gety() const
{
return y;
}
int Point::getx() const
{
return x;
}
不然可能会出现类似的错误
passing ‘const *’ as ‘this’ argument of ‘*’ discards qualifiers
这种错误是指该变量是const
的,在下面的变量的使用中,所有涉及到的该变量的函数,也要是const
的,避免函数改变那个变量。例如:
std::set<Point> p(1,1);
for(auto& i: p) //这里用auto取出来的i,就是const的
{
i.gety(); //所以这里使用到的gety(),也就必须是const的,不然报错
} //这个for循环中使用到的所有i的函数,都要是const的,像上面的gety()一样
-
在使用自己定义的类的
set
的时候,需要重载运算符<
-
在本文件使用其他文件的全局变量时,需要在本文件中用
extern
声明一次 -
如果在
snake.h
类中,有函数要传递class food
的参数,则要在class snake:
前对food
声明一次,不需要#include "food.h"
。
总结
-
其实很多东西在书上都学过,但是用起来还是漏洞百出
-
成果