我正在仅使用控制台窗口进行小型蛇游戏挑战,我陷入了应该清除控制台的绘图功能,然后绘制网格和其他组件(蛇,尾部和水果)
这是代码:
void draw()
{
system("cls");
for(int h = 0;h < HEIGHT;h++)
{
for(int w = 0;w < WIDTH ; w++)
{
if(h == snake.y && w == snake.x)std::cout << snake.symbol;
else if( [&](){for(Snake::Tail T : snake.tails)
{if(T.x == w && T.y == h)return true;}return false;}
== true)
{std::cout << snake.tailSymbol;}
else if(h == fruit.y && w == fruit.x)std::cout << fruit.symbol;
else std::cout << "O";
}
std::cout << "\n";
}
}
它可能看起来令人困惑,但它在网格中的每个位置循环并首先检查蛇(蛇的头部)是否在该位置,否则,它会通过使用 LAMBDA 连接到蛇的所有尾部的循环
其余的并不重要,但问题是我必须使用 lambda 才能将 if 语句和 for 循环合并在一起而不会破坏“else”链,但问题是当我尝试检查 lambda 是否返回真或假我得到错误:
...Snake\main.cpp|40|error: no match for 'operator==' (operand types are 'draw()::<lambda()>' and 'bool')|
我在 C++ 中使用 lambda 的经验还不是很可靠,但我仍然想使用 lambda 而不是函数,如何修复错误并检查值?
最佳答案
您正在将 lambda 表达式与 bool
进行比较,这是不允许的。您需要调用 lambda 并比较您得到的结果,如下所示:
else if ([&]() {
for (Snake::Tail T : snake.tails) {
if (T.x == w && T.y == h)
return true;
}
return false;
}() // call it
== true)
您可以进行多种简化。对于初学者,与 bool
的比较与 == true
是多余的,不利于可读性。 for
循环可以用算法代替,如下所示:else if ([&]() {
return std::any_of(snake_tails.begin(), snake_tails.end(),
[&](auto T) {
return T.x == w && T.y == h;
});
}())
由于您现在只是从 lambda 返回一个值,因此您可以完全删除 lambda,而只需使用返回值:else if (std::any_of(snake_tails.begin(), snake_tails.end(),
[&](auto T) {
return T.x == w && T.y == h;
}))
关于c++ - 如何在 C++ 中的 if 语句中检查 lambda 的返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63550227/