【python游戏开发入门】《PYTHON游戏编程入门》第三章挑战题

书籍:《PYTHON游戏编程入门》(More Python Programming for the Absolute Beginner)
本文暂为基于第三章中trivia_game的一个小改进,欢迎交流~

介绍

这个游戏看起来很简单(写起来也不难),类似于智力问答的那种,页面会显示一道题,按下键盘下的1-4来选择你认为正确的选项,每回答正确一次,都会获得一分。
界面如下:
在这里插入图片描述

v1.0

功能

开始游戏后即开始第一道题,从题库里面按顺序出题。
当通过按键1-4给出当前题目答案时,若正确,则提示回答正确,所选项变成绿色,分数加一,并引导按下空格或回车进行下一题;若错误,则提示回答错误,所选项变成红色,正确选项不显示(改),分数不变,并引导按下空格或者回车进入结算页面。
游戏结束后将进入结算页面,如果所有题都回答正确,则显示“恭喜通关”;若中途回答错误导致进入结算页面,则显示“Game Over”。
题库需要以6行一组的方式给出,第一行为题目,后面四行分别为1-4四个选项,第六行为答案对应的序号(只有一位数字)

程序逻辑

先初始化一个对象,初始化时导入资源文件,外部建立大循环保证游戏运行,循环内部通过读取键盘事件来获取用户的输入。当用户有输入时,检测并响应用户的输入,如果输入答案则使用HandleInput函数处理他们的选项,如果输入的是空格或者回车,则使用NextQuestion函数进入下一题。这里注意,这两个函数都具有检测机制,只有当按照正常流程进入此函数(未作出选项时处理输入的答案,当前题已经有了结果并且回答正确时才可以进入下一题)。使用over标志表示是否结束游戏,如果游戏结束,则显示函数DisplayScreen仅显示结算页面(分为胜利结算和失败结算),否则显示函数DisplayScreen正常显示题目等运行相关提示。
(感觉写了一堆还不如直接看代码来的痛快)

代码

import pygame, sys
from pygame.locals import *
import random

class TriviaGame(object):
    def __init__(self, filename):
        # init some attributes
        self.score = 0
        self.scored = False
        self.failed = False
        self.wrong_ans = 0
        self.answer = 0
        self.current = 0
        self.total = 0
        self.data = []
        self.colour = [white, white, white, white]
        self.over = False

        # load data:
        f = open(filename, 'r',encoding = 'utf-8')
        import_data = f.readlines()
        f.close()
        for data in import_data:
            self.data.append(data.strip())
            self.total += 1

    def DisplayScreen(self):
        # Game Over
        if self.over:
            if self.current >= self.total:
                PrintText(font1, 200, 120, "恭喜通关!", red)
                
            else:
                PrintText(font1, 200, 120, "Game Over", red)
            PrintText(font2, 350, 400, "按下Esc退出游戏",blue)
            PrintText(font2, 240, 200, "总分:" + str(self.score), white)
            PrintText(font1, 210, 5, "知识问答", white)    
            
        else:
            # show instructions
            PrintText(font1, 210, 5, "知识问答")
            PrintText(font2, 460, 25, "分数:" + str(self.score), blue)
            self.answer = int(self.data[self.current+5])
            # show questions
            question_num = self.current
            PrintText(font1, 5, 80, "QUESTION  "+str(question_num // 6 + 1), white)
            PrintText(font3, 20, 120, self.data[question_num], yellow)
            
            # show reply
            if self.scored:
                self.colour = [white, white, white, white]
                self.colour[self.answer - 1] = green
                PrintText(font1, 230, 380, "正确!", green)
                PrintText(font2, 180, 480, "按下回车或空格进入下一个问题", green)
            elif self.failed:
                self.colour = [white, white, white, white]
                #self.colour[self.answer - 1] = green
                self.colour[self.wrong_ans - 1] = red
                PrintText(font1, 220, 380, "错误!", red)
                PrintText(font2, 190, 480, "按下回车或空格进入结算页面", red)
            else:
                PrintText(font2, 180, 500 - 20, "按下数字键 1-4 选择答案", blue)

            # show answers
            PrintText(font1, 5, 170, "ANSWERS")
            PrintText(font2, 20, 210, "1 - " + self.data[self.current + 1], self.colour[0])
            PrintText(font2, 20, 240, "2 - " + self.data[self.current + 2], self.colour[1])
            PrintText(font2, 20, 270, "3 - " + self.data[self.current + 3], self.colour[2])
            PrintText(font2, 20, 300, "4 - " + self.data[self.current + 4], self.colour[3])

    def HandleInput(self, number):
        if not self.scored and not self.failed:
            if number == self.answer:
                self.scored = True
                self.score += 1
            else:
                self.failed = True
                self.wrong_ans = number

    def NextQuestion(self):
        if self.failed:
            self.over = True
        elif self.scored:
            self.current += 6
            if self.current >= self.total:
                self.over = True
            self.scored = False
            self.failed = False
            self.colour = [white, white, white, white]
                       
        
def PrintText(font, x, y, text, color = (255,255,255), shadow = True):
    if shadow:
        imgText = font.render(text, True, (0,0,0))
        screen.blit(imgText, (x-2,y-2))
    imgText = font.render(text, True, color)
    screen.blit(imgText, (x,y))

# main
# settings
pygame.init()
screen = pygame.display.set_mode((600,500))
pygame.display.set_caption("知识问答")
font1 = pygame.font.Font('Fonts\STXINWEI.TTF', 35)
font2 = pygame.font.Font('Fonts\STXINWEI.TTF', 20)
font3 = pygame.font.Font('Fonts\STZHONGS.TTF', 20)
white = 255,255,255
cyan = 0,255,255
yellow = 255,255,0
purple = 255,0,255
green = 0,255,0
red = 255,0,0
blue = 150,100,200

# load files
trivia_main = TriviaGame('trivia_data.txt')

# loop
while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            sys.exit()
        elif event.type == KEYUP:
            if event.key == pygame.K_ESCAPE:
                sys.exit()
            elif event.key == pygame.K_1:
                trivia_main.HandleInput(1)
            elif event.key == pygame.K_2:
                trivia_main.HandleInput(2)
            elif event.key == pygame.K_3:
                trivia_main.HandleInput(3)
            elif event.key == pygame.K_4:
                trivia_main.HandleInput(4)
            elif event.key == pygame.K_RETURN or event.key == pygame.K_SPACE:
                trivia_main.NextQuestion()

    # clear the screen
    screen.fill((0,0,0))
    trivia_main.DisplayScreen()
    pygame.display.update()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值