文系忘備録

どこにでもいる文系大学生の忘備録です

MENU

【Python入門】マルバツゲームを作ってみよう!(サンプルコード有)

こんにちはdntfです。

今回は人気プログラミング言語の「Python」でマルバツゲームを作ってみたので軽く紹介していきます。

といっても僕もまだ勉強中ですので軽い気持ちで見てください。

 

 

設計

まず簡単な設計を作っていきます。

今回は簡単なフローチャートで作ってみました。↓

f:id:dntf:20220115124841p:plain

ここからはプログラムで関数に置き換えて書いていきます。

プログラミング

今回は主にIntEnumを使っていきます(Python 3.6以上が必要です)

全てのコードを説明すると長くなるしグダるので機能別に解説していきます。

 

コンストラク

class TicTacToe:
    def __init__(self,size:int):
        #盤面の大きさ
        self.size = size
        #盤面のリスト
        self.list = [[0]*size for i in range(size)]
        #使うキー
        self.keys = [
            "up",
            "down",
            "left",
            "right",
            "space",
        ]
        #選択中のマス
        self.selecting = (0,0)
        self.setHotkey()

まずself.list = [[0]*size for i in range(size)]で今回盤面として使う二次元配列を定義しています。

(※[[Piece.NONE]*size for i in range(size)]の方が良かったかもしれません。。)

盤面描画

def drawboard(self) 
   os.system('cls')
   board = ""
#横の行
   for i in range(self.size):
#縦の行
       for j in range(self.size):
           if self.list[i][j] == Piece.CIRCLE:
               board+="O"
elif self.list[i][j] == Piece.CROSS:
board+="X"
elif self.list[i][j] == Piece.CHOICE:
board+="@"
else:
               board+="#"
  board+="\n"
print(board)
   print(self.selecting)

さっきのself.listを元に盤面を描画する関数です。

 

最初の

 os.system('cls')

でcmd上でclsコマンドを実行しています。

これをすることでcmdを真っ白に戻すことが出来ます。

そこからは一行ずつ文字を配列していくって感じです。

勝敗判定

    def checkBoard(self):
        for i in range(self.size):
            for j in range(self.size):
                flag = [
                    i > 0 and i < self.size-1,
                    j < self.size-1 and j > 0,
                ]
                if self.list[i][j] == Piece.CIRCLE or self.list[i][j] == Piece.CROSS:
                #真ん中のマスのみ取得
                    if flag[0] and flag[1]:
                        #ななめ判定1
                        if self.list[i+1][j+1] == self.list[i][j] and  self.list[i-1][j-1] == self.list[i][j]:
                            self.setResult(self.list[i][j])
                        #ななめ判定2
                        elif self.list[i+1][j-1] == self.list[i][j] and  self.list[i-1][j+1] == self.list[i][j]:
                            self.setResult(self.list[i][j])
                    elif flag[0]:
                        #縦判定
                        if self.list[i+1][j] == self.list[i][j] and  self.list[i-1][j] == self.list[i][j]:
                            self.setResult(self.list[i][j])
                    elif flag[1]:
                        #横判定
                        if self.list[i][j+1] == self.list[i][j] and  self.list[i][j-1] == self.list[i][j]:
                            self.setResult(self.list[i][j])

色々コードが崩れていますが、端的に書くと

はしっこではないマスのみを取得して両端が同じマル・バツで埋まっているかを判定してます。

キーボード受付

※説明が長くなりそうだったので別の記事にしました。参考にしてみてください↓

 

dntf.hatenablog.com

サンプルコード全文