You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让我的简易Hangman游戏实现重启功能?

解决Hangman游戏重启问题

问题核心是全局变量未重置。你当前的游戏状态(正确答案、占位符、错误字母、剩余猜测次数)都是全局变量,第一次游戏结束后这些值会保留,导致重启时直接使用旧状态,无法重新开始游戏。

以下是针对playgame()和main()函数的修改方案,同时优化代码结构,消除全局变量依赖:

1. 重构playgame():初始化局部游戏状态

将游戏状态变量移到playgame()内部作为局部变量,确保每次调用该函数时都从头初始化全新的游戏状态:

void playgame()
{
    // 每次游戏启动时重置所有状态
    std::string correcans = "coding";
    std::string placeholder = "------";
    std::string wrongans = "";
    int amountguess = 6;

    while (placeholder != correcans && amountguess > 0)
    {
        title();
        hangdraw(amountguess);
        guessdisplay(placeholder, wrongans, amountguess);
        char letter = input();
        guess(letter, correcans, placeholder, amountguess, wrongans);
        system("cls");
    }

    winorlose(correcans, placeholder, amountguess, wrongans);
}

2. 修改依赖状态的函数:改用参数传递

原来的函数依赖全局变量,现在需要将状态变量作为参数传入,确保每个函数只处理当前游戏的状态:

修改guessdisplay函数

void guessdisplay(const std::string& placeholder, const std::string& wrongans, int amountguess)
{
    std::cout << std::endl;
    std::cout << placeholder; 
    std::cout << std::endl;
    std::cout << "\n------------------------------------------" << std::endl;
    std::cout << "|              Wrong Letters             |";
    std::cout << "\n------------------------------------------" << std::endl;

    std::cout << wrongans;

    std::cout << "\n------------------------------------------" << std::endl;

    std::cout << "Guesses Left: " << amountguess << std::endl;
}

修改guess函数

void guess(char letter, const std::string& correcans, std::string& placeholder, int& amountguess, std::string& wrongans)
{
    bool sameletter = false;
    for (int i = 0; i < placeholder.size(); i++)
    {
        if (correcans[i] == letter)
        {
            placeholder[i] = correcans[i];
            sameletter = true;
        }
    }

    if (!sameletter)
    {
        amountguess -= 1;
        wrongans += letter;
    }
}

修改winorlose函数

void winorlose(const std::string& correcans, const std::string& placeholder, int amountguess, const std::string& wrongans)
{
    title();
    hangdraw(amountguess);
    guessdisplay(placeholder, wrongans, amountguess);

    if (placeholder == correcans)
    {
        std::cout << "\n------------------------------------------" << std::endl;
        std::cout << "|                  YOU WIN!!!            |";
        std::cout << "\n------------------------------------------" << std::endl;
    }
    else
    {
        std::cout << "\n------------------------------------------" << std::endl;
        std::cout << "|                YOU LOSE!!!             |";
        std::cout << "\n------------------------------------------" << std::endl;
    }
}

3. 优化main()函数(可选)

保留原有循环逻辑,可添加清屏操作提升体验:

int main()
{
    bool isRunning = true;

    while (isRunning)
    {
        playgame();

        std::cout << "Would you like to play again (y/n)? ";

        char userChoice;
        std::cin >> userChoice;

        if (userChoice == 'y' || userChoice == 'Y')
        {
            isRunning = true;
            system("cls"); // 清屏后启动新游戏
        }
        else
        {
            isRunning = false;
        }
    }

    return 0;
}

完整修改后的代码

#include <iostream>
#include <string>

void title()
{
    std::cout << "##########################################" << std::endl;
    std::cout << "#                HANGMAN                 #" << std::endl;
    std::cout << "##########################################\n" << std::endl;
}

void hangdraw(int amountguess)
{
    if (amountguess == 6)
    {
        std::cout << " |-----------------|" << std::endl;
        std::cout << " |                 " << std::endl;
        std::cout << " |" << std::endl;
        std::cout << " |" << std::endl;
        std::cout << "_|__________________|" << std::endl;
    }
    else if(amountguess == 5)
    {
        std::cout << " |-----------------|" << std::endl;
        std::cout << " |                 0" << std::endl;
        std::cout << " |                 " << std::endl;
        std::cout << " |" << std::endl;
        std::cout << "_|__________________|" << std::endl;
    }
    else if (amountguess == 4)
    {
        std::cout << " |-----------------|" << std::endl;
        std::cout << " |                 0" << std::endl;
        std::cout << " |                 |" << std::endl;
        std::cout << " |                  " << std::endl;
        std::cout << "_|__________________|" << std::endl;
    }
    else if (amountguess == 3)
    {
        std::cout << " |-----------------|" << std::endl;
        std::cout << " |                 0" << std::endl;
        std::cout << " |                 |" << std::endl;
        std::cout << " |                /" << std::endl;
        std::cout << "_|__________________|" << std::endl;
    }
    else if (amountguess == 2)
    {
        std::cout << " |-----------------|" << std::endl;
        std::cout << " |                 0" << std::endl;
        std::cout << " |                 |" << std::endl;
        std::cout << " |                / \\" << std::endl;
        std::cout << "_|__________________|" << std::endl;
    }
    else if (amountguess == 1)
    {
        std::cout << " |-----------------|" << std::endl;
        std::cout << " |                 0 /" << std::endl;
        std::cout << " |                 |" << std::endl;
        std::cout << " |                / \\" << std::endl;
        std::cout << "_|__________________|" << std::endl;
    }
    else if (amountguess == 0)
    {
        std::cout << " |-----------------|" << std::endl;
        std::cout << " |               \\ 0 /" << std::endl;
        std::cout << " |                 |" << std::endl;
        std::cout << " |                / \\" << std::endl;
        std::cout << "_|__________________|" << std::endl;
    }
}

void guessdisplay(const std::string& placeholder, const std::string& wrongans, int amountguess)
{
    std::cout << std::endl;
    std::cout << placeholder; 
    std::cout << std::endl;
    std::cout << "\n------------------------------------------" << std::endl;
    std::cout << "|              Wrong Letters             |";
    std::cout << "\n------------------------------------------" << std::endl;

    std::cout << wrongans;

    std::cout << "\n------------------------------------------" << std::endl;

    std::cout << "Guesses Left: " << amountguess << std::endl;
}

char input()
{
    std::cout << "Guess Letter: ";
    char letter;

    std::cin >> letter;

    std::cin.clear();
    std::cin.ignore();

    return letter;
}

void guess(char letter, const std::string& correcans, std::string& placeholder, int& amountguess, std::string& wrongans)
{
    bool sameletter = false;
    for (int i = 0; i < placeholder.size(); i++)
    {
        if (correcans[i] == letter)
        {
            placeholder[i] = correcans[i];
            sameletter = true;
        }
    }

    if (!sameletter)
    {
        amountguess -= 1;
        wrongans += letter;
    }
}

void winorlose(const std::string& correcans, const std::string& placeholder, int amountguess, const std::string& wrongans)
{
    title();
    hangdraw(amountguess);
    guessdisplay(placeholder, wrongans, amountguess);

    if (placeholder == correcans)
    {
        std::cout << "\n------------------------------------------" << std::endl;
        std::cout << "|                  YOU WIN!!!            |";
        std::cout << "\n------------------------------------------" << std::endl;
    }
    else
    {
        std::cout << "\n------------------------------------------" << std::endl;
        std::cout << "|                YOU LOSE!!!             |";
        std::cout << "\n------------------------------------------" << std::endl;
    }
}

void playgame()
{
    std::string correcans = "coding";
    std::string placeholder = "------";
    std::string wrongans = "";
    int amountguess = 6;

    while (placeholder != correcans && amountguess > 0)
    {
        title();
        hangdraw(amountguess);
        guessdisplay(placeholder, wrongans, amountguess);
        char letter = input();
        guess(letter, correcans, placeholder, amountguess, wrongans);
        system("cls");
    }

    winorlose(correcans, placeholder, amountguess, wrongans);
}

int main()
{
    bool isRunning = true;

    while (isRunning)
    {
        playgame();

        std::cout << "Would you like to play again (y/n)? ";

        char userChoice;
        std::cin >> userChoice;

        if (userChoice == 'y' || userChoice == 'Y')
        {
            isRunning = true;
            system("cls");
        }
        else
        {
            isRunning = false;
        }
    }

    return 0;
}

关键说明

  • 移除全局变量后,每次调用playgame()都会创建全新的游戏状态,彻底解决重启时状态残留的问题。
  • 改用参数传递状态,代码更模块化,避免全局变量带来的状态污染风险。
  • 新增的清屏操作可提升游戏重启时的视觉体验。

内容的提问来源于stack exchange,提问作者Shaye

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 01:40:33