目录
本篇博文将使用Python代码语言简单编写一个轻松益智的小游戏,效果如下所示:

1、设计思路
本项目使用SQLite建立问答题库,每道题包括4个选项答案(3个正确答案,1个错误答案)。每道题都有一定分值,根据用户的答题效率,自动计算出最后的答题成绩。

2、建立题库
使用SQLite数据库建立题库,本质上就是SQL语句,创建exam表,实现代码如下所示:
  
   - 
    
     
    
    
     
      #导入SQLite驱动
     
    
- 
    
     
    
    
     
      import sqlite3 
     
    
- 
    
     
    
    
     
      # 连接到SQLite数据库,数据库文件是test.db
     
    
- 
    
     
    
    
     
      # 如果文件不存在,会自动在当前目录创建:
     
    
- 
    
     
    
    
     
      conn = sqlite3.connect(
      'test2.db')
     
    
- 
    
     
    
    
     
      cursor = conn.cursor()
      # 创建一个Cursor:
     
    
- 
    
     
    
    
     
      #cursor.execute("delete from exam")
     
    
- 
    
     
    
    
     
      # 执行一条SQL语句,创建exam表:
     
    
- 
    
     
    
    
     
      cursor.execute(
      'CREATE TABLE [exam] ([question] VARCHAR(80) NULL,[Answer_A] VARCHAR(1) NULL,[Answer_B] VARCHAR(1) NULL,[Answer_C] VARCHAR(1) NULL,[Answer_D] VARCHAR(1) NULL,[right_Answer] VARCHAR(1) NULL)')
     
    
- 
    
     
    
    
     
      # 继续执行一条SQL语句,插入一条记录:
     
    
- 
    
     
    
    
     
      cursor.execute(
      "insert into exam (question, Answer_A,Answer_B,Answer_C,Answer_D,right_Answer) values ('哈雷慧星的平均周期为', '54年', '56年', '73年', '83年', 'C')")
     
    
- 
    
     
    
    
     
      cursor.execute(
      "insert into exam (question, Answer_A,Answer_B,Answer_C,Answer_D,right_Answer) values ('夜郎自大中“夜郎”指的是现在哪个地方?', '贵州', '云南', '广西', '福建', 'A')")
     
    
- 
    
     
    
    
     
      cursor.execute(
      "insert into exam (question, Answer_A,Answer_B,Answer_C,Answer_D,right_Answer) values ('在中国历史上是谁发明了麻药', '孙思邈', '华佗', '张仲景', '扁鹊', 'B')")
     
    
- 
    
     
    
    
     
      cursor.execute(
      "insert into exam (question, Answer_A,Answer_B,Answer_C,Answer_D,right_Answer) values ('京剧中花旦是指', '年轻男子', '年轻女子', '年长男子', '年长女子', 'B')")
     
    
- 
    
     
    
    
     
      cursor.execute(
      "insert into exam (question, Answer_A,Answer_B,Answer_C,Answer_D,right_Answer) values ('篮球比赛每队几人?', '4', '5', '6', '7', 'B')")
     
    
- 
    
     
    
    
     
      cursor.execute(
      "insert into exam (question, Answer_A,Answer_B,Answer_C,Answer_D,right_Answer) values ('在天愿作比翼鸟,在地愿为连理枝。讲述的是谁的爱情故事?', '焦钟卿和刘兰芝', '梁山伯与祝英台', '崔莺莺和张生', '杨贵妃和唐明皇', 'D')")
     
    
- 
    
     
    
    
     
      # 通过rowcount获得插入的行数:
     
    
- 
    
     
    
    
     
      print(cursor.rowcount)  
      #1
     
    
- 
    
     
    
    
     
      # 关闭Cursor:
     
    
- 
    
     
    
    
     
      cursor.close()
     
    
- 
    
     
    
    
     
      # 提交事务:
     
    
- 
    
     
    
    
     
      conn.commit()
     
    
- 
    
     
    
    
     
      # 关闭Connection:
     
    
- 
    
     
    
    
     
      conn.close()
     
    
3、答题设计
从建立好的题库数据库中读取试题信息,callNext()函数实现判断用户选择答案的正误,正确则加10分,错误不加分。并判断用户是否做完,如果没做完则将下一题的题目信息显示到timu标签,而4个选项显示到radio1~ radio4这4个单选按钮上;callResult()函数在GUI上显示此时答题得分,实现代码如下所示:
  
   - 
    
     
    
    
     
      conn = sqlite3.connect(
      'test2.db')
     
    
- 
    
     
    
    
     
      cursor = conn.cursor()
     
    
- 
    
     
    
    
     
      # 执行查询语句:
     
    
- 
    
     
    
    
     
      cursor.execute(
      'select * from exam')
     
    
- 
    
     
    
    
     
      # 获得查询结果集:
     
    
- 
    
     
    
    
     
      values = cursor.fetchall()
     
    
- 
    
     
    
    
     
      print(values)
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      print(
      '记录数:',len(values))
     
    
- 
    
     
    
    
     
      for k 
      in range(len(values)):
     
    
- 
    
     
    
    
     
          print(k,values[k][
      0])
     
    
- 
    
     
    
    
     
      cursor.close()
     
    
- 
    
     
    
    
     
      conn.close()
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      def callNext():
     
    
- 
    
     
    
    
         
      global k
     
    
- 
    
     
    
    
         
      global score
     
    
- 
    
     
    
    
     
          useranswer=r.get()
     
    
- 
    
     
    
    
         
      print (r.get())                     
      #获取被选中单选按钮变量值
     
    
- 
    
     
    
    
         
      if useranswer==values[k][
      5]:
     
    
- 
    
     
    
    
     
              showinfo(
      "恭喜",
      "恭喜你对了!")
     
    
- 
    
     
    
    
     
              score+=
      10
     
    
- 
    
     
    
    
         
      else:
     
    
- 
    
     
    
    
     
              showinfo(
      "遗憾",
      "遗憾你错了!")    
     
    
- 
    
     
    
    
     
          k=k+
      1
     
    
- 
    
     
    
    
         
      if k>=len(values):
     
    
- 
    
     
    
    
     
              showinfo(
      "提示",
      "题目做完了")
     
    
- 
    
     
    
    
             
      return
     
    
- 
    
     
    
    
         
      #显示下一题
     
    
- 
    
     
    
    
     
          timu[
      "text"]=values[k][
      0]
     
    
- 
    
     
    
    
     
          radio1[
      "text"]=values[k][
      1]
     
    
- 
    
     
    
    
     
          radio2[
      "text"]=values[k][
      2]
     
    
- 
    
     
    
    
     
          radio3[
      "text"]=values[k][
      3]
     
    
- 
    
     
    
    
     
          radio4[
      "text"]=values[k][
      4]
     
    
- 
    
     
    
    
     
          r.set(
      'E')
     
    
- 
    
     
    
    
         
     
    
- 
    
     
    
    
     
      def callResult():
     
    
- 
    
     
    
    
     
          showinfo(
      "你的得分",str(score))
     
    
4、GUI设计
最后设计GUI,添加两个Frame组件组件,实现选择答案、确认和查看结果功能,实现代码如下所示:
  
   - 
    
     
    
    
     
      import tkinter
     
    
- 
    
     
    
    
     
      from tkinter 
      import *
     
    
- 
    
     
    
    
     
      from tkinter.messagebox 
      import *
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      root=tkinter.Tk()
     
    
- 
    
     
    
    
     
      root.title(
      'Python智力问答游戏')
     
    
- 
    
     
    
    
     
      root.geometry(
      "500x200")
     
    
- 
    
     
    
    
     
      r=tkinter.StringVar()						
      #创建StringVar对象
     
    
- 
    
     
    
    
     
      r.set(
      'E') 							
      #设置初始值为'E',初始没选中
     
    
- 
    
     
    
    
     
      k=
      0
     
    
- 
    
     
    
    
     
      score=
      0
     
    
- 
    
     
    
    
     
      timu=tkinter.Label(root,text=values[k][
      0])                      
      #题目
     
    
- 
    
     
    
    
     
      timu.pack()
     
    
- 
    
     
    
    
     
      f1 = Frame(root)						
      #创建第1个Frame组件
     
    
- 
    
     
    
    
     
      f1.pack()
     
    
- 
    
     
    
    
     
      radio1=tkinter.Radiobutton(f1,variable=r,value=
      'A',text=values[k][
      1])
     
    
- 
    
     
    
    
     
      radio1.pack()
     
    
- 
    
     
    
    
     
      radio2=tkinter.Radiobutton(f1,variable=r,value=
      'B',text=values[k][
      2])
     
    
- 
    
     
    
    
     
      radio2.pack()
     
    
- 
    
     
    
    
     
      radio3=tkinter.Radiobutton(f1,variable=r,value=
      'C',text=values[k][
      3])
     
    
- 
    
     
    
    
     
      radio3.pack()
     
    
- 
    
     
    
    
     
      radio4=tkinter.Radiobutton(f1,variable=r,value=
      'D',text=values[k][
      4])
     
    
- 
    
     
    
    
     
      radio4.pack()
     
    
- 
    
     
    
    
     
      f2 = Frame(root)						
      #创建第2个Frame组件
     
    
- 
    
     
    
    
     
      f2.pack()
     
    
- 
    
     
    
    
     
      Button(f2,text = 
      '下一题',command=callNext).pack(side = LEFT)
     
    
- 
    
     
    
    
     
      Button(f2,text = 
      '结 果',command=callResult).pack(side = LEFT)
     
    
- 
    
     
    
    
     
      root.mainloop()
     
    
关注微信公众号,回复关键字: 智力问答小游戏,获取源码~
转载:https://blog.csdn.net/m0_38106923/article/details/108873385
查看评论
					