C++实现简单贪吃蛇游戏

2020-01-06 18:27:53丽君

我大概在一个多月前把自己上学期写的c代码的贪吃蛇游戏push到csdn上,并且说c风格的贪吃蛇写起来有些麻烦(贪吃蛇游戏的c语言实现),准备用面向对象的c++再写一遍。现在我们专业恰好刚教完了c++,学校也布置了一道简单的贪吃蛇的编程题目,实现下来,的确觉得c++的思路清晰很多,所以再次把c++的代码push上来,供大家对比参考:)

直接上代码,c++把整个游戏拆分成几个文件,分开上,有一定的c++基础的同学应该可以很容易看懂。

1、全局头文件(global.hpp)

 


#ifndef _GLOBAL_H_
#define _GLOBAL_H_

#ifndef SYMBOLS
#define HEAD '@'
#define BODY 'X'
#define EMPTY '+'
#define FOOD '$'
#endif // !SYMBOLS

enum direction { up = 0, down = 1, left = 2, right = 4, freeze = 5 };

struct point {
 int x;
 int y;
 point(int x = 0, int y = 0) : x(x), y(y) {}
 point(const point& another) : x(another.x), y(another.y) {}
 point& operator=(const point& other) {
  x = other.x;
  y = other.y;
  return *this;
 }
 friend bool operator==(const point& point1, const point& point2) {
  return point1.x == point2.x && point1.y == point2.y;
 }
 point& move(direction d) {
  switch (d) {
   case up:
    x--;
    break;
   case down:
    x++;
    break;
   case left:
    y--;
    break;
   case right:
    y++;
    break;
   case freeze:
   default:
    break;
  }
  return *this;
 }
};

#endif // !_GLOBAL_H_

2、snake类的声明和实现(snake.hpp)

(为了简化结构,把声明和实现共同放在了hpp文件里,减少了一点封装性,实际上应该分开头文件和实现文件好一点)

此处使用了容器list作为蛇身(body)的表达形式,这样可以非常方便地进行表达,读者有兴趣可以用数组实现一下,一不小心就会出现有趣的内存错误。。。

 


#ifndef _SNAKE_H_
#define _SNAKE_H_
#include <iostream>
#include <list>
#include "global.hpp"

class snake {
    point head;
    std::list<point> body;
  public:
    snake(point initial_head);
    snake();
    ~snake() {}
    point& getHead();
    std::list<point>& getbody();
    void grow(point);
    void setHead(point);
};

snake::snake() {
  head.x = 0;
  head.y = 0;
}

snake::snake(point initial_head) {
  setHead(initial_head);
}

void snake::setHead(point _head) {
  head = _head;
}

void snake::grow(point second_node) {
  this -> body.push_front(second_node);
}

point& snake::getHead() {
  return head;
}

std::list<point>& snake::getbody() {
  return body;
}
#endif

3、map类的声明和实现(map.hpp)

在这里,map中应该包含一个snake类作为组合关系。
在组合关系里面,想要直接修改snake的各种参数是不可行的,所以在前面snake类的声明里加上了诸如setHead(), getHead(), getbody() 这一类的函数。