【Python入門】マルバツゲームを作ってみよう!(サンプルコード有)
こんにちはdntfです。
今回は人気プログラミング言語の「Python」でマルバツゲームを作ってみたので軽く紹介していきます。
といっても僕もまだ勉強中ですので軽い気持ちで見てください。
設計
まず簡単な設計を作っていきます。
今回は簡単なフローチャートで作ってみました。↓
ここからはプログラムで関数に置き換えて書いていきます。
プログラミング
今回は主に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])
色々コードが崩れていますが、端的に書くと
はしっこではないマスのみを取得して両端が同じマル・バツで埋まっているかを判定してます。
キーボード受付
※説明が長くなりそうだったので別の記事にしました。参考にしてみてください↓
サンプルコード全文