Python实现问题回答小游戏
作者:我的天才女友 发布时间:2023-05-13 13:26:19
标签:Python,问题回答,游戏
读取问题
如下所示,我们在文本中写了一个问题,然后将其读取出来。
“黄河远上白云间,一片孤城万仞山。”的作者是谁?
王之涣
李白
白居易
杜甫
file = open("1.txt", "r")
question_coll = file.readlines()
file.close()
print(file)
运行之后发现报错,查询之后发现编码格式不正确。
设置了读取的编码格式发现可以读取文本的内容
file = open("1.txt", encoding='utf-8')
绘制回答面板
为了方便读取,新建一个类来储存文件中的问题
# 问题类
class Question:
# 回答列表
answer_question = []
# 正确答案
answer_index = 1
"""问题类"""
def __init__(self, question):
self.question = question
导入问题,将文件中的问题保存在qustion中
from question import Question
因为文件的格式是固定的以6为一个问题的所有行数。
将问题
questionList = []
for i in range(int(len(question_coll) / 6)):
que_all = question_coll[i * 6: i * 6 + 6]
que = Question(que_all[0].rstrip())
que.answer_question = [que_all[1].rstrip(), que_all[2].rstrip(), que_all[3].rstrip(), que_all[4].rstrip()]
que.answer_index = int(que_all[5].rstrip())
questionList.append(que)
封装屏幕上显示文字的打印
def draw_text(window_screen, font_size, content, starting_x, starting_y, text_color=WHITE, bg_color=BLACK):
# 绘制文字
# 设置字体
font = pygame.font.SysFont("方正粗黑宋简体", font_size)
text1 = font.render(content, True, text_color, bg_color)
window_screen.blit(text1, (starting_x, starting_y))
显示问题
draw_text(screen, 48, "知识竞赛", 180, 20)
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
tips = "当前一共有" + str(len(questionList)) + "个问题,目前是第" + str(index) + "个。"
draw_text(screen, 18, tips, 20, 140, bg_color=WHITE, text_color=BLACK)
current_que = questionList[index - 1]
question_main = "问题" + str(index) + ". " + current_que.question
draw_text(screen, 16, question_main, 20, 200, bg_color=WHITE, text_color=BLACK)
for i in range(len(current_que.answer_question)):
option = str(i + 1) + ". " + current_que.answer_question[i]
draw_text(screen, 16, option, 40, 260 + i * 40, bg_color=WHITE, text_color=BLACK)
pygame.display.update()
这样就实现了问题的显示
回答问题
首先我们给出提示,为了方便确认问题是否回答,答案正确与否,我们在问题类中添加变量
# 是否回答
answeredFlg = False
# 回答是否正确
rightFlg = False
根据这些变量设置文字。
if current_que.answeredFlg:
if current_que.rightFlg:
print("回答正确,是" + current_que.answer_question[current_que.answer_index])
else:
print("回答错误,正确答案是" + current_que.answer_question[current_que.answer_index])
else:
draw_text(screen, 16, "请按下1、2、3、4来回答答案", 40, 460, bg_color=WHITE, text_color=RED)
如果按下按键,根据答案的正确与否给与响应的提示。
if current_que.answeredFlg:
if current_que.rightFlg:
str1 = "回答正确,是" + current_que.answer_question[current_que.answer_index - 1]
draw_text(screen, 16, str1, 40, 460, bg_color=WHITE, text_color=GREEN)
else:
str1 = "回答错误,正确答案是" + current_que.answer_question[current_que.answer_index - 1]
draw_text(screen, 16, str1, 40, 460, bg_color=WHITE, text_color=RED)
else:
draw_text(screen, 16, "请按下1、2、3、4来回答答案", 40, 460, bg_color=WHITE, text_color=RED)
问题切换
为了方便用户切换问题,在窗口上添加对应的按钮。
import pygame.font
class Button:
def __init__(self, screen, msg, start_x, start_y):
# 设置按钮的尺寸和其他属性
self.screen = screen
self.width, self.height = 200, 50
self.button_color = (0, 255, 0)
self.text_color = (255, 255, 255)
self.font = pygame.font.SysFont("方正粗黑宋简体", 20)
# 创建按钮的rect对象,并使其居中
self.rect = pygame.Rect(0, 0, self.width, self.height)
self.rect.left = start_x
self.rect.right = start_y
# 按钮的标签只需创建一次
self._prep_msg(msg)
def _prep_msg(self, msg):
"""将msg渲染为图像,并让按钮居上"""
self.msg_image = self.font.render(msg, True, self.text_color, self.button_color)
self.msg_image_rect = self.msg_image.get_rect()
self.msg_image_rect.center = self.rect.center
def draw_button(self):
# 绘制一个用颜色填充的按钮,在绘制文本
self.screen.fill(self.button_color, self.rect)
self.screen.blit(self.msg_image, self.msg_image_rect)
answer_question.py
btn1 = Button(screen, "next", 300, 500)
btn1.draw_button()
修改对应的按钮颜色,并添加上一个按钮。
通过是否回答和是否有下一个或者上一个控制按钮的显示
if current_que.answeredFlg and index < len(questionList):
btn1 = Button(screen, "下一个", 300, 500)
btn1.draw_button()
if index > 1:
btn2 = Button(screen, "上一个", 50, 500)
btn2.draw_button()
给按钮添加事件
if event.type == pygame.MOUSEBUTTONDOWN:
mouse_pos = pygame.mouse.get_pos()
if btn1.rect.collidepoint(mouse_pos):
if current_que.answeredFlg and index < len(questionList):
index += 1
if btn2.rect.collidepoint(mouse_pos) and index > 1:
index -= 1
完整代码
answer_question.py 主程序
import pygame, sys
from pygame.locals import *
from question import Question
from button import Button
# 读取问题
file = open("1.txt", encoding='utf-8')
question_coll = file.readlines()
file.close()
questionList = []
for i in range(int(len(question_coll) / 6)):
que_all = question_coll[i * 6: i * 6 + 6]
que = Question(que_all[0].rstrip())
que.answer_question = [que_all[1].rstrip(), que_all[2].rstrip(), que_all[3].rstrip(), que_all[4].rstrip()]
que.answer_index = int(que_all[5].rstrip())
questionList.append(que)
# 颜色变量
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
# 初始化面板
pygame.init()
screen = pygame.display.set_mode((600, 600))
pygame.display.set_caption("知识竞赛")
# 当前问题
index = 1
def draw_text(window_screen, font_size, content, starting_x, starting_y, text_color=WHITE, bg_color=BLACK):
# 绘制文字
# 设置字体
font = pygame.font.SysFont("方正粗黑宋简体", font_size)
text1 = font.render(content, True, text_color, bg_color)
window_screen.blit(text1, (starting_x, starting_y))
# 按钮
btn1 = Button(screen, "下一个", 300, 500)
btn2 = Button(screen, "上一个", 50, 500)
while True:
answer_index = 0
# 填充白色
screen.fill(WHITE)
draw_text(screen, 48, "知识竞赛", 180, 20)
tips = "当前一共有" + str(len(questionList)) + "个问题,目前是第" + str(index) + "个。"
draw_text(screen, 18, tips, 20, 140, bg_color=WHITE, text_color=BLACK)
current_que = questionList[index - 1]
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
if event.type == KEYDOWN:
if event.key == K_1:
answer_index = 1
if event.key == K_2:
answer_index = 2
if event.key == K_3:
answer_index = 3
if event.key == K_4:
answer_index = 4
if event.type == pygame.MOUSEBUTTONDOWN:
mouse_pos = pygame.mouse.get_pos()
if btn1.rect.collidepoint(mouse_pos):
if current_que.answeredFlg and index < len(questionList):
index += 1
if btn2.rect.collidepoint(mouse_pos) and index > 1:
index -= 1
question_main = "问题" + str(index) + ". " + current_que.question
draw_text(screen, 16, question_main, 20, 200, bg_color=WHITE, text_color=BLACK)
for i in range(len(current_que.answer_question)):
option = str(i + 1) + ". " + current_que.answer_question[i]
draw_text(screen, 16, option, 40, 260 + i * 40, bg_color=WHITE, text_color=BLACK)
if answer_index != 0:
current_que.answeredFlg = True
current_que.rightFlg = answer_index == current_que.answer_index
if current_que.answeredFlg:
if current_que.rightFlg:
str1 = "回答正确,是" + current_que.answer_question[current_que.answer_index - 1]
draw_text(screen, 16, str1, 40, 460, bg_color=WHITE, text_color=GREEN)
else:
str1 = "回答错误,正确答案是" + current_que.answer_question[current_que.answer_index - 1]
draw_text(screen, 16, str1, 40, 460, bg_color=WHITE, text_color=RED)
else:
draw_text(screen, 16, "请按下1、2、3、4来回答答案", 40, 460, bg_color=WHITE, text_color=RED)
if current_que.answeredFlg and index < len(questionList):
btn1.draw_button()
if index > 1:
btn2.draw_button()
pygame.display.update()
问题类 qustion.py
# 问题类
class Question:
"""问题类"""
# 回答列表
answer_question = []
# 正确答案
answer_index = 1
# 是否回答
answeredFlg = False
# 回答是否正确
rightFlg = False
def __init__(self, question):
self.question = question
按钮类 button.py
import pygame.font
class Button:
def __init__(self, screen, msg, start_x, start_y):
# 设置按钮的尺寸和其他属性
self.screen = screen
self.width, self.height = 200, 50
self.button_color = (255, 192, 128)
self.text_color = (255, 255, 255)
self.font = pygame.font.SysFont("方正粗黑宋简体", 20)
# 创建按钮的rect对象,并使其居中
self.rect = pygame.Rect(0, 0, self.width, self.height)
self.rect.left = start_x
self.rect.top = start_y
# 按钮的标签只需创建一次
self._prep_msg(msg)
def _prep_msg(self, msg):
"""将msg渲染为图像,并让按钮居上"""
self.msg_image = self.font.render(msg, True, self.text_color, self.button_color)
self.msg_image_rect = self.msg_image.get_rect()
self.msg_image_rect.center = self.rect.center
def draw_button(self):
# 绘制一个用颜色填充的按钮,在绘制文本
self.screen.fill(self.button_color, self.rect)
self.screen.blit(self.msg_image, self.msg_image_rect)
问题文本文件 1.txt
“黄河远上白云间,一片孤城万仞山。”的作者是谁?
王之涣
李白
白居易
杜甫
1
“落霞与孤鹜齐飞”的下一句是?
携酒对情人
秋水共长天一色
抱琴开野室
林塘花月下
2
来源:https://blog.csdn.net/qq_40801987/article/details/121806456
0
投稿
猜你喜欢
- <SCRIPT language=JavaScript> <!-- var layerTo
- 今天遇到了这样一个问题,使用matplotlib绘制热图数组中横纵坐标自然是图片的像素排列顺序,但是这样带来的问题就是画出来的x,y轴中坐标
- 在前面我们介绍了多种请求库,如 Requests、Urllib、Selenium 等。我们接下来首先贴近实战,了解一下代理怎么使用,为后面了
- 看了网站LOGO设计规范的思考的第一部分关于logo设计基础,现在接着来谈谈网络LOGO的设计。四、网络LOGO的设计 古代皇家的纹章,有条
- 本文实例讲述了使用Python生成XML的方法。分享给大家供大家参考,具体如下:1. bookstore.py#encoding:utf-8
- 准备1.电脑系统:win102.手机:安卓(没钱买苹果)3.需要的工具可以从官网下载https://appium.io/https://ww
- 概述具体的案例描述在此就不多赘述. 同一数据集我们在机器学习里的随机森林模型中已经讨论过.导包import numpy as npimpor
- 【名称】Abs【类别】数学函数【原形】Abs(number)【参数】必选的。Number参数是一个任何有效的数值型表达式【返回值】同numb
- 在JavaScript中有三种声明变量的方式:var、let、const。下文给大家介绍js中三种定义变量的方式const, var, le
- 首先给大家分享一篇js中int和string数据类型互相转化实例https://www.aspxhome.com/article/15474
- 一、MySQL的下载 1.登陆MySQL的官网下载适用于64位系统的ZIP压缩包(https://dev.mysql.com/do
- 本文实例分析了AngularJS框架的ng-app指令与自动加载实现方法。分享给大家供大家参考,具体如下:ng-app是angular的一个
- Python 正则表达式正则表达式本身是独立于编程语言的知识,但是它又依附于编程语言,基本上我们所使用的编程语言都提供了对它的实现,当然了,
- 本文实例讲述了Python模块结构与布局操作方法。分享给大家供大家参考,具体如下:#coding=utf8#起始行#!/usr/bin/en
- Numpy中的N维数组(ndarray)Numpy 中的数组是一个元素表(通常是数字),所有元素类型相同,由正整数元组索引。在 Numpy
- 1、空(None)表示该值是一个空对象,空值是Python里一个特殊的值,用None表示。None不能理解为0,因为0是有意义的,而None
- 首先明确为什么要使用分页查询,因为数据庞大,查询不可能全部显示在页面上,如果全部显示在页面上,也会造成查询速度慢的情况,所以分页查询解决了①
- 在类中每次实例化一个对象都会生产一个字典来保存一个对象的所有的实例属性,这样非常的有用处,可以使我们任意的去设置新的属性。每次实例化一个对象
- 使用sql语句创建和删除约束 约束类型 主键约束(Primary Key constraint) --:要求主键列数据唯一,并且不允许为空。
- 相信很多朋友在用Python写完代码之后都迫不及待的想发给对象交流(装X),但是发源码又要求对方有对应的解释器,一般是行不通的,所以我们要把