お子様向け暗算ドリルアプリ(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()