GreedySnake:2020.6.19第三次更新及踩坑

参考:https://github.com/silence1772/GreedySnake
个人github:https://github.com/okJiang/GreedySnake

更新:

  • 实现了food.h类:随机生成一个food
  • 实现了snakefood的操作,吃掉之后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"

总结

  • 其实很多东西在书上都学过,但是用起来还是漏洞百出

  • 成果

    GreedySnake:2020.6.19第三次更新及踩坑_第1张图片

你可能感兴趣的:(c++项目,贪吃蛇)