小言_互联网的博客

Python智力问答小游戏

432人阅读  评论(0)

目录

1、设计思路

2、建立题库

3、答题设计

4、GUI设计


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

1、设计思路

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

2、建立题库

使用SQLite数据库建立题库,本质上就是SQL语句,创建exam表,实现代码如下所示:


  
  1. #导入SQLite驱动
  2. import sqlite3
  3. # 连接到SQLite数据库,数据库文件是test.db
  4. # 如果文件不存在,会自动在当前目录创建:
  5. conn = sqlite3.connect( 'test2.db')
  6. cursor = conn.cursor() # 创建一个Cursor:
  7. #cursor.execute("delete from exam")
  8. # 执行一条SQL语句,创建exam表:
  9. 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)')
  10. # 继续执行一条SQL语句,插入一条记录:
  11. cursor.execute( "insert into exam (question, Answer_A,Answer_B,Answer_C,Answer_D,right_Answer) values ('哈雷慧星的平均周期为', '54年', '56年', '73年', '83年', 'C')")
  12. cursor.execute( "insert into exam (question, Answer_A,Answer_B,Answer_C,Answer_D,right_Answer) values ('夜郎自大中“夜郎”指的是现在哪个地方?', '贵州', '云南', '广西', '福建', 'A')")
  13. cursor.execute( "insert into exam (question, Answer_A,Answer_B,Answer_C,Answer_D,right_Answer) values ('在中国历史上是谁发明了麻药', '孙思邈', '华佗', '张仲景', '扁鹊', 'B')")
  14. cursor.execute( "insert into exam (question, Answer_A,Answer_B,Answer_C,Answer_D,right_Answer) values ('京剧中花旦是指', '年轻男子', '年轻女子', '年长男子', '年长女子', 'B')")
  15. cursor.execute( "insert into exam (question, Answer_A,Answer_B,Answer_C,Answer_D,right_Answer) values ('篮球比赛每队几人?', '4', '5', '6', '7', 'B')")
  16. cursor.execute( "insert into exam (question, Answer_A,Answer_B,Answer_C,Answer_D,right_Answer) values ('在天愿作比翼鸟,在地愿为连理枝。讲述的是谁的爱情故事?', '焦钟卿和刘兰芝', '梁山伯与祝英台', '崔莺莺和张生', '杨贵妃和唐明皇', 'D')")
  17. # 通过rowcount获得插入的行数:
  18. print(cursor.rowcount) #1
  19. # 关闭Cursor:
  20. cursor.close()
  21. # 提交事务:
  22. conn.commit()
  23. # 关闭Connection:
  24. conn.close()

3、答题设计

从建立好的题库数据库中读取试题信息,callNext()函数实现判断用户选择答案的正误,正确则加10分,错误不加分。并判断用户是否做完,如果没做完则将下一题的题目信息显示到timu标签,而4个选项显示到radio1~ radio4这4个单选按钮上;callResult()函数在GUI上显示此时答题得分,实现代码如下所示:


  
  1. conn = sqlite3.connect( 'test2.db')
  2. cursor = conn.cursor()
  3. # 执行查询语句:
  4. cursor.execute( 'select * from exam')
  5. # 获得查询结果集:
  6. values = cursor.fetchall()
  7. print(values)
  8. print( '记录数:',len(values))
  9. for k in range(len(values)):
  10. print(k,values[k][ 0])
  11. cursor.close()
  12. conn.close()
  13. def callNext():
  14. global k
  15. global score
  16. useranswer=r.get()
  17. print (r.get()) #获取被选中单选按钮变量值
  18. if useranswer==values[k][ 5]:
  19. showinfo( "恭喜", "恭喜你对了!")
  20. score+= 10
  21. else:
  22. showinfo( "遗憾", "遗憾你错了!")
  23. k=k+ 1
  24. if k>=len(values):
  25. showinfo( "提示", "题目做完了")
  26. return
  27. #显示下一题
  28. timu[ "text"]=values[k][ 0]
  29. radio1[ "text"]=values[k][ 1]
  30. radio2[ "text"]=values[k][ 2]
  31. radio3[ "text"]=values[k][ 3]
  32. radio4[ "text"]=values[k][ 4]
  33. r.set( 'E')
  34. def callResult():
  35. showinfo( "你的得分",str(score))

4、GUI设计

最后设计GUI,添加两个Frame组件组件,实现选择答案、确认和查看结果功能,实现代码如下所示:


  
  1. import tkinter
  2. from tkinter import *
  3. from tkinter.messagebox import *
  4. root=tkinter.Tk()
  5. root.title( 'Python智力问答游戏')
  6. root.geometry( "500x200")
  7. r=tkinter.StringVar() #创建StringVar对象
  8. r.set( 'E') #设置初始值为'E',初始没选中
  9. k= 0
  10. score= 0
  11. timu=tkinter.Label(root,text=values[k][ 0]) #题目
  12. timu.pack()
  13. f1 = Frame(root) #创建第1个Frame组件
  14. f1.pack()
  15. radio1=tkinter.Radiobutton(f1,variable=r,value= 'A',text=values[k][ 1])
  16. radio1.pack()
  17. radio2=tkinter.Radiobutton(f1,variable=r,value= 'B',text=values[k][ 2])
  18. radio2.pack()
  19. radio3=tkinter.Radiobutton(f1,variable=r,value= 'C',text=values[k][ 3])
  20. radio3.pack()
  21. radio4=tkinter.Radiobutton(f1,variable=r,value= 'D',text=values[k][ 4])
  22. radio4.pack()
  23. f2 = Frame(root) #创建第2个Frame组件
  24. f2.pack()
  25. Button(f2,text = '下一题',command=callNext).pack(side = LEFT)
  26. Button(f2,text = '结 果',command=callResult).pack(side = LEFT)
  27. root.mainloop()

关注微信公众号,回复关键字: 智力问答小游戏,获取源码~


转载:https://blog.csdn.net/m0_38106923/article/details/108873385
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场