絵合わせゲームを作る

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()