- 大小可变的运动空间n*n,考率用vector
实现。
//先用const int,以后去掉const即可。设立单独的变量就是为了方便改动值来测试。 //窗口是width*width,所以运动空间就是norm_size*norm_size; //最开始用小数测试即可 const int width = 7; const int norm_size=width-2; vector> vvc(norm_size, vector (norm_size, ' '));
- 能够打印窗口。包括了墙,蛇以及食物的打印,由于vvc内部初始化都是space,因此不用额外考虑空处处理。显然可以写成嵌套打印。
//要设计什么是墙,什么是身体,什么是食物 //怎么输出好看这是要调试的,在控制台中横向会紧凑一些,纵向会松散一些。 //具体可以有不同实现。 const char wall_smb = '#'; const char body_smb = '*'; const char food_smb = 'o'; void print(vector& vc) { cout << wall_smb; for (auto p = vc.begin(); p != vc.end(); ++p) cout << ' ' << *p; cout<< ' '<< wall_smb << endl; } void print_all(vector >& 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]); } }
- class snake,这个设计从0开始还是有点费脑子的,建议自己也从零开始,会碰到较多的问题。包括用什么来储存蛇,要知道蛇会一直动来动去,还会边长,所以这里这个设计还是有点意思的。基于蛇头要吃东西,而且判定撞墙撞身体,因此要头部要能 *** 作。而吃了东西尾部应该在原地,没吃东西则向前进,因此也要能尾部 *** 作。所以这个数据结构至少要保证头尾能快速 *** 作,我这里第一反应是deque,后来改成了list(哪个都行)。具体的点用pair
,我这里将蛇的死活放在了类内部,按逻辑来说,也可以放类外判定。
//出生点位置,目前在正中间,这个后期可改成随机生成。 const int birth = (width / 2) - 1; //默认构造函数,以及基本成员函数。 class Snake { private: deque> body; bool alive = true; public: Snake() :body({ pair (birth, birth) }) {} pair gethead()const { return body.front(); } pair 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#include #include 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; }
运行结果
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)