书籍:《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()