お子様向け暗算ドリルアプリ(2)

コドモが足し算の勉強を喜んでやりたくなるようなゲームを作成している。

  • 前回までのプロトタイプに実装したこと
    • Nキーを押してゲームスタート
    • 2項の足し算の問題を乱数で作成して表示する
    • 入力された答えが正しいかどうか判定する

今回は、正しい答えを入力した場合の"イベント"の処理を実装する。

  • 答えが正しい場合にやりたいこと
    • 「正解だよ」というメッセージを表示する。
    • 次の問題の表示まで、しばらく間をおく。
    • 正解のご褒美としてスイッチがもらえる。もらったスイッチは画面上に並べて表示される。

イベントループの中で処理を止めずに、メッセージを数秒だけ表示したり、次の問題表示まで間を空ける方法を少し悩んだ。sleepとかwaitだと処理が止まるだけで目的を達成できない。結局、.pygame.time.get_ticks()で時間を測って適当な時間後に表示を切り替えることにする。

ここまでのソースは以下の通り。

#proto02.py
background_image_filename = 'forze.jpg'
switch_image_filename = 'AS01.jpg'

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

class Question:
    def __init__(self):
        a = random.sample(xrange(100), 2)
        self.ans = a[0] + a[1]
        self.qst = str(a[0]) + ' + ' + str(a[1]) + ' = ' 

    def make(self):
        pass

pygame.init()
time1 = pygame.time.get_ticks()

screen = pygame.display.set_mode((700, 170), 0, 32)
background = pygame.image.load(background_image_filename).convert()
as01 = pygame.image.load(switch_image_filename).convert()
as02 = pygame.image.load(switch_image_filename).convert()
get_sw = [False]

try:
    font = pygame.font.SysFont("arial", 48)
except MemoryError:
    font = pygame.font.Font(pygame.font.get_default_font(), 48)

text = "Press 'N' to start new game."
mssg = ""
aflag = False

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
        elif event.type == KEYDOWN:
            if event.key == K_1:
                text += '1'
            elif event.key == K_2:
                text += '2'
            elif event.key == K_3:
                text += '3'
            elif event.key == K_4:
                text += '4'
            elif event.key == K_5:
                text += '5'
            elif event.key == K_6:
                text += '6'
            elif event.key == K_7:
                text += '7'
            elif event.key == K_8:
                text += '8'
            elif event.key == K_9:
                text += '9'
            elif event.key == K_0:
                text += '0'
            elif event.key == K_BACKSPACE:
                text = text[:-1]
            elif event.key == K_RETURN:
                inp = int(text.split("=")[1])
                if inp == ans: #答えが正しい場合の処理
                    aflag = True
                    mssg = "Right! You've got a switch."
                    get_sw[0] = True
                    text = ""
                    time1 = pygame.time.get_ticks()
                else:
                    n = text.find("=")
                    text = text[0:n+2]
            elif event.key == K_n:
                q = Question()
                text = q.qst
                ans = q.ans
    
    screen.blit(background, (0,0))
    if get_sw[0]:
        screen.blit(as01, (0,110)) #獲得したスイッチの表示
    screen.blit(font.render(text, True, (0,0,0)), (0, 5))
    screen.blit(font.render(mssg, True, (0,0,0)), (0, 55))

    time2 = pygame.time.get_ticks()
    dtime = time2 - time1
    if aflag and dtime >= 5000:
        mssg = ""
        q = Question() #新しい問題
        text = q.qst
        ans = q.ans
        aflag = False
    
    pygame.display.update()