问题描述
初学C++,我试着写一个贪吃蛇游戏,代码如下:
#include<iostream>#include <conio.h>#include <windows.h>#include <string>#include<vector>#include<utility>using namespace std;class Snake{ friend void displaySnake(Snake &s);public: using ssbody = pair<pair<int, int>, string>; Snake() = default; vector<ssbody> body() const { return snakebody; }private: int lengh=1; //蛇的长度 vector<ssbody> snakebody{make_pair(make_pair(10, 10), '●')}; //蛇的位置和符号 };
void gotoxy(int x, int y){ HANDLE h;//句柄,对象的索引 COORD c;//结构体,坐标值 c.X = x; c.Y = y; h = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(h, c);}void displaySnake(Snake &s) //打印蛇{ for (auto &c : s.snakebody){gotoxy(c.first.first, c.first.second); //设置光标到保存的坐标处 gotoxy我省略了cout << c.second; }}
我想用vector<ssbody> snakebody 来保存蛇的身体,包括蛇每个点的位置和符号(●代表蛇头,○代表蛇尾)。我希望snakebody开始时总是有一个蛇头(在坐标(10,10)处,符号是●),于是我用make_pair(make_pair(10, 10), '●') 初始化snakebody。但是我在main函数中调用时总是失败,main函数代码:
int main(){ Snake s; displaySnake(s);}
错误说明:
error C2664: “std::vector<Snake::ssbody,std::allocator<_Ty>>::vector(std::initializer_list<std::pair<std::pair<int,int>,std::string>>,const std::allocator<_Ty> &)”: 无法将参数 1 从“std::pair<std::pair<int,int>,const char *>”转换为“const std::allocator<_Ty> &”
问题解答
回答1:void displaySnake(Snake &s) //打印蛇{ //重复使用了s for (auto &s : s.snakebody){gotoxy(s.first.first, s.first.second); //设置光标到保存的坐标处cout << s.second; }}
for (auto &s : s.snakebody)这里重复使用了s。。。。。。
运行结果
回答2:把初始化挪到构造函数里去。
成员变量设定初始值仅适用于字面量类型。 initializer_list这种想太多了。