オセロを作る(1)

Pygameの練習のために、オセロゲームを作ることにする。バージョン1の仕様は次のように決めた。

  • 人間対人間の対戦用とする。人間対コンピュータは次のバージョンとする。
  • 4×4の枡目をもつ盤を用意する。拡張することはたぶん容易。
  • コマを置きなおすことはできない。待ったなし。
  • 枡目が埋まったら、どちらが勝ったかを表示する。

Pygame入門を参考にして、画像の表示方法を学習した。とりあえず、マウスでクリックした場所にコマを置くことはできるところまで来た。
実行画面↓

IDLEから実行すると100%固まる。ファイルをダブルクリックして直接実行しなければならない。
ここまでのソースは次の通り。50×50のサイズで画像を作成した。

# Mini Othello ver.0.1   (MiniOthello.pyw)
#                           2008/10/30  
import pygame
from pygame.locals import *

WDTH = 50      # タイルの幅
TNUM = 4       # タイルの数
SCR_W = WDTH*TNUM   # 画面の大きさ
SCR_H = WDTH*TNUM

WPOS = WDTH*(TNUM-1)

def main():
    pygame.init()
    screen = pygame.display.set_mode( (SCR_W, SCR_H) )
    screen.fill((0,0,0))     # 黒で塗りつぶし
    pygame.display.set_caption('Mini Othello')

    image1 = pygame.image.load('tile.bmp') #タイルの画像
    image2 = pygame.image.load('black.bmp') #黒のコマ
    image3 = pygame.image.load('white.bmp') #白のコマ
    image1 = image1.convert()
    image2 = image2.convert()
    image3 = image3.convert()
    ckey2 = image2.get_at((0,0)) # カラーキーの取得
    ckey3 = image3.get_at((0,0))
    image2.set_colorkey(ckey2)
    image3.set_colorkey(ckey3)
    imagerect1 = image1.get_rect()
    imagerect2 = image2.get_rect()
    imagerect3 = image3.get_rect()

    pygame.mouse.set_visible(True) #マウスポインターの表示をオン
    whoturn = 0          # 誰の番かを示すフラグ
 
  # タイルで画面を埋める
    for i in xrange(0, WPOS+1, WDTH):
        for j in xrange(0, WPOS+1, WDTH):
            screen.blit(image1, imagerect1.move(i,j))
    pygame.display.flip()

    while 1:
        for event in pygame.event.get():
#            if event in pygame.event.get():
#                return
            if (event.type == KEYDOWN and
                event.key == K_ESCAPE):
                return             # ESCAPEキーが押されたら終了
            if event.type == MOUSEBUTTONDOWN:
                whoturn += 1
                xpos = int(pygame.mouse.get_pos()[0]/WDTH)
                ypos = int(pygame.mouse.get_pos()[1]/WDTH)
                if whoturn%2 == 0:  #先手は黒コマを置く
                    screen.blit(image2, imagerect2.move(WDTH*xpos,WDTH*ypos))
                else:        #後手は白コマを置く
                    screen.blit(image3, imagerect3.move(WDTH*xpos,WDTH*ypos))
                pygame.display.flip()

if __name__ == '__main__': main()

今後の予定としては、

  • 挟まれたコマの色を変える処理
  • 勝敗の判定

を週末に実装したい。