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

  • 今回改良した点
    • 問題総数を40とする。
    • 40問終わると、メッセージが表示される。
    • 再度スタートするには、Rキー、Nキーの順に押す。
    • 正解した場合スイッチがもらえ、何個もらったかをメッセージとして表示する。

ここまでのソース。

# proto06.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','AS11.jpg','AS12.jpg',
     'AS13.jpg','AS14.jpg','AS15.jpg','AS16.jpg',
     'AS17.jpg','AS18.jpg','AS19.jpg','AS20.jpg',
     'AS21.jpg','AS22.jpg','AS23.jpg','AS24.jpg',
     'AS25.jpg','AS26.jpg','AS27.jpg','AS28.jpg',
     'AS30.jpg','AS31.jpg','AS33.jpg','AS34.jpg'
                                                 ]
import random
import pygame
from pygame.locals import *
from sys import exit

TOTAL=40

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, 280), 0, 32)
background = pygame.image.load(background_image_filename).convert()

astros = list()
get_sw = list()
for n in range(len(switch_image_filename)):
    a = random.sample(switch_image_filename, 1)
    astros.append(pygame.image.load(a[0]).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
tcnt = 0

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
                    if ccnt == 0:
                        mssg = "Right! You've got a switch."
                    else:
                        mssg = "Right! You've got %s switches." % str(ccnt+1)
                    get_sw[ccnt] = True
                    text = ""
                    time1 = pygame.time.get_ticks()
                else:
                    n = text.find("=")
                    text = text[0:n+2]
            elif event.key == K_n:
                tcnt += 1
                if tcnt <= TOTAL:
                    q = Question()
                    text = '(Q%s) ' % str(tcnt) + q.qst
                    ans = q.ans
                else:
                    text = "Completed. Press 'R' and 'N' to restart."
            elif event.key == K_r:
                tcnt = 0
         
    screen.fill((255,255,255))
    screen.blit(background, (0,0))
    for i in range(len(switch_image_filename)):
        if get_sw[i]:
            if i <=19:
                screen.blit(astros[i], (30*i, 170))
            else:
                screen.blit(astros[i], (30*(i-20), 220))
    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 = ""
        tcnt += 1
        if tcnt <= TOTAL:
            q = Question()
            text = '(Q%s) ' % str(tcnt) + q.qst
            ans = q.ans
            aflag = False
        else:
            text = "Completed. Press 'R' and 'N' to restart."
    
    pygame.display.update()    
  • 今後行うこと
    • スイッチの画像の幅がまちまちなので、表示位置をサイズの応じて変えないといけない。今は一定間隔で並べているだけなので、隣り合うスイッチ同士が重なったりしてしまう。これを修正する。
    • 問題のレベルを選択できるようにする。