Pygame制作答题类游戏的实现
Pygame制作答题类游戏的实现
概述
个⼈⽐较喜欢玩这些答题类的游戏,在这类的游戏中其实存在着⼀些冷知识在⾥⾯。练习pygame的过程中,在⽹络上搜索,⼏乎没有到这类游戏的⽰例教程,就蒙⽣了制作⼀个答题游戏的念头,最开始的时候,这个游戏是使⽤键盘输⼊的⽅式来答题的,没有开始界⾯,没有结束界⾯,后来⼏经修改,改为全⿏标操作。打包了exe⽂件,⽆需安装python直接点击exe⽂件也可以使⽤。
详细
主要思路
游戏⼀般都有⼀个显⽰名称的title页,还有⼀个关于游戏介绍的界⾯,以及主要的内容——答题的界⾯。还有游戏结束时的⼀些统计数据。预想中的游戏完整是还包含了题库在线获取,有统计榜等内容,但是由于⾃⼰没有可以使⽤的公⽹地址和存储,这个演⽰改为单机版。
准备⼯作
开发的过程中,只使⽤了pygame⼀个外部库。其他的特性都是使⽤python⾃带的。
本游戏使⽤到的图⽚来⾃⽹络,做了少量的处理。包括了⼀张图⽚作为⿏标样式,⼀张图⽚作为开始界⾯的背景,⼀张图⽚作为游戏过程的背景,⼀张图⽚作为游戏结束时统计的背景。
收集⼀些题⽬,保存为xml⽂件,⽂件的结构如下图:
为增加游戏的可玩性和惊喜度,题量尽量不要少于50题,这⾥我只是作为测试和演⽰,只收集了20题内容,基本上是python的基础知识题。
需要⾃定义字体,否则将⽆法显⽰中⽂,将字体⽂件保存在font⽂件夹中。
titleFont = pygame.font.Font('f', 150)
globalFont = pygame.font.Font('f', 36)
questionFont = pygame.font.Font('f', 24)
answerFont = pygame.font.Font('f', 22)
helpFont = pygame.font.Font('f', 24)
实现过程的部分代码展⽰
1. ⾃定义⿏标样式代码,概念上就是先获取⿏标的坐标,隐藏原来的⿏标样式,重新定义⿏标的位置是图⽚的什么位置,我是定义在图⽚的左上⾓,然后将该图⽚画出。这样
的步骤就完成了⾃定义⿏标。
mouseCursor = pygame.image.load('img/cursor.png').convert_alpha()
载⼊⿏标的图⽚时,记得需要转换透明区域,图⽚的保存也是需要保存为可以保留透明区域的图⽚格式
x, y = _pos()  # 获取⿏标的坐标
mouseCursor = pygame.image.load('img/cursor.png').convert_alpha()  # 载⼊⿏标的图⽚
x -= 0
y -= 0
SUBFACE.blit(mouseCursor, (x, y))  # 绘画出⿏标样式,并且定义⿏标的坐标
2. 读取题库的实现,题⽬保存在⼀个xml⽂件中。使⽤内置的xml模块读取该⽂件,并解析出题⽬、答案、正确答案等信息。然后再随机取出其中的10道题,形成本次开始游
戏的题⽬。
assert ists(filename), '题库⽂件: %s 不存在,游戏⽆法执⾏。' % (filename)
利⽤assert做断⾔判断,如果加载的题库⽂件不存在,直接把游戏奔溃掉,因为如果没有题库这个就什么都玩不了了。
# 读取xml⽂件中的题库
question_data = parse(filename)
# 得到根节点
root = question_data.documentElement
game_level = []
questions = ElementsByTagName("question")
for item in questions:
q_list = {}
answerList = []
question = Attribute("title")
answer_items = ElementsByTagName("answer")  # 返回⼀个列表
answerList.append(answer_items[0].getElementsByTagName("a")[0].childNodes[0].data)
answerList.append(answer_items[0].getElementsByTagName("b")[0].childNodes[0].data)
answerList.append(answer_items[0].getElementsByTagName("c")[0].childNodes[0].data)
answerList.append(answer_items[0].getElementsByTagName("d")[0].childNodes[0].data)
correct = ElementsByTagName("correct")[0].childNodes[0].data
q_list['question'] = question
q_list['answers'] = answerList
q_list['correct'] = correct
game_level.append(q_list)
上⾯的代码会将xml⽂件中的数据读取出来后存放为⼀个列表,每⼀道题是⼀个字典,包括了题⽬、四个选择答案、正确的答案三个部分,⽽选择答案⼜是⼀个列表。
# ⽣产随机指定数量的题集,利⽤set的去重特性,这样当set的长度是10时,就是10个不重复的数字
tmp_level = set()
while len(tmp_level) < 10:
randNum = random.randint(0, len(game_level) - 1)
tmp_level.add(randNum)
new_question = []
for i in tmp_level:
怎么制作游戏
new_question.append(game_level[i])
# 因为set的缘故,提取出来的题⽬是按顺序排列的,需要打乱⼀次,形成每次游戏时的题⽬顺序的独特随机性
random.shuffle(new_question)
return new_question
最后是随机⽣成指定数量的⼀组数字,⽤于获取随机的问题集,由于set()是有序的,在获取了新的随机问题集完成后,还需要再将这个问题集打乱。这样做的⽬的可以让每次开始游戏时,都存在随机性,就算两次随机选择出来的题⽬⼀样,也会因为再次随机打乱⽽显⽰不同。
整个读取⽂件的函数,是这个游戏的重要部分,其他的内容⽆⾮就是界⾯的显⽰⽽已。
3. 答题控制的逻辑,先获取⿏标的当前位置,当⿏标在答案的⽅形范围内,就先将答案改变颜⾊,提⽰玩家当前选中备选的是已经改变颜⾊的答案。点击该答案后,就判断和
该题的正确答案是否⼀致,⼀致返回yes错误返回no,这两个返回的值⽤于统计答题正确率和分数。
x, y = _pos()  # 获取⿏标的位置
pressed = _pressed()  # 获取⿏标的事件
# 四个答案区域的内容的⿏标⿏标时间控制
if item1_rect.left < x < item1_rect.right and p < y < item1_rect.bottom:
item1_image = der('1 - ' + level_answer[0], True, color_dict['gold'])
SURFACE.blit(item1_image, item1_rect)
for event in pressed:
if event == 1:
if level_correct == 1:
return 'yes'
else:
return 'no'
# 其他三个答案的判断同理,不再重复演⽰
4. 最好把完成的代码使⽤pyinstaller打包成exe⽂件,这⾥我是在⼀个32位的window系统下打包的,所以⽂件可以在32位和64位的window系统中直接执⾏。
pyinstall -F answer.py -i img/delbrucks-brain.ico
### 运⾏效果与⽂件截图
1. 游戏的初始标题界⾯
![标题界⾯](www.demodashi/contentImages/image/20180706/qlLTmvLd5LytOAHl7bF.png "标题界⾯")
2. 游戏的主界⾯,也就是游戏界⾯
![主游戏界⾯](www.demodashi/contentImages/image/20180706/WnrUjVxRTqXzmbhPFmV.png "主游戏界⾯")
3. 游戏的结束统计界⾯
![游戏结束统计界⾯](www.demodashi/contentImages/image/20180706/nbBIXeg05srvNmjGc7j.png "游戏结束统计界⾯")
4. 关于游戏界⾯
![关于游戏界⾯](www.demodashi/contentImages/image/20180706/fD3MsOsboF4h7bL2fLe.
png "关于游戏界⾯")
5. 项⽬的结构,font⽂件夹为游戏需要的字体,img⽂件夹为⽤到图⽚⽂件
![项⽬结构](www.demodashi/contentImages/image/20180706/IUhpttyaEeDkdWq01Li.png "项⽬结构")
6. 压缩包下载后解压出来是长这个样⼦
![压缩包结构](www.demodashi/contentImages/image/20180706/Q5g7MmlkOJy6wXZRWX7.png "压缩包结构")
### 其他补充
使⽤了pyinstaller将整个项⽬打包成exe⽂件,可以在不安装python运⾏环境的情况下运⾏体验,可以⾃⾏修改l⽂件。修改⾥⾯的题⽬,形成⾃⼰新的题库。
如果需要移植到mac或者linux系统中运⾏,也是可以的,理论上可能需要修改字体⽂件即可,但本⼈未测试。如果需要请⾃⾏测试。
源码⾥⾯有⼀段在测试的时候作弊⽤的代码,注释掉,没有删除,如果有兴趣可以按照那个思路去做⼀些所谓的作弊,但其实作为答题游戏,也没有什么可以作弊的,⽆⾮就是提⽰和显⽰答案。Pygame制作答题类游戏的实现> 代码地址如下:<br>www.demodashi/demo/13495.html
> 注:本⽂著作权归作者,由demo⼤师代发,拒绝转载,转载需要作者授权

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。