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

“落霞与孤鹜齐飞”的下一句是?

携酒对情人

秋水共长天一色

抱琴开野室

林塘花月下

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

(0)

相关推荐

  • python实现模拟数字的魔术游戏

    游戏介绍 在游戏中,魔术师要每位观众心里想一个三位数abc (a.b.c分别是百位.十位和个位数字),然后魔术师让观众心中记下acb.bac.bca.cab.cba五个数以及这5个数的和值.只要观众说出这个和是多少,则魔术师一定能猜出观众心里想的原数abc是多少.例如,观众甲说他计算的和值是1999,则魔术师立即说出他想的数是443,而观众乙说他计算的和值是1998,则魔术师说:"你算错了!". [输入] 输入一个正整数. [输出] 输出对应的三位数.如果对应的三位数不存在,则输出:&

  • Python Pygame实现兔子猎人守护城堡游戏

    目录 效果图 主要代码 游戏初始化 主函数 运行  效果图 守卫类游戏大家应该玩过吧,什么植物大战僵尸呀,保卫萝卜呀,今天我们自己用python来写一个自己的守护类小游戏兔子猎人守护城堡,让大家看看效果图. 主要代码 下面我来说一下是怎么得到的将代码分享一下给大家 首先得将要用到的库导入进来 import cfg import math import random import pygame from modules.Sprites import * from modules.interface

  • 基于Python Pygame实现的画饼图游戏

    目录 导入包 配置基本参数 根据输入的数字改变扇形的个数 监听事件 这个游戏就是实现键盘上输入不同的数字,将圆分割成不同的几个部分,每部分用不同的颜色来实现. 导入包 导入随机包,pygame,系统包,time时间包用于时间暂停.math是用来确认弧度的. import random import pygame, sys, time import math from pygame.locals import * 配置基本参数 初始化pygame,设置窗口大小标题,设置圆心的x和y轴,圆的半径,线

  • python实现双人版坦克大战游戏

    游戏介绍: 双人版的<坦克大战>的基本规则是玩家消灭出现的敌方坦克保卫我方基地. 中间还会随机出现很多特殊道具吸收可获得相应的功能,消灭玩即可进入下一关. 方向键:上下左右移动即可.另一个方向键则是:WSAD. 环境配置: Python3. Pycharm .Pygame. 第三方库的安装:pip  install pygame 效果展示: 开始界面一一 开始即可上手玩游戏,还有背景音乐辅助!游戏玩儿起来更带感!  游戏界面-- 代码演示: 1)游戏主程序 import pygame impo

  • 利用Python模拟谷歌的小恐龙游戏

    目录 前言 开发工具 环境搭建 先睹为快 代码介绍 前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 谷歌流量器中有个很有名的彩蛋:当你网络出现问题时,就会出现一个"小恐龙游戏". (如果想要直接进行游戏,可以在地址栏输入:chrome://dino) 今天我们就来给大家演示下,用Python来自己做一个仿制的"小恐龙游戏"! 废话不多说,

  • Python实现问题回答小游戏

    目录 读取问题 绘制回答面板 回答问题 问题切换 完整代码 读取问题 如下所示,我们在文本中写了一个问题,然后将其读取出来. "黄河远上白云间,一片孤城万仞山."的作者是谁? 王之涣 李白 白居易 杜甫 file = open("1.txt", "r") question_coll = file.readlines() file.close() print(file) 运行之后发现报错,查询之后发现编码格式不正确. 设置了读取的编码格式发现可以读

  • 用Python设计一个经典小游戏

    本文主要介绍如何用Python设计一个经典小游戏:猜大小. 在这个游戏中,将用到前面我介绍过的所有内容:变量的使用.参数传递.函数设计.条件控制和循环等,做个整体的总结和复习. 游戏规则: 初始本金是1000元,默认赔率是1倍,赢了,获得一倍金额,输了,扣除1倍金额. 玩家选择下注,押大或押小: 输入下注金额: 摇3个骰子,11≤骰子总数≤18为大,3≤骰子总数≤10为小: 如果赢了,获得1倍金额,输了,扣除1倍金额,本金为0时,游戏结束. 程序运行结果是这样的: 现在,我们来梳理下思路. 我们

  • Python实现的弹球小游戏示例

    本文实例讲述了Python实现的弹球小游戏.分享给大家供大家参考,具体如下: 弹球 1. Ball 类 draw负责移动Ball 碰撞检测,反弹,Ball检测Paddle 2.Paddle类 draw负责移动Paddle 碰撞检测,确定能不能继续 监听键盘事件 3.主循环 绘制Ball和Paddle update sleep 代码 from Tkinter import * import random import time class Ball: def __init__(self, canv

  • Python实现Pig Latin小游戏实例代码

    前言: 本文研究的主要是Python实现pig Latin小游戏的简单代码,具体介绍如下. Pig Latin是一个语言游戏. 步骤: 1.让用户输入一个英文单词 2.确保用户输入一个有效单词 3.将单词转换成Pig Latin 4.显示转换结果 一.Input 函数:raw_input()用于输出一个字符串并等待键盘输入某字符串,最后以Enter(或Return)结束输入 original = raw_input("Enter a word:") print original 上述中

  • python编写猜数字小游戏

    本文实例为大家分享了python编写猜数字小游戏的具体代码,供大家参考,具体内容如下 import random secret = random.randint(1, 30) guess = 0 tries = 0 print("我叫丁丁,我有一个秘密数字!") print("数字从1到30,你只有6次机会!") while int(guess) != secret and tries < 6: print("你猜的数字是?") guess

  • python实现吃苹果小游戏

    本文实例为大家分享了python实现吃苹果小游戏的具体代码,供大家参考,具体内容如下 1.公共类模块 import pygame from pygame.rect import Rect def print_text(font, x, y, text, color=(255, 255, 255)): imgText=font.render(text, True, color) screen=pygame.display.get_surface() screen.blit(imgText,(x,

  • python实现移动木板小游戏

    本文实例为大家分享了python实现移动木板小游戏的具体代码,供大家参考,具体内容如下 一.游戏简介 本游戏是通过python编写的小游戏,给初学者熟悉python编程语言抛砖引玉,希望有所帮助. 成型的效果图如下: 二.编写步骤 1.引入库 代码如下: ###### AUTHOR:破茧狂龙 ###### ###### DATE:20201002 ###### ###### DESCRIPTION:移动的木板 ###### import pygame from pygame.locals imp

  • python代码实现猜拳小游戏

    本文实例为大家分享了python代码实现猜拳小游戏的具体代码,供大家参考,具体内容如下 游戏实现具体功能 原有的用户登录的信息均能保存在txt文件里,注册的信息也能保存在txt里面 格式如下: 便于之后转换成列表字典形式添加注册数据 用户的猜拳记录也能保存在txt中并以如下格式显示 格式如下: 具体Python代码: #-*- coding=utf8 -*- # @author:sololi # date: 2020/10/24 # 文件说明 : # 123文件存放 用户信息 456 文件存放猜

  • Python约瑟夫生者死者小游戏实例讲解

    问题描述: 30 个人在一条船上,超载,需要 15 人下船.于是人们排成一队,排队的位置即为他们的编号. 报数,从 1 开始,数到 9 的人下船.如此循环,直到船上仅剩 15 人为止,问都有哪些编号的人下船了呢? 解决思路: 给30个人编号1-30,每个人的初值都是1(在船上),i代表他们的编号,j代表被扔下船的人数(j=15时循环结束),用check记数,check=9时将对应编号i的人置0(扔下船)并让check重新记数. 当i等于31时,手动将i置为1 当对应编号i的人值为0时,代表此人已

  • python实现21点小游戏

    用python实现21点小游戏,供大家参考,具体内容如下 from random import shuffle import random import numpy as np from sys import exit # 初始化扑克牌 playing_cards = { "黑桃A": 1, "黑桃2": 2, "黑桃3": 3, "黑桃4": 4, "黑桃5": 5, "黑桃6": 6

随机推荐