为什么这个整数是无限递减的
Why is this integer descelating infinitely?
我正试图使用SFML和C++制作一个简单的hangman游戏,但每次没有输入正确的字母,而是输入了一个字母时,我都会遇到一个问题。似乎每次都会发生的是一个常量循环,它将bodyParts减少到0,然后减少到负无穷大。当游戏开始时,没有键盘输入,为什么它会无限向下迭代?谢谢
#include <SFML/Graphics.hpp>
#include <iostream>
#include <string>
using namespace sf;
using namespace std;
int main()
{
static String WORD = "word";
char letter1 = '_';
char letter2 = '_';
char letter3 = '_';
char letter4 = '_';
int bodyParts = 6;
int xoffset = 150;
int yoffset = 50;
bool playing = true;
bool inputLetter = false;
RenderWindow window(VideoMode(400, 400), "Hangman - through the might of SFML");
// Word Bank
sf::Font font;
if (!font.loadFromFile("/home/brandon/Dropbox/Brandon-Nick/C++/Qt-Creator/SFML/Hangman/Hangman/arial.ttf"))
{
// error...
}
Text letterbankText;
letterbankText.setFont(font);
letterbankText.setString("---LETTER BANK---");
letterbankText.setCharacterSize(14);
letterbankText.setColor(Color::White);
letterbankText.setPosition(0, 50);
Text letterbank;
letterbank.setFont(font);
letterbank.setString(" t _ _ _ _ ");
letterbank.setCharacterSize(14);
letterbank.setColor(Color::White);
letterbank.setPosition(0, 75);
// Hangman character
CircleShape head(50.f);
head.setFillColor(Color::Green);
head.setPosition(xoffset, yoffset + 0);
RectangleShape body(Vector2f(10, 90));
body.setPosition(xoffset + 45, yoffset + 100);
body.setFillColor(Color::Blue);
RectangleShape rightArm(Vector2f(60, 10));
rightArm.setPosition(xoffset + 55, yoffset + 120);
rightArm.setFillColor(Color::Magenta);
RectangleShape leftArm(Vector2f(60, 10));
leftArm.setPosition(xoffset - 15, yoffset + 120);
leftArm.setFillColor(Color::Yellow);
RectangleShape leftLeg(Vector2f(60, 10));
leftLeg.setPosition(xoffset - 15 + 65, yoffset + 190);
leftLeg.setFillColor(Color::White);
leftLeg.rotate(135);
RectangleShape rightLeg(Vector2f(60, 10));
rightLeg.setPosition(xoffset - 15 + 75, yoffset + 182.5);
rightLeg.setFillColor(Color::Cyan);
rightLeg.rotate(45);
while (window.isOpen())
{
Event event;
while (window.pollEvent(event))
{
if (event.type == Event::Closed)
window.close();
}
while(playing){
inputLetter = false;
window.clear();
while(inputLetter == false){
// Input letter guess
if (Keyboard::isKeyPressed(Keyboard::W))
{
letter1 = 'W';
letterbank.setString(" t" + String(letter1) + " " + letter2 + " " + letter3 + " " + letter4);
inputLetter = true;
}
else if (Keyboard::isKeyPressed(Keyboard::O))
{
letter2 = 'o';
letterbank.setString(" t" + String(letter1) + " " + letter2 + " " + letter3 + " " + letter4);
inputLetter = true;
}
else if (Keyboard::isKeyPressed(Keyboard::R))
{
letter3 = 'r';
letterbank.setString(" t" + String(letter1) + " " + letter2 + " " + letter3 + " " + letter4);
inputLetter = true;
}
else if (Keyboard::isKeyPressed(Keyboard::D))
{
letter4 = 'd';
letterbank.setString(" t" + String(letter1) + " " + letter2 + " " + letter3 + " " + letter4);
inputLetter = true;
}
else if(Event::KeyPressed){
bodyParts -= 1;
inputLetter = true;
}
else
inputLetter = false;
}
switch(bodyParts){
case 6:
window.draw(head);
case 5:
window.draw(body);
case 4:
window.draw(leftArm);
case 3:
window.draw(rightArm);
case 2:
window.draw(leftLeg);
case 1:
window.draw(rightLeg);
break;
default:
cout << bodyParts;
}
window.draw(letterbankText);
window.draw(letterbank);
window.display();
}
}
return 0;
}
我修复了一些事情,首先是
else if (sf::Event::KeyPressed){
bodyParts -= 1;
inputLetter = true;
}
删除以上内容并让window.pollEvent()
处理事件:
while (window.pollEvent(event))
{
if (event.type == Event::Closed)
window.close();
if (event.type == Event::KeyPressed)
handleInputs(event.key.code, true);
}
在上面的代码中,我让一个函数负责玩家输入handleInputs()
此外,while(playing)
不是必需的,并且应该被移除,因为while(window.isOpen())
已经是游戏循环。
你在switch语句中忘记了break
,在你看到任何身体部位之前就画出了所有的身体部位。我建议创建bool
类型的变量,决定是否画出每个身体部位:
bool drawHead = false;
bool drawBody = false;
bool drawRightArm = false;
bool drawLeftArm = false;
bool drawRightLeg = false;
bool drawLeftLeg = false;
并根据身体部位打开它们:
switch (bodyParts){
case 6:
drawHead = true;
break;
case 5:
drawBody = true;
break;
case 4:
drawLeftArm = true;
break;
case 3:
drawRightArm = true;
break;
case 2:
drawLeftLeg = true;
break;
case 1:
drawRightLeg = true;
break;
default:
;//cout << bodyParts;
}
最终绘制:
window.draw(letterbankText);
window.draw(letterbank);
if (drawHead) window.draw(head);
if (drawBody) window.draw(body);
if (drawRightArm) window.draw(rightArm);
if (drawLeftArm) window.draw(leftArm);
if (drawRightLeg) window.draw(rightLeg);
if (drawLeftLeg) window.draw(leftLeg);
此处的完整代码
'playing'在开头设置为true。也许它需要在某个地方设置为false才能从内部循环中出来。或者可能需要其他一些循环退出条件语句。
我让它工作起来了。我不得不把我的键盘监听器放在polevent事件中。这是更新后的代码:
#include <SFML/Graphics.hpp>
#include <iostream>
#include <string>
using namespace sf;
using namespace std;
int main()
{
static String WORD = "word";
char letter1 = '_';
char letter2 = '_';
char letter3 = '_';
char letter4 = '_';
int bodyParts = 6;
int xoffset = 150;
int yoffset = 50;
bool playing = true;
bool inputLetter = false;
RenderWindow window(VideoMode(400, 400), "Hangman - through the might of SFML");
// Word Bank
sf::Font font;
if (!font.loadFromFile("/home/brandon/Dropbox/Brandon-Nick/C++/Qt-Creator/SFML/Hangman/Hangman/arial.ttf"))
{
// error...
}
Text letterbankText;
letterbankText.setFont(font);
letterbankText.setString("---LETTER BANK---");
letterbankText.setCharacterSize(14);
letterbankText.setColor(Color::White);
letterbankText.setPosition(0, 50);
Text letterbank;
letterbank.setFont(font);
letterbank.setString(" t _ _ _ _ ");
letterbank.setCharacterSize(14);
letterbank.setColor(Color::White);
letterbank.setPosition(0, 75);
// Hangman character
CircleShape head(50.f);
head.setFillColor(Color::Green);
head.setPosition(xoffset, yoffset + 0);
RectangleShape body(Vector2f(10, 90));
body.setPosition(xoffset + 45, yoffset + 100);
body.setFillColor(Color::Blue);
RectangleShape rightArm(Vector2f(60, 10));
rightArm.setPosition(xoffset + 55, yoffset + 120);
rightArm.setFillColor(Color::Magenta);
RectangleShape leftArm(Vector2f(60, 10));
leftArm.setPosition(xoffset - 15, yoffset + 120);
leftArm.setFillColor(Color::Yellow);
RectangleShape leftLeg(Vector2f(60, 10));
leftLeg.setPosition(xoffset - 15 + 65, yoffset + 190);
leftLeg.setFillColor(Color::White);
leftLeg.rotate(135);
RectangleShape rightLeg(Vector2f(60, 10));
rightLeg.setPosition(xoffset - 15 + 75, yoffset + 182.5);
rightLeg.setFillColor(Color::Cyan);
rightLeg.rotate(45);
while (window.isOpen())
{
Event event;
while (window.pollEvent(event))
{
if (event.type == Event::Closed)
window.close();
if(event.type == Event::KeyPressed){
if(event.key.code == Keyboard::W){
letter1 = 'W';
letterbank.setString(" t" + String(letter1) + " " + letter2 + " " + letter3 + " " + letter4);
inputLetter = true;
}
else if(event.key.code == Keyboard::O){
letter2 = 'o';
letterbank.setString(" t" + String(letter1) + " " + letter2 + " " + letter3 + " " + letter4);
inputLetter = true;
}
else if(event.key.code == Keyboard::R){
letter3 = 'r';
letterbank.setString(" t" + String(letter1) + " " + letter2 + " " + letter3 + " " + letter4);
inputLetter = true;
}
else if(event.key.code == Keyboard::D){
letter4 = 'd';
letterbank.setString(" t" + String(letter1) + " " + letter2 + " " + letter3 + " " + letter4);
inputLetter = true;
}
else
bodyParts--;
}
}
inputLetter = false;
window.clear();
switch(bodyParts){
case 6:
window.draw(head);
case 5:
window.draw(body);
case 4:
window.draw(leftArm);
case 3:
window.draw(rightArm);
case 2:
window.draw(leftLeg);
case 1:
window.draw(rightLeg);
break;
default:
cout << bodyParts;
}
window.draw(letterbankText);
window.draw(letterbank);
window.display();
}
return 0;
}
相关文章:
- 如何反转整数参数包
- enum是C++中的宏变量还是整数变量
- 努力将整数转换为链表。不知道我在这里做错了什么
- 整数不会重复超过随机数
- 在C++中手动调整数组大小
- 检查输入是否不是整数或数字
- C++使用整数的压缩数组初始化对象
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 在控制台上输出我从文件中读取的整数,将程序插入无限循环
- 为什么当用户输入除整数之外的任何内容时,我的程序会无限循环输出?C++
- 无限数组C++在一个表达式中使用两个新值调整数组大小
- 无限大小的整数
- 如果输入了非整数,如何防止无限循环
- 元整数平方根中的无限递归
- 为什么使用GCC的x86上的整数溢出会导致无限循环
- 从文件中读取整数时的无限循环
- 当用户输入一个字符而不是浮点和整数时,如何避免无限循环
- 为什么这个整数是无限递减的
- 当 int = 时停止无限循环(不是整数的东西)