4

数週間前に C++ を試し始めたばかりです。C++ を試す前に、Java をかなり理解していました。多くの人が、構文の意味で非常に似ていると私に言いました。

一番下に、戦闘シーンを開始する switch ステートメントがあります。戦うオプションを選択すると、プログラムが終了します。

これが私のコードです:

#include "stdafx.h"
#include <iostream>
#include <cstdlib>     // For rand()
#include <string>
#include <sstream>
#include <algorithm>   // transform()
#include <cctype>      // toupper(), tolower()
#include <functional>  // ptr_fun()
#include <time.h>
// PUT S*** BELOW THIS POINT
//____________________________________________________________________________

using namespace std;

int main()
{
    /*    Expirimental text based adventure game.
     *    Mainly being used for practice methods.
     *    Developed by Zack Cook.

     Generic title. Bad story. Bad interactions. 

     Lots and lots of bad, bad code. Be warned.
     */   

    string charName;

    string charChoice;

    int charDecision;

    int playerHealth = 100;
    int randomNumber;
    int orcHealth = 100;

    srand (time(NULL));

    cout << "_____________________________________________" << endl;
    cout << "|   #####   #########     ###     ###   ### |" << endl;
    cout << "| ###   ###    ###      ### ###    ### ###  |" << endl;
    cout << "|   ###        ###     ###   ###    #####   |" << endl;
    cout << "|     ###      ###     #########     ###    |" << endl;
    cout << "| ###   ###    ###    ###     ###    ###    |" << endl;
    cout << "|   #####      ###    ###     ###    ###    |" << endl;
    cout << "_____________________________________________" << endl;
    cout << "" << endl;
    cout << "" << endl;
    cout << "Welcome player. What is your name?" << endl;
    getline(cin, charName);
    yesOrNo:
    cout << "Hello " << charName << ". Are you ready to begin?" << endl;

    getline(cin, charChoice);

    transform( charChoice.begin(), charChoice.end(), charChoice.begin(), toupper );
    cout << charChoice << endl;
    if(charChoice == "YES"){
        cout << "Good. Let's begin." << endl;
    }
    else if(charChoice == "NO"){
        system ("exit");
    }
    else
    {
        cout << "That is not a good answer." << endl;
        goto yesOrNo;
    }

    cout << "Our story begins with a wanderer named " << charName << " passing through the small town of Hark's Pass." << endl;
    cout << "A little cozy village with no more than 30 or so home stayers.\nThe village men work hard on the farms during the day." << endl;
    cout << "The women cater to the children, and other house hold chores.\nIn the evening, most of the village turns to The Rusty Trough for a bit of drink." << endl;
    cout << "As the sun starts to set, our wanderer, " << charName << ", starts foot towards The Rusty Trough." << endl;
    cout << "As " << charName << " enters the tavern, a heavily drunken Orc man stumbles towards the entrance." << endl;
    cout << "\"I've never seen you 'round here!\" The orc says to our wanderer. \"I think it's time to teach these adventure types what we really think about 'em\"" << endl;

    cout << "" << endl;
    cout << "What will you do?" << endl;
    cout << "1| Get ready to fight!" << endl;
    cout << "2| Call for help!" << endl;
    cout << "3| Try to run!" << endl;
    cout << "4| Do nothing at all!" << endl;
    cout << "5| Try to reason!" << endl;

    cin >> charDecision;

    switch(charDecision)
    {
    case '1': 
        do{
            cout << "FIGHT" << endl;
            randomNumber = rand() % 100 + 1;
            if(randomNumber >= 50){
                orcHealth = orcHealth - (randomNumber - (randomNumber / 5));
            cout << "You hit the orc! He now has " << orcHealth << " life left!" << endl;
            }
            else
            {
                playerHealth = playerHealth - (randomNumber - (randomNumber / 5));
                cout << "The orc hit you! You now have " << playerHealth << " life left!" << endl;
            }
        }while(playerHealth || orcHealth != 0);
        break;

    default:
        break;
    }

    return 0;
}
4

4 に答える 4

7

switch ステートメントは、int charDecision'1'which is a を比較しcharます。

標準入力から に読み取ります。これは、1 を含むことintを意味しcharDecisionます。次に、この 1 を'1'にキャストしたときに 49 に変換されるものと比較しintます。したがって、入力が一致することはありません (49 を入力しない限り)。

修正: と比較する1か、作成charDecisioncharます。

于 2013-08-15T05:56:55.210 に答える
5

変数charDecisionは として宣言されますint

C++ 標準 I/O ストリーム クラス (とりわけcinおよびを含む) は比較的インテリジェントであり、指定した変数の型に基づいて「正しいことを行います」。cout

cin >> charDecisionが実行されるとcin、数値のように見えるすべてのものを読み取り、それを数値のネイティブ表現に変換します。したがって、1そのメニューに入力すると、格納されるのはリテラル番号 1 です。スイッチは、49 の整数値を持つリテラル文字 '1'をテストしているため、49 != 1 であるため、一致しません。

のタイプをcharDecisionto に変更するchar 1、文字の代わりに数値をテストする必要があります'1'

于 2013-08-15T05:56:24.723 に答える
0

while (playerHealth != 0 || orcHealth != 0) それが問題だと思います。

于 2013-08-15T10:12:04.910 に答える
-2

あなたの主な問題はgotoを使用していることです。それを取り除いてください!

yesOrNo:
cout << "Hello " << charName << ". Are you ready to begin?" << endl;

getline(cin, charChoice);

transform( charChoice.begin(), charChoice.end(), charChoice.begin(), toupper );
cout << charChoice << endl;
if(charChoice == "YES"){
    cout << "Good. Let's begin." << endl;
}
else if(charChoice == "NO"){
    system ("exit");
}
else
{
    cout << "That is not a good answer." << endl;
    goto yesOrNo;
}

で置き換えることができます

do
{
    cout << "Hello " << charName << ". Are you ready to begin?" << endl;

    getline(cin, charChoice);

    transform( charChoice.begin(), charChoice.end(), charChoice.begin(), toupper );
    cout << charChoice << endl;
    if(charChoice == "YES"){
        cout << "Good. Let's begin." << endl;
        startGame();//it is the function where you should place your game logic, the "switch" block in your case
        //if you want to get back to main menu after the end of the game you can delete next line:
        break;//leave this loop
    }
    else if(charChoice == "NO"){
        break;//leave this loop
    }
    else
    {
        cout << "That is not a good answer." << endl;
    }
} while (true);

また、この方法で、ゲーム終了後にメイン メニューに戻ることができます。
また、ゲーム ロジックをさまざまな関数に分割することをお勧めします。コードの記述と保守がはるかに簡単になります。また、ゲームが終わったら、オブジェクト指向の方法でゲームを書き直すことをお勧めします。これは良い練習になります。そして忘れてくださいgoto、それはどんなコードもがらくたに変えることができます.

于 2013-08-15T09:03:09.380 に答える