错误1
错误描述:
严重性 代码 说明 项目 文件 行 禁止显示状态
错误(活动) E0413 不存在从 “std::_Vector_iterator<std::_Vector_val<std::_Simple_types>>” 到 “Letter *” 的适当转换函数 快速敲字母 F:\code\51zxw\C++\快速敲字母\game2.cpp 82
错误代码:
bool Ground(Letter*l)//判断一个字母已掉落到地面
{
return l->y >= GROUND;
}
for (itr = letters[i].begin(); itr != letters[i].end(); itr++)
{
crd.X = itr->x; crd.Y = itr->y;//获得字母原来的坐标,准备输出空格将其擦除
SetConsoleCursorPosition(handle, crd);
cout << ' ';
if (Ground(itr))//出错的地方
{
if (vty.GetWound() <= 0)
{
}
}
}
错误原因及解决方法:
原因:迭代器和元素指针不一样,类型不匹配
解决方案:
bool Ground(vector<Letter>::iterator l)//判断一个字母已掉落到地面
{
return l->y >= GROUND;
}
错误2
错误描述:
严重性 代码 说明 项目 文件 行 禁止显示状态
错误(活动) E0167 *"const char " 类型的实参与 “LPCWSTR” 类型的形参不兼容 快速敲字母 F:\code\51zxw\C++\快速敲字母\game2.cpp 94
错误代码
PlaySound(".\\sound\\over.wav", NULL, SND_ASYNC | SND_FILENAME);
解决方案
PlaySound(L".\\sound\\over.wav", NULL, SND_ASYNC | SND_FILENAME);
playsound()函数的相关使用
原文地址:https://wenku.baidu.com/view/04aee0cc82c758f5f61fb7360b4c2e3f572725f3.html?wkts=1683371274424&bdQuery=PlaySound%28%22F%3A%5C%5Ccode%5C%5C51zxw%5C%5CC%2B%2B%5C%5C%E5%BF%AB%E9%80%9F%E6%95%B2%E5%AD%97%E6%AF%8D%5C%5Csound%5C%5Cover.wav%22%2C+NULL%2C+SND_ASY
错误三
错误描述
出错代码
short Fall()//管理所有字母的一次掉落与触地
{
short i;
vector<Letter>::iterator itr;
for (i = 0; i < 26; i++)
{
//*******************************************************************************************
for (itr = letters[i].begin(); itr != letters[i].end();)//当一个字母触底时,再次循环到这会出错
//*********************************************************************************************
{
crd.X = itr->x; crd.Y = itr->y;//获得字母原来的坐标,准备输出空格将其擦除
SetConsoleCursorPosition(handle, crd);
cout << ' ';
if (Ground(itr))//若已触地,则需要处理扣血
{
if (vty.GetWound() <= 0)//处理game over的输出信息
{
crd.X = 13; crd.Y = GROUND + 2;
SetConsoleCursorPosition(handle, crd);
SetConsoleTextAttribute(handle, BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED);
cout << "Game Over!";
SetConsoleTextAttribute(handle, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED);
PlaySound(L".\\sound\\over.wav", NULL, SND_ASYNC | SND_FILENAME);//SND_ASYNC开始播放音乐后就执行下面的代码;SND_FILENAME使用文件路径
return -1;//返回-1告知本函数的调用块游戏已结束
}
//*********************************************************************************
letters[i].erase(itr);//将落地的字母从向量中清清除掉,迭代器自动指向下一个字母(真正出错的代码)
//************************************************************************************
PlaySound(L".\\sound\\wound.wav", NULL, SND_ASYNC | SND_FILENAME);
continue;
}
itr->y++;
crd.Y = itr->y;
SetConsoleCursorPosition(handle, crd);
cout << itr->letter;
itr++;
}
}
return 0;//返回0表示游戏尚未game over
}
问题原因
在erase操作后,没有将循环变量i指向修改后的向量迭代器,就继续循环,再与end()比较时断言出现。
解决方法是将“vector.erase(i);”替换为“i = vector.erase(i);”,这是因为STL里的所有容器类中的erase实现都会返回一个迭代器,这个迭代器指向了“当前删除元素的后继元素,或是end()”。
解决方法
itr=letters[i].erase(itr);//将落地的字母从向量中清清除掉,迭代器自动指向下一个字母(需要一个变量来接收)
原文
https://blog.csdn.net/yxnyxnyxnyxnyxn/article/details/17610899
错误4
(ch = _getch()) != VK_RETURN
(ch=getchar())!= '\n'
两种判断输入是否是回车的方法