您好,所以我试图使用C++制作游戏(基于神奇宝贝),但结果却很奇怪。
基本上,您输入您的名字,然后说您叫这个名字。如果是,系统将询问您喜欢哪种类型。但是,如果输入N然后输入Y,由于某种原因,它会多次询问用户他们喜欢哪种类型。
我的代码:
Animals.cpp(我只说这一个是因为它是程序询问用户的地方):

// Animals.cpp : This file contains the 'main' function. Program execution begins and ends there.
//
void startgame();
void askname();
void asktype();
void giveGrassStarter();
void giveWaterStarter();
void giveFireStarter();
#include <iostream>
#include "plantee.h"
// #include "visualanimal.h"
#include <cstring>
using namespace std;
string name;
char type;
char answer;
bool success;

int main()
{
    using namespace Animals;
    startgame();
    return 0;
}
void startgame() {
    askname();
    cout << "Alright then. You're " << name << " , right?" << "(Y/N)";
    cin >> answer;
    switch (answer) {
        case 'N':
            startgame();
    }
    asktype();
}
void askname() {
    cout << "Welcome. Your Journey In the World Of Animals Starts here . Please input your name";
    cin >> name;
}
void asktype() {
    cout << "Welcome " << name << " . What type do you prefer? Water ? Grass? Fire? (W/G/F)";
    cin >> type;
    switch (type) {
    case 'G':
        giveGrassStarter();
        break;
    case 'W':
        giveWaterStarter();
        break;
    case 'F':
        giveFireStarter();
        break;
    default:
        cout << "Input invalid . (G for Grass , W for Water , F for Fire)";
        asktype();
    }
}

void giveGrassStarter()
{
    cout << "So you chose Plantee , the grass-type starter. Good choice";
    Plantee starter;
}

void giveWaterStarter()
{
    cout << "So you chose Wateree , the water-type starter. Good choice";
}

void giveFireStarter()
{
    cout << "So you chose Flamee , the fire-type starter. Good choice";
}
有人知道我在做什么错吗?

最佳答案

那是因为您使用循环进行验证。如果您继续这样做,将会给您带来困难。
让我们检查一下调用堆栈(函数名附近的数字是递归深度):

  • main()调用startGame1
  • startGame1要求输入,您输入N,就会调用startGame2
  • startGame2调用askType
  • askType执行其操作并返回。
  • startGame2返回
  • startGame1之后接听switch,下一条指令是调用askType
  • askType再次执行其操作。

  • 您可以改用while循环:
    void startgame() {
        char answer = 'N';
        while (answer == 'N') {
            askname();
            cout << "Alright then. You're " << name << " , right?" << "(Y/N)";
            cin >> answer;
        }
        asktype();
    }
    
    另外,请尝试避免使用全局变量。他们是常见的麻烦制造者。您只需要在一个函数中添加answer,即可在其中声明它。与type相同。

    10-08 11:40