欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python实现问题回答小游戏

程序员文章站 2022-03-15 22:57:24
目录读取问题绘制回答面板回答问题问题切换完整代码读取问题如下所示,我们在文本中写了一个问题,然后将其读取出来。“黄河远上白云间,一片孤城万仞山。”的作者是谁?王之涣李白白居易杜甫file = open...

读取问题

如下所示,我们在文本中写了一个问题,然后将其读取出来。

“黄河远上白云间,一片孤城万仞山。”的作者是谁?

王之涣

李白

白居易

杜甫

file = open("1.txt", "r")
question_coll = file.readlines()
file.close()
print(file)

运行之后发现报错,查询之后发现编码格式不正确。

Python实现问题回答小游戏

设置了读取的编码格式发现可以读取文本的内容

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()

Python实现问题回答小游戏

这样就实现了问题的显示

回答问题

首先我们给出提示,为了方便确认问题是否回答,答案正确与否,我们在问题类中添加变量

    # 是否回答
    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)

Python实现问题回答小游戏

如果按下按键,根据答案的正确与否给与响应的提示。

 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)

Python实现问题回答小游戏

Python实现问题回答小游戏

问题切换

为了方便用户切换问题,在窗口上添加对应的按钮。

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()

Python实现问题回答小游戏

修改对应的按钮颜色,并添加上一个按钮。

Python实现问题回答小游戏

通过是否回答和是否有下一个或者上一个控制按钮的显示

    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

Python实现问题回答小游戏

完整代码

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 

以上就是python实现问题回答小游戏的详细内容,更多关于python问题回答游戏的资料请关注其它相关文章!