用c ++编写的Hangman游戏

时间:2015-06-27 02:55:24

标签: c++

所以我决定今天做一个刽子手游戏。我坐下来开始写作,但我觉得我做的事情很长。我还在学习c ++,所以我不知道这是否更简单,但是我现在正在做这件事......

#include <iostream>
#include <time.h>
#include <windows.h>

using namespace std;
string word = "undefined";
char guess;
int incorrect = 0;
bool a = false;
bool b  = false;
bool c = false;
bool d  = false;
bool e  = false;
bool f  = false;
bool g  = false;
bool h  = false;
bool i  = false;
bool j  = false;
bool k  = false;
bool l  = false;
bool m  = false;
bool n  = false;
bool o  = false;
bool p  = false;
bool q  = false;
bool r  = false;
bool s  = false;
bool t  = false;
bool u  = false;
bool v  = false;
bool w  = false;
bool x  = false;
bool y  = false;
bool z  = false;
bool ga = false;
bool gb  = false;
bool gc = false;
bool gd  = false;
bool ge  = false;
bool gf  = false;
bool gg  = false;
bool gh  = false;
bool gi  = false;
bool gj  = false;
bool gk  = false;
bool gl  = false;
bool gm  = false;
bool gn  = false;
bool go  = false;
bool gp  = false;
bool gq  = false;
bool gr  = false;
bool gs  = false;
bool gt  = false;
bool gu  = false;
bool gv  = false;
bool gw  = false;
bool gx  = false;
bool gy  = false;
bool gz  = false;
int checkletterdog();
int checkWin();



void guessletter();

int main()
{
    cout << "welcome to josh's hangman game!" << endl;
    cout << "Generating random word....\n\n" << endl;
    srand(time(NULL));
    //int wordpicker = (rand()%10) + 1;
    int wordpicker = 1;
    switch(wordpicker) {
case 1:
    word = "dog";
    cout << "---\n";
    d = true;
    o = true;
    g = true;
    guessletter();
    checkletterdog();
    guessletter();
checkletterdog();
guessletter();
checkletterdog();
checkWin();
guessletter();
checkletterdog();
checkWin();
guessletter;
checkletterdog();
checkWin();
    break;








    return 0;

}

void guessletter(){
    cout << "Incorrect guesses: " << incorrect << endl;
    cout << "Guess a letter" << endl;
    cin >> guess;
}

int checkletterdog(){
    if(gd == true && incorrect<5){
        switch(guess){
        case 'o':
            cout << "Correct!\ndo-" << endl;
            go = true;
            break;
        case 'g':
            gg = true;
            cout << "Correct!\nd-g" << endl;
            break;
        default:
            cout << "INCORRECT" << endl;
            incorrect++;
        }
    }else if(go == true && incorrect<5){
        switch(guess){
        case 'd':
            cout << "Correct!\ndo-" << endl;
            gd = true;
            break;
        case 'g':
            gg = true;
            cout << "Correct!\n-og" << endl;
            break;
        default:
            cout << "INCORRECT" << endl;
            incorrect++;
        }
    }else if(gg == true && incorrect<5){
        switch(guess){
        case 'd':
            cout << "Correct!\nd-g" << endl;
            gd = true;
            break;
        case 'o':
            go = true;
            cout << "Correct!\n-og" << endl;
            break;
        default:
            cout << "INCORRECT" << endl;
            incorrect++;
        }
    }else if(gd == true && go == true && incorrect<5){
        switch(guess){
        case 'g':
            cout << "Correct!\ndog" << endl;
            gg = true;
            break;
        default:
            cout << "INCORRECT" << endl;
            incorrect++;
        }
    }else if(gd == true && gg == true && incorrect<5){
        switch(guess){
        case 'o':
            go = true;
            cout << "Correct!\ndog" << endl;
            break;
        default:
            cout << "INCORRECT" << endl;
            incorrect++;
        }
    }else if(go == true && gg == true && incorrect<5){
        switch(guess){
        case 'd':
            cout << "Correct!\ndog" << endl;
            gd = true;
            break;
        default:
            cout << "INCORRECT" << endl;
            incorrect++;
        }

    }else if(incorrect >= 5){
        cout << "You lose...better luck next time" << endl;
    }else{
        switch(guess){
        case 'd':
            cout << "Correct!\nd--" << endl;
            gd = true;
            break;
        case 'o':
            cout << "Correct!\n-o-" << endl;
            go = true;
            break;
        case 'g':
            gg = true;
            cout << "Correct!\n--g" << endl;
            break;
        default:
            cout << "INCORRECT" << endl;
            incorrect++;
    }
    }

}

int checkWin(){
        if(gd == true && go == true && gg == true && incorrect<5){
        cout << "YOU WIN!!" << endl;
        return 0;
}
}   

我有一个单词列表,但我只是从第一个开始,所以我包括了所有内容。有没有更短的方式这样做..? 编辑:我把它改成一个循环,让玩家猜测,检查信件,并检查游戏是否结束

case 1:
    word = "dog";
    cout << "---\n";
    d = true;
    o = true;
    g = true;
    while(over != true){
    guessletter();
    checkletterdog();
    checkEnd();
    }
    break;

int checkEnd(){
        if(gd == true && go == true && gg == true && incorrect<5){
        cout << "YOU WIN!!" << endl;
        over = true;
} else if(incorrect == 5){
    cout << "You lose!\nBetter luck next time..." << endl;
    over = true;
}
}

这些是我改变的代码部分..但是有一种更简单的方法,我不必手动为其他单词重新执行所有操作吗?

3 个答案:

答案 0 :(得分:0)

你必须对那些长长的bool做些什么。将它们粘在一个数组中(如deviantfan指出的那样)或其他东西。

bool isLetterInWord[26] =  {a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z};

// Initialize letters to false
for(int i = 0; i < 26; i++)
  isLetterInWord[i] = false;

//Accessing dog as in your example
isLetterInWord[3] = true;
isLetterInWord[14] = true;
isLetterInWord[6] = true;

这仍然是一种非常低效的做事方式,但仍然比原始代码有所改进。

其他提示:

尽量避免使用using namespace std。将所有不必要的代码带到这个简短的小刽子手程序中。使用内联命名空间(即std::cout)或使用您在此处使用的std :: Insert std对象。

答案 1 :(得分:0)

@Josh嘿我试图创建一个示例Hangman类并实现Hangman游戏。

看看这个:Demo Link

main()方法如下所示:

int main() {
    // your code goes here
    Hangman h("jack sparrow");

    while ( !h.isLost())
    {
        char guess;
        std::cout << "Guess Letter: ";
        std::cin >> guess;
        bool res = h.play(guess);

        h.print();

        if (h.isWin())
        {
            break;
        }
    }
    if (h.isLost())
    {
        std::cout << "You have lost" << std::endl;
    }
    return 0;
}

答案 2 :(得分:0)

你的方法根本就是错误的。

你基本上是对#34; dog&#34;这个词的程序行为进行硬编码。假设你让它发挥作用,你最终会得到什么?每当您想要使用其他单词时必须深度重写的程序。这完全错了。我知道你是一个初学者,初学者可能会选择一种不是最优的方法,它甚至可能是一件好事,因为犯错会你可以学到很多东西;但在这种情况下,我觉得你必须立即放弃它。这个概念是您无法编写针对特定数据定制的代码。您希望编写适用于通用数据的代码,以便在需要更改数据时,只需更改数据即可立即生效。您的checkletterdog()函数确实是错误的。事实本身,函数的名称包含对它所处理的数据的引用(&#34; dog&#34;)通常表明您的设计是错误的。你看到你写了多少代码来处理一个3个字母的单词?你是否意识到更长的单词会占用更多的代码?而且您必须为每个新单词添加大量代码?这是不可持续的。

尝试解决此问题:您的checkletter()函数必须逐个考虑单词的所有字母。这必须是自动的,也就是说,如果这个词是&#34; dog&#34;它会自动检查&#34; d&#34;,&#34; o&#34;,&#34; g&#34 ;;如果它是另一个词,比如&#34; tiger&#34;,它会检查&#34; t&#34;,&#34; i&#34;,&#34; g&#34;,&#34; e&#34;,&#34; r&#34;。你的代码中没有任何地方你会看到类似的东西(伪代码!)

if (word == "dog") {
    check('d') and in case print it, else print '-'
    check('o') and in case print it, else print '-'
    check('g') and in case print it, else print '-'
} else if (word == "tiger") {
    //do the same stuff with the letters of tiger
}

相反,你必须编写一些代码,这些代码可以通过字符串的字母,无论是哪个字符串。然后,对于这些字母中的每一个,检查是否已经被玩家猜到了。如果是,请打印(以其中为准);如果不是,请打印'-'

一个实用的建议:一种方法是定义一个字母矢量,并将该矢量初始化为完整的字母表。这些是玩家的选择。每次玩家选择一个玩家时,你必须将其从该向量中移除(假设选择是正确的,也就是说,玩家选择了一个尚未被选中的字母,可能不是这样,但是现在我们可以假设玩家没有给出错误的命令)并检查该单词是否包含该字母。如果是这样,请将该字母添加到正确猜到的字母的另一个向量(最初为空)中;否则,将其添加到错误猜测的向量中(尽管这可能不是完全必需的)。然后,显示更新后的状态:浏览单词的每个字母,如果您找到正确猜到字母的向量,则打印出来,否则打印'-'

这样你就可以处理任何单词,而无需重写代码。

如果所有这些看起来都太难了,我说你应该暂时专注于其他练习。你最终会到达那里,但也许你现在需要学习更多。