大家好,欢迎来到Python实战专题。
今天我们继续用Python实现一个小游戏,不过和之前的相比,这次的小游戏难度要大上一些,涉及的Python的一些基本的语法也会更多,总体来说想要凭借一己之力不参考别人代码做出来,代码也写得好看并不是一件非常容易的事情。之前觉得太容易的小伙伴,这次应该就能体会到难度了。
今天做的是一个猜词的小游戏,特别能考验你的英语词汇量,我自己玩了几把,一直被吊打,可以说是非常尴尬了。大家做完了之后也可以试试,看看自己的英语水平怎么样。
课题
这次的课题是实现一个hangman小游戏。
hangman翻译过来就是吊死的人,其实是两个人的对抗小游戏。一个人在心里想一个单词,另外一个人来猜。每猜错一次,出题的人就要在纸上画上一笔,当完整地画出来一个吊死的人的时候,猜题的人就输了。
玩起来大概就是下面这个样子。
我们实现的时候就不用考虑对抗了,单纯的人机就可以了。电脑出题我们来猜,在小人吊死之前我们猜出来就赢了,否则就是电脑赢了。
知识点
首先一个棘手的问题就是电脑怎么出题?
随机单词
在这个游戏当中,电脑出的题其实就是单词,所有英文的单词都可以作为题目。所以我们只需要用程序随机出一个单词来即可。问题就转化成了我们到哪里可以找到英文的单词库呢?
这个我估计大家都知道,可以借助搜索引擎。但有的时候如果我们直接输入中文,出来的结果可能不是那么理想,这个时候我们可以转变思路试着输入一下英文,反而可能获得更好的结果。我们在搜索引擎上输入我们的问题:how to pick a random word,顺着Stack Overflow,就找到了我们想要的。
image-20210119145610067
图形输出
虽然我们只是命令行当中运行的程序,但是大家应该也都能注意到,我们是有字符组成的界面输出的。
字符组成的图案没什么特别好的方法,主要还是要通过人工来完成。这里人工来组成图案有两种方式,第一种是一行一行地准备,比如下面这样:
print(" ________")print(" | \|")print(" o |")print(" /|\ |")print(" / |")print(" |")print(" ___________|___")
在Python当中还有一种方式就是使用三个引号来引出我们想要输出的多行内容,所以上面的图案也可以写成这样:
print(''' ________ | \| o | /|\ | / | | ___________|___ ''')
这两种方式都是可以的,大家根据自己的喜好选择就行。一般来说我比较倾向于后者,因为写起来更加的方便可控。
set使用
在这个问题当中我们每次在用户输入字符的时候都需要判断用户输入的字符是否在被电脑选中的字符串当中出现,如果没有出现的话就视为用户使用掉了一次机会。
判断字符是否在字符串当中出现,或者是判断某一个元素是否在数组当中出现,在Python当中比较简单,可以直接使用in关键字实现。比如说我们要判断'-'是否在字符串当中出现,我们可以:
'-' in word
同理,判断元素是否在数组当中出现也一样可以通过in来实现。这里我们使用了set,因为set的查询会比数组查询更加高效,虽然在这道题当中意义不大,但是可以帮助我们养成重视性能的良好习惯。
set的使用也非常简单,它可以通过一个list或者是string来直接得到。比如:
arr = [1, 34, 2, 4, 7]word = 'hello world'st = set(arr)wst = set(word)
set表示的是集合,所以可以进行集合的并集、交集的操作。比如我们要求两个集合的并集和交集可以分别写成:
st1 & st2st1 | st2
不但如此,我们还可以做集合的差集,即在集合A不在集合B当中的新集合,可以写成:
setA - setB
先搭框架再开发
今天的这个课题整个游戏虽然很简单,但是里面的逻辑用代码来写的话还是有一点复杂的。
作为新手,我们第一次面临这种项目的时候,首先要做的不是着急写代码,而是先思考。先对整个项目要进行的事情做一个简单的分析,对项目的结构做一个简单的设计。如果上来动手就写代码,你会发现写代码的过程非常不顺,经常要做大的调整。一个比较好的方法是我们可以把一些单独的功能抽象成函数,我们先打框架,再进行实现。打框架的时候不对函数的具体功能做实现,只是留一个注释表明这个函数是干什么的。
整个框架打完之后应该是这样的:
def get_random_word(): passdef draw(guess_cnt): passif __name__ == '__main__': word = get_random_word() guess_cnt = 0 while guess_cnt < 7: # 画图 draw(guess_cnt) # 游戏流程 pass if win: print('you win...') else: print('you lose...')
怎么样,这样再去实现每一个函数里的功能,是不是整个代码就清晰多了?当大家熟悉了这一套流程之后,很多步骤可以逐渐省略,这个时候也就自然成了开发老鸟了。
尾声
基本上本次课题用到的知识点就是上面这些,大家不妨试试看自己亲自动手写一写练练手,如果实在写不出来可以在公众号后台回复Python3,我把我的代码发给你们。
这个游戏还可以进一步做得更加复杂一些,比如说在游戏结束的时候不直接退出,而是询问是否进行下一盘游戏。再比如说可以给不同的单词不同的得分,可以多局游戏累计得分。只要愿意想,可以做的改动还是很多的,大家不妨亲自试一试。
今天的文章就到这里,衷心祝愿大家每天都有所收获。如果还喜欢今天的内容的话,请来一个三连支持吧~(点赞、在看、转发)