お子様向け計算ドリルアプリ(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|テレビ朝日の画像を(個人的に)使っている。なので、詳細はここでは載せられない。
- 今後検討するべき改良点
- 解答に時間制限をつけるか。
- 問題数の上限を決める。
- 誤答は何回まで許されるか。
- 獲得するスイッチの順番をランダムにする。
- 問題をパスする機能を付けるか。