如何在bool值为真后停止增加变量
How to stop incrementing variable after bool becomes true?
我正在制作一款游戏,要求玩家按下a、B或C键,让三个盒子中的一个消失。如果一个盒子消失,显示出一个更小的盒子,用户就赢了。我很难做到这样,当用户获胜时,总猜测和错误猜测的计数器不再增加,因为此时,人们可以一直按下一个按钮来不断增加这两个变量(分别被恰当地命名为totalguess和wrongguess)。有人知道我怎样才能完成这个任务吗?我相信这是相对简单的,但它把我逼疯了。非常感谢。
这是我的main.cpp:
#include "Box.h"
#include "Font.h"
#include "Camera.h"
#include "Time.h"
#include <vector>
#include <sstream>
using namespace std;
#include "vgl.h"
using namespace glm;
#define SPACEBAR_KEY 32
#define ESCAPE_KEY 033
vector<Box * > boxes;
Camera* camera;
Font* font;
int numGenerator, guesses, totalGuesses, rounds, wrongGuesses, wrongGuessesRound, oldGuess, oldWrongGuess;
bool win;
void closeApp()
{
delete camera;
delete font;
for (auto it = boxes.begin(); it != boxes.end(); ++it)
delete (*it);
}
void startNewGame()
{
rounds++;
win = false;
guesses = 0;
wrongGuesses = 0;
wrongGuessesRound = 0;
numGenerator = rand() % 3;
boxes[1]->Visible = true;
boxes[2]->Visible = true;
boxes[3]->Visible = true;
if (numGenerator == 0)
{
boxes[0]->Position = vec3(0.0f, -3.0f, 0.0f);
}
else if (numGenerator == 1)
{
boxes[0]->Position = vec3(0.0f, 0.0f, 0.0f);
}
else
{
boxes[0]->Position = vec3(0.0f, 3.0f, 0.0f);
}
}
void keyboard(unsigned char key, int x, int y)
{
switch (key)
{
case ESCAPE_KEY: // ASCII Escape Key Code
closeApp();
exit(EXIT_SUCCESS);
break;
case 'a':
boxes[1]->Visible = false;
if (boxes[0]->Position != vec3(0.0f, -3.0f, 0.0f))
{
guesses++;
wrongGuesses++;
wrongGuessesRound++;
totalGuesses++;
}
else
{
win = true;
//totalGuesses++;
//guesses++;
}
glutPostRedisplay();
break;
case 'b':
boxes[2]->Visible = false;
if (boxes[0]->Position != vec3(0.0f, 0.0f, 0.0f))
{
guesses++;
wrongGuesses++;
totalGuesses++;
wrongGuessesRound++;
}
else
{
win = true;
//totalGuesses++;
//guesses++;
}
glutPostRedisplay();
break;
case 'c':
boxes[3]->Visible = false;
if (boxes[0]->Position != vec3(0.0f, 3.0f, 0.0f))
{
guesses++;
wrongGuesses++;
wrongGuessesRound++;
totalGuesses++;
}
else
{
win = true;
//totalGuesses++;
//guesses++;
}
glutPostRedisplay();
break;
case 'r':
if (win)
{
startNewGame();
}
glutPostRedisplay();
break;
}
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
font->printText("Guessing Game!", 260, 560, 20);
font->printText("Press A, B, or C to make one of the boxes disappear!", 10, 540, 15);
font->printText("Try to find the small cube! Press 'r' to restart!", 30, 520, 15);
if (win)
{
font->printText("You win!", 275, 480, 30);
guesses = oldGuess;
wrongGuesses += 0;
}
if (guesses >= 3)
{
guesses = 3;
}
/*if (wrongGuessesRound >= 3)
{
wrongGuessesRound = 3;
}*/
std::stringstream ss1;
ss1 << "Guesses: " << guesses;
font->printText(ss1.str().c_str(), 20, 350, 15);
std::stringstream ss2;
ss2 << "Rounds played: " << rounds;
font->printText(ss2.str().c_str(), 20, 330, 15);
std::stringstream ss3;
ss3 << "Wrong guesses: " << wrongGuesses;
font->printText(ss3.str().c_str(), 20, 290, 15);
std::stringstream ss4;
ss4 << "Total guesses: " << totalGuesses;
font->printText(ss4.str().c_str(), 20, 310, 15);
//std::stringstream ss5;
//ss5 << "Round wrong guesses: " << wrongGuessesRound;
//font->printText(ss5.str().c_str(), 20, 270, 15);
boxes[0]->Draw(camera->ProjectionMatrix, camera->ViewMatrix);
boxes[1]->Draw(camera->ProjectionMatrix, camera->ViewMatrix);
boxes[2]->Draw(camera->ProjectionMatrix, camera->ViewMatrix);
boxes[3]->Draw(camera->ProjectionMatrix, camera->ViewMatrix);
glutSwapBuffers();
}
void init()
{
glClearColor(0.0f, 0.0f, 0.4f, 0.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glEnable(GL_CULL_FACE);
srand(time(NULL));
font = new Font();
camera = new Camera();
camera->ViewMatrix = glm::lookAt(glm::vec3(0, 0, 20), glm::vec3(0, 0, 0), glm::vec3(0, 1, 0));
VertexBufferData vertexBufferData = VertexBufferData("Data\Models\Objects.xml");
boxes.push_back(new Box(vertexBufferData, glm::vec3(0.0f, 0.0f, 0.0f), "data/images/wood.bmp", "Data\Shaders\Vertex.shader", "Data\Shaders\Fragment.shader", vec3(0.4f, 0.4f, 0.4f), true));
boxes.push_back(new Box(vertexBufferData, glm::vec3(0.0f, -3.0f, 0.0f), "data/images/ground.tga", "Data\Shaders\Vertex.shader", "Data\Shaders\Fragment.shader", vec3(1.0f, 1.0f, 1.0f), true));
boxes.push_back(new Box(vertexBufferData,glm::vec3(0.0f, 0.0f, 0.0f), "data/images/metal.bmp", "Data\Shaders\Vertex.shader", "Data\Shaders\Fragment.shader", vec3(1.0f, 1.0f, 1.0f), true));
boxes.push_back(new Box(vertexBufferData, glm::vec3(0.0f, 3.0f, 0.0f), "data/images/brick.bmp", "Data\Shaders\Vertex.shader", "Data\Shaders\Fragment.shader", vec3(1.0f, 1.0f, 1.0f), true));
startNewGame();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(1024, 768);
glutInitContextProfile(GLUT_CORE_PROFILE);
glutCreateWindow("Satterwhite_Project_5");
if (glewInit())
{
cerr << "Unable to init glew" << endl;
exit(EXIT_FAILURE);
}
init();
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutMainLoop();
return 0;
}
为什么不这样开始呢?
void keyboard(unsigned char key, int x, int y)
{
if (win)
{
if ((key == 'a') || (key == 'b') || (key == 'c'))
{
// ignore a,b,c if there is already a winner
return;
}
}
switch (key)
{
...
相关文章:
- 作为赋值(增加引用变量)C++的左操作数所需的左值
- 当我在C++中增加私有静态变量时,程序会抛出错误
- 增加迭代变量背后的直觉?
- C :用sizeof()operator在for for loop中增加一个int变量,只能工作一次
- 静态变量不增加
- 自动增加类中的变量
- 如何让变量在每次运行时增加 "return main();"
- 增加变量名称C
- 如何重新分配和增加字符串变量的值
- OpenMP/C 如何并行增加一个变量
- 如何在LLVM模块中增加全局变量
- 为变量创建局部别名会增加开销吗?
- Arduino:使用按钮增加和减少变量
- 如何使用 SDL2 的计时器函数每 xxx 毫秒将变量增加 1
- 递归中如何增加向量中局部变量的值
- 如何在bool值为真后停止增加变量
- 一个有两个线程的程序,一个线程增加全局变量,另一个线程减少相同的变量,变量是否总是正确的
- 如果我增加一个数组变量会发生什么呢?
- 每次实例化泛型类时增加编译时变量
- 为什么字符大小作为实例变量增加