用pygame做一个背单词小游戏~

最终功能:显示问题和选项在页面上,根据玩家的选择作出回应,正确的选项变绿,错误的选项变红,并记录玩家的得分
先上效果图~
(1)回答正确的页面,右上角可以积分
在这里插入图片描述
(2)回答错误的页面
在这里插入图片描述
为了实现上述功能,需要考虑以下几个点:

  1. 用什么样的方式将题目和选项显示在屏幕上
  2. 如何根据玩家的回答变选项的颜色

首先,关于第一点的思路如下
因为题目和选项的内容在不断变化,给每一个问题和选项都设置一个输出语句不现实
在这种情况下,用文件就比较合适
用readlines方法读出来的文件会存到一个列表中,文件中的每一行都是列表中的一项,但是用print语句输出这个列表后发现,列表中的每一项后面都会带一个换行符
为了删除这个换行符,使用了如下方法
此处还要注意,因为文件中有中文,所以打开文件时必须加上编码方式(应该就是这个原因,我加了才对了)

   f=open(textname,encoding='utf-8')  #transfer gbk(the way of chinese text) to utf-8
        question_data=f.readlines()
        f.close()
        for question_line in question_data:
            self.data.append(question_line.strip()) #load in data[] in lines without any strip
            self.total+=1

也就是逐行读入,再逐项删除换行字符
将数据存入文件还需要一定的格式:
第一行是问题,第2-5行是选项,第6行是答案
就像这样:

接近,方法,通路
access
acess
acces
eccess
1

好了,题库的问题解决了,接下来我们考虑显示的问题
将文字显示在窗口有3步:
(1)new一个Font对象(java的术语习惯了哈哈)
(2)将字体转换为位图
(3)贴图
这里需要特别注意的是,Font没有中文,我用了这个方法显示中文:
自己下载一个中文字体的包,与py文件保存在一起,把Font构造方法中的None改成字体文件的文件名
另外,整个窗口有多处需要显示文字,为了方便,直接把上述操作打包成一个函数,代码如下:

def print_text(font,x,y,text,color=(255,255,255),shadow=True):
    #font conversion
    if shadow:
        #create 2D font
        img_text=font.render(text,True,(0,0,0))
        screen.blit(img_text,(x-2,y-2))

    img_text=font.render(text,True,color)
    screen.blit(img_text,(x,y))

这里设置了shadow参数,决定是否显示2D字体(就是普通字体后面带一块阴影哈哈)

接下来,我们来解决如何根据用户的输入来改变选项颜色的问题:
逻辑很简单:接收用户输入->判断是否正确->改变相应选项的颜色
接收用户输入+判断正误:

 #handdle player's answer
    def handdle_answer(self,player_input):
        if not self.scored and not self.failed:
            #in case to when the player have answered question without pressing enter to next
            if player_input==self.correct:
                self.scored=True
                self.score+=1
            else:
                self.wronganswer=player_input
                self.failed=True

每一题的正确答案都保存在“第六行”(题库文件把答案序号放在了每一题的最后),用correct来保存
与用户输入作对比,正确就置scored属性(下面会讲为啥定义这个变量)为True,反之把用户输入保存在wronganswer变量中,因为错误的选项需要变成红色,并置failed属性(下面会讲)为True
在近期的学习中,我觉得在某些情况下很有必要定义“flag”类型变量,就是标记,它只有两个值,可以放在if语句中做相应操作
这个某些情况,我觉得就是当你的程序需要根据某些结果做出某些反应
这里的scored和failed就是
用户输入正确时,需要将正确选项变成绿色,输入错误时,需要将用户的选择变红,正确的选项变绿

变换颜色:
我觉得这个程序的神奇之处之一就是变颜色这个操作
我们知道,颜色就在将文本贴在窗口上的函数中的一个参数
四个选项的颜色参数每一题都在变化
我们现在能利用的就是已经知道了用户的选择的选项和正确选项,而且它们都是1,2,3,4这种类型
此时就应该想到列表的下标
我们设置一个放四个选项颜色的列表,通过判断用户输入的结果来改变列表的对应项
最后直接取出列表中的对应项来做文本的颜色参数就ok

 #handdle player's answer
          #respond to correct answer
        if self.scored:
            self.colors=[white,white,white,white]  #Is this line  restless?
            self.colors[self.correct-
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值