絵合わせゲームを作る
1年半ぐらい前に「絵合わせ(神経衰弱)」のプログラムを作りかけてやめたものを、たまたま見つけた。
http://d.hatena.ne.jp/Megumi221/20081113
pygameはこのときから使っていないので、もうすっかり忘れてしまった。そこで、ざっとPygameでゲームを作ろう(の前半部分)で勉強してみた。その後、1時間ほどかけてコードを書いてみた。設計ができるほどpygameを理解していないので、動かしながら修正していく。きれいなコードではないが最小限の動作は確認できた。
でも、clockの使い方とか、ちょっと微妙。同じ絵を違う場所に表示する方法とか、もっと良い書き方があるかも。
今後の改良点。
- ゲームの経過時間を表示する。
- すべてのペアが合ったときに何らかのメッセージを表示する。
□起動画面□
すべての絵が裏返っている状態。マウスでクリックして、絵を表示させる。
□実行途中□
表示された絵が合うと、その2枚の絵は開いたままになる。2枚の絵が異なるとそれらはまた裏返る。この図は、黒と赤のペアが合った状態。緑と紫の絵が出たが、色が違うので裏返る直前の状態。
以下、ソースコード。
# import pygame import sys import random from pygame.locals import * WDTH = 100 TNUM = 4 SCR_W = WDTH * TNUM SCR_H = WDTH * TNUM pygame.init() screen = pygame.display.set_mode( (SCR_W, SCR_H) ) image_base = [] image = [] imagerect = [1,1,1,1,1,1,1,1] imagerect_base = [1,1,1,1,1,1,1,1] for i in xrange(TNUM*TNUM/2): image_base.append(pygame.image.load('white.bmp')) image.append(pygame.image.load('red.bmp')) image.append(pygame.image.load('blue.bmp')) image.append(pygame.image.load('green.bmp')) image.append(pygame.image.load('pink.bmp')) image.append(pygame.image.load('violet.bmp')) image.append(pygame.image.load('yellow.bmp')) image.append(pygame.image.load('orange.bmp')) image.append(pygame.image.load('black.bmp')) for i in xrange(TNUM*TNUM/2): image[i] = image[i].convert() imagerect[i] = image[i].get_rect() image_base[i] = image_base[i].convert() imagerect_base[i] = image_base[i].get_rect() alist = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] random.shuffle(alist) def main(): screen.fill((255,255,255)) pygame.display.set_caption('Picture matching') pygame.mouse.set_visible(True) clock = pygame.time.Clock() for i in xrange(TNUM): for j in xrange(TNUM): num = TNUM*i+j screen.blit(image_base[alist[num]/2], imagerect_base[alist[num]/2].move(WDTH*i,WDTH*j)) pygame.display.flip() count = 0 while 1: for event in pygame.event.get(): if event.type == QUIT: return if (event.type == KEYDOWN and event.key == K_ESCAPE): return if event.type == MOUSEBUTTONDOWN: count += 1 (x,y) = pygame.mouse.get_pos() i = x/WDTH j = y/WDTH num = TNUM*i+j screen.blit(image[alist[num]/2], imagerect[alist[num]/2].move(WDTH*i,WDTH*j)) pygame.display.flip() clock.tick(0.8) if not count%2: if alist[num]/2 == alist[num_old]/2: print "OK" else: screen.blit(image_base[alist[num]/2], imagerect_base[alist[num]/2].move(WDTH*i,WDTH*j)) screen.blit(image_base[alist[num]/2], imagerect_base[alist[num]/2].move(WDTH*i_old,WDTH*j_old)) pygame.display.flip() else: i_old = i j_old = j num_old = num if __name__ == '__main__': main()