为什么这个整数是无限递减的

Why is this integer descelating infinitely?

本文关键字:无限 整数 为什么      更新时间:2023-10-16

我正试图使用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;
}