所以我决定今天做一个刽子手游戏。我坐下来开始写作,但我觉得我做的事情很长。我还在学习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;
}
}
这些是我改变的代码部分..但是有一种更简单的方法,我不必手动为其他单词重新执行所有操作吗?
答案 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
}
相反,你必须编写一些代码,这些代码可以通过字符串的字母,无论是哪个字符串。然后,对于这些字母中的每一个,检查是否已经被玩家猜到了。如果是,请打印(以其中为准);如果不是,请打印'-'
。
一个实用的建议:一种方法是定义一个字母矢量,并将该矢量初始化为完整的字母表。这些是玩家的选择。每次玩家选择一个玩家时,你必须将其从该向量中移除(假设选择是正确的,也就是说,玩家选择了一个尚未被选中的字母,可能不是这样,但是现在我们可以假设玩家没有给出错误的命令)并检查该单词是否包含该字母。如果是这样,请将该字母添加到正确猜到的字母的另一个向量(最初为空)中;否则,将其添加到错误猜测的向量中(尽管这可能不是完全必需的)。然后,显示更新后的状态:浏览单词的每个字母,如果您找到正确猜到字母的向量,则打印出来,否则打印'-'
。
这样你就可以处理任何单词,而无需重写代码。
如果所有这些看起来都太难了,我说你应该暂时专注于其他练习。你最终会到达那里,但也许你现在需要学习更多。