解决展示的设计思路及代码(新人从0到1调试到好看大概需要1~2个小时,如果再带深究一些内容点,半天怎么都能完成的)
day1解决的问题:
- 大小可变的运动空间n*n,考率用vector<vector>实现。
//先用const int,以后去掉const即可。设立单独的变量就是为了方便改动值来测试。
//窗口是width*width,所以运动空间就是norm_size*norm_size;
//最开始用小数测试即可
const int width = 7;
const int norm_size=width-2;
vector<vector<char>> vvc(norm_size, vector<char>(norm_size, ' '));
- 能够打印窗口。包括了墙,蛇以及食物的打印,由于vvc内部初始化都是space,因此不用额外考虑空处处理。显然可以写成嵌套打印。
//要设计什么是墙,什么是身体,什么是食物
//怎么输出好看这是要调试的,在控制台中横向会紧凑一些,纵向会松散一些。
//具体可以有不同实现。
const char wall_smb = '#';
const char body_smb = '*';
const char food_smb = 'o';
void print(vector<char>& vc) {
cout << wall_smb;
for (auto p = vc.begin(); p != vc.end(); ++p)
cout << ' ' << *p;
cout<< ' '<< wall_smb << endl;
}
void print_all(vector<vector<char>>& vvc) {
for (int i = 0; i < width; ++i){
if(i==0||i==width-1)
cout << string(2 * width - 1, wall_smb) << endl;
else print(vvc[i-1]);
}
}
/*自己写时的代码
void print_all(vector<vector<char>>& vvc) {
cout << string(2 * width - 1, wall_smb) << endl;
for (int i = 0; i < (width - 2); ++i)
print(vvc[i]);
cout << string(2 * width - 1, wall_smb) << endl;
}*/
- class snake,这个设计从0开始还是有点费脑子的,建议自己也从零开始,会碰到较多的问题。包括用什么来储存蛇,要知道蛇会一直动来动去,还会边长,所以这里这个设计还是有点意思的。基于蛇头要吃东西,而且判定撞墙撞身体,因此要头部要能操作。而吃了东西尾部应该在原地,没吃东西则向前进,因此也要能尾部操作。所以这个数据结构至少要保证头尾能快速操作,我这里第一反应是deque,后来改成了list(哪个都行)。具体的点用pair<int,int>,我这里将蛇的死活放在了类内部,按逻辑来说,也可以放类外判定。
//出生点位置,目前在正中间,这个后期可改成随机生成。
const int birth = (width / 2) - 1;
//默认构造函数,以及基本成员函数。
class Snake {
private:
deque<pair<int, int>> body;
bool alive = true;
public:
Snake() :body({ pair<int, int>(birth, birth) }) {}
pair<int, int> gethead()const { return body.front(); }
pair<int, int> gettail()const {return body.back();}
bool live() const { return alive; }
size_t size() const { return body.size(); }
};
- class food。测试,不多说。
struct Food {
int x = 1;
int y = 2;
bool flag = 1;
};
- 集成调试。同时可以测试一下各个函数的功能正确性。可以修改一下内部实现。
#include <iostream>
#include<vector>
#include<deque>
using namespace std;
//此处插入上面出现的代码。
int main() {
Snake snake;
Food food;
auto beg = snake.gethead();
auto end = snake.gettail();
//将snake和food占位更改。
vvc[beg.first][beg.second] = body_smb;
vvc[food.x][food.y] = food_smb;
print_all(vvc);
return 0;
}
运行结果