お子様向け計算ドリルアプリ(3)

pygameで子供用のゲーム風お勉強道具を作成している。
そもそも、こういうものを何で実装できるかと考えたときに、画像をメインで扱うのならpygameを使うのが簡単でいいかな、と思ったのでpygameでやっている。一方、ボタンやテキスト入力欄なんかを持つ画面のアプリを構築する場合はpygameでは無理そう(そんなウィジェットはなさそう)なので、wxとか使うことになるのだろうが。
また、pygameだからといってゲームを作ることだけに使うのではなく、pygameがどこまでできるか、どんな機能があるかを確認するために今回やっている。

今回は、解答が正しい場合に獲得したスイッチを表示するようにしてみた。

  • 今回の動作仕様
    • スイッチ(景品)の数は10個しかない。
    • 一問正解すると、一つもらえる。
    • もらったスイッチは決められた位置に表示される。

ソースコードは以下の通り。

#proto03.py
background_image_filename = 'forze.jpg'
switch_image_filename = ['AS01.jpg',
                         'AS02.jpg',
                         'AS03.jpg',
                         'AS04.jpg',
                         'AS05.jpg',
                         'AS06.jpg',
                         'AS07.jpg',
                         'AS08.jpg',
                         'AS09.jpg',
                         'AS10.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()

astros = list()
get_sw = list()
for n in range(len(switch_image_filename)):
    astros.append(pygame.image.load(switch_image_filename[n]).convert())
    get_sw.append(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
ccnt = -1

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:
                    ccnt += 1
                    aflag = True
                    mssg = "Right! You've got a switch."
                    get_sw[ccnt] = 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))
    for i in range(len(switch_image_filename)):
        if get_sw[i]:
            screen.blit(astros[i], (30*i, 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()    

ぎこちなく動く。

Webからキャプチャしたtv asahi|テレビ朝日の画像を(個人的に)使っている。なので、詳細はここでは載せられない。

  • 今後検討するべき改良点
    • 解答に時間制限をつけるか。
    • 問題数の上限を決める。
    • 誤答は何回まで許されるか。
    • 獲得するスイッチの順番をランダムにする。
    • 問題をパスする機能を付けるか。