三:程序分析 程序的运行结果大家都看到了,符合该游戏的规则,随机性也较强,这就是C++的强大。
我们判断字母是否已经被猜过,是这样做的:
if(badguess.find(guess)!=string::npos|| player.find(guess)!=string::npos) { cout<<"对不起,这个字母您已经猜过了。"; continue; }//判断是否已经猜过 |
因为如果字母被猜过,那么它要么在玩家猜出的残缺单词中,要么处于错误字母集合中,我们用find函数在这两处分别进行了搜索。
对于猜错后的处理,我们又是这样做的:
int temp=first.find(guess); if(temp==string::npos) { cout<<"啊!猜错了。/n"; guesses--; badguess+=guess; }//猜错后的处理 |
首先,我们查找这个字符是否在单词中出现。如果没有出现,find函数将返回string::npos。npos是一个常量,比string能存储的最大元素数多1。如果没有出现,我们先是将猜错的机会减去一次,再用了这个代码:badguess+=guess;将错误的字母加入badguess对象中。想想,这要用常规字符数组有多难?
最后,如果temp不是string::npos,那么我们就说玩家猜对了。但可能这个单词中有多个这样的字母,所以,我们这样做了:
temp=first.find(guess,temp+1); while(temp!=string::npos)//继续搜索该字符,看是否单词中有多个该字符 { player[temp]=guess; temp=first.find(guess,temp+1); } |
这样一来,逐步缩小区间,直到确认单词中再无这个字符为止。大家从运行结果中也可以看到这一点:
您当前猜出的单词:----------a- 您当前猜错的字母集合: 请您猜吧!s 您还剩下10次猜错的机会。 您当前猜出的单词:-----ss---a-//将两个“s”都显示出来了 您当前猜错的字母集合: 大家若有兴趣,可以对这个程序进行扩充,比如加入难度选择、最后给出对玩家的评价等。最后,希望大家能通过这个范例,更加热爱C++! 
2/2 首页 上一页 1 2 |