pythonで記述するオセロ


VScodeのターミナル上でオセロを実現　環境>>>VScode   python 3.10.2

実行結果：
![vscode_実行結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031701/a97a7623-41dc-0c58-bff2-6e22ae6e8ddc.png)
オセロボード仕様 
0(☐)：何も置かれていないマス
1：黒色が置かれているマス
2：白色が置かれているマス
9(✕)：置いてはいけないマス

　０１２３４５６７８９　列(col)
０ ✕✕✕✕✕✕✕✕✕✕
１✕☐☐☐☐☐☐☐☐✕
２✕☐☐☐☐☐☐☐☐✕
３✕☐☐☐☐☐☐☐☐✕
４✕☐☐☐２１☐☐☐✕
５✕☐☐☐１２☐☐☐✕
６✕☐☐☐☐☐☐☐☐✕
７✕☐☐☐☐☐☐☐☐✕
８✕☐☐☐☐☐☐☐☐✕
９ ✕✕✕✕✕✕✕✕✕✕
行(row)

main関数こんな感じ
```py
#変数、リストの定義
board=[[0 for i in range(10)]for i in range(10)]#オセロボードのリスト[列][行]
rowcol=[0,0]#行列のリスト [行,列]
flag=0#状態記憶変数 0:正常 1:異常
masu=60#残りのマスの変数
bw=1#黒色か白色か記憶する変数 1:黒色　2:白色
result_black=0 #黒色の最終枚数
result_white=0 #白色の最終枚数

#オセロボードの初期化
board[4][4]=2 #初期白色配置
board[5][5]=2 #初期白色配置
board[5][4]=1 #初期黒色配置
board[4][5]=1 #初期黒色配置

#置いてはいけないマスの設定
for i in range(10):
    board[i][0]=9
    board[i][9]=9
    board[0][i]=9
    board[9][i]=9

#ゲームスタート
print('ゲームスタート！！！')
bw=1 #黒色から始めるようにする

while masu>0: #残りのマスが0以上のときループを繰り返す
    display(board)
    flag=0

    #黒色のターン
    if(bw==1):
        print('---黒色のターン---')
        #どこに置くか
        where(rowcol)

        #置けるのか判定する
        flag=judge(bw,rowcol,board)
        if(flag==1):
            print('もう一度入力してください。')
            continue
        else:
            masu-=1 #一枚置いたことを記憶する
            bw=2
            display(board)

    flag=0
    #白色のターン
    if(bw==2):
        print('---白色のターン---')
        #どこに置くか
        where(rowcol)

        #置けるのか判定する
        flag=judge(bw,rowcol,board)
        if(flag==1):
            print('もう一度入力してください。')
            continue
        else:
            masu-=1
            bw=1
            display(board)
    
#スコア表示
#枚数チェック
for i in range(1,9):
    for j in range(1,9):
        if(board[j][i]==1): #黒色の枚数チェック
            result_black+=1
        if(board[j][i]==2): #白色の枚数チェック
            result_white+=1
print(f'黒色：{result_black} 白色：{result_white}')
if(result_white<result_black):
    print('黒色の勝ちです！！！')
if(result_white>result_black):
    print('白色の勝ちです！！！')
if(result_white==result_black):
    print('同点です。')
```
main関数内でのユーザー定義関数の説明

rowcolというリストを用いてどこに置くか記憶する。
rowcol[0]:行番号 rowcol[1]:列番号 

```py
#どこに置くか入力する関数
def where(rowcol):
    rowcol[0]=int(input('何行目>>>'))
    rowcol[1]=int(input('何列目>>>'))
```

駒が置けるか判定する関数

```py
#駒が置けるか判定する関数
def judge(bw,rowcol,board):
    #変数定義
    i=1 #ループカウンタ、走査する際に使用する
    j=1 #ループカウンタ、走査する際に使用する
    cnt=0 #カウンタ変数、何枚ひっくり返すか記憶する変数
    ok=0 #一枚でもひっくり返せたら1にする
    way=0 #どこの向きを走査するか 1:上　2:下 3:右 4:左 5:右上 6:左上 7:左下 8:右下

    if(1>rowcol[0] or 8<rowcol[0] or 1>rowcol[1] or 8<rowcol[1]):
        print('存在しないマスです。')
        return 1


    #置けるかどうかチェック
    #way 1:上　2:下 3:右 4:左 5:右上 6:右下 7:左上 8:左下
    for way in range(1,9):
        cnt=0 #変数の初期化
        if(way==1 or way==2):
            i=0
        if(way==3 or way==5 or way==6):
            i=1
        if(way==4 or way==7 or way==8):
            i=-1
        if(way==3 or way==4):
            j=0
        if(way==2 or way==6 or way==8):
            j=1
        if(way==1 or way==5 or way==7):
            j=-1

        if(bw==1): #黒色(bw==1)の場合
            if(board[rowcol[1]+i][rowcol[0]+j]==2): #特定の方向が白色
                cnt+=1
                if(way==1 or way==5 or way==7):
                    j-=1
                if(way==2 or way==6 or way==8):
                    j+=1
                if(way==3 or way==5 or way==6):
                    i+=1
                if(way==4 or way==7 or way==8):
                    i-=1
                while(board[rowcol[1]+i][rowcol[0]+j]==2): #その方向に白色がいくつあるのか
                    cnt+=1
                    if(way==1 or way==5 or way==7):
                        j-=1
                    if(way==2 or way==6 or way==8):
                        j+=1
                    if(way==3 or way==5 or way==6):
                        i+=1
                    if(way==4 or way==7 or way==8):
                        i-=1
                if(board[rowcol[1]+i][rowcol[0]+j]==bw): #黒までをひっくり返す
                    ok=1
                    while(cnt>0):
                        if(way==1):#上方向ひっくり返す
                            board[rowcol[1]][rowcol[0]-cnt]=bw
                        if(way==2):#下方向ひっくり返す
                            board[rowcol[1]][rowcol[0]+cnt]=bw
                        if(way==3):#右方向ひっくり返す
                            board[rowcol[1]+cnt][rowcol[0]]=bw
                        if(way==4):#左方向ひっくり返す
                            board[rowcol[1]-cnt][rowcol[0]]=bw
                        if(way==5):#右上方向ひっくり返す
                            board[rowcol[1]+cnt][rowcol[0]-cnt]=bw
                        if(way==6):#右下方向ひっくり返す
                            board[rowcol[1]+cnt][rowcol[0]+cnt]=bw
                        if(way==7):#左上方向ひっくり返す
                            board[rowcol[1]-cnt][rowcol[0]-cnt]=bw
                        if(way==8):#左下方向ひっくり返す
                            board[rowcol[1]-cnt][rowcol[0]+cnt]=bw
                        cnt-=1
            #一枚でもひっくり返したら指定された場所に黒色を置く
            if(ok==1):
                board[rowcol[1]][rowcol[0]]=bw

        if(bw==2): #白色(bw==2)の場合
            if(board[rowcol[1]+i][rowcol[0]+j]==1): #特定の方向が黒色
                cnt+=1
                if(way==1 or way==5 or way==7):
                    j-=1
                if(way==2 or way==6 or way==8):
                    j+=1
                if(way==3 or way==5 or way==6):
                    i+=1
                if(way==4 or way==7 or way==8):
                    i-=1
                while(board[rowcol[1]+i][rowcol[0]+j]==1): #その方向に黒色がいくつあるのか
                    cnt+=1
                    if(way==1 or way==5 or way==7):
                        j-=1
                    if(way==2 or way==6 or way==8):
                        j+=1
                    if(way==3 or way==5 or way==6):
                        i+=1
                    if(way==4 or way==7 or way==8):
                        i-=1
                if(board[rowcol[1]+i][rowcol[0]+j]==bw): #黒までをひっくり返す
                    ok=1
                    while(cnt>0):
                        if(way==1):#上方向ひっくり返す
                            board[rowcol[1]][rowcol[0]-cnt]=bw
                        if(way==2):#下方向ひっくり返す
                            board[rowcol[1]][rowcol[0]+cnt]=bw
                        if(way==3):#右方向ひっくり返す
                            board[rowcol[1]+cnt][rowcol[0]]=bw
                        if(way==4):#左方向ひっくり返す
                            board[rowcol[1]-cnt][rowcol[0]]=bw
                        if(way==5):#右上方向ひっくり返す
                            board[rowcol[1]+cnt][rowcol[0]-cnt]=bw
                        if(way==6):#右下方向ひっくり返す
                            board[rowcol[1]+cnt][rowcol[0]+cnt]=bw
                        if(way==7):#左上方向ひっくり返す
                            board[rowcol[1]-cnt][rowcol[0]-cnt]=bw
                        if(way==8):#左下方向ひっくり返す
                            board[rowcol[1]-cnt][rowcol[0]+cnt]=bw
                        cnt-=1
            #一枚でもひっくり返したら指定された場所に白色を置く
            if(ok==1):
                board[rowcol[1]][rowcol[0]]=bw
    #何もひっくり返せなかったとき            
    if(ok==0):
        return 1   
```        
 
ターミナル上でオセロを表示する関数

```py
#ボード表示関数
def display(board):
    cnt=1 #何行目かを記憶する変数
    for i in range(10):
        if(i==0):#列番号表示
            for k in range(9):
                if(k==0):
                    print(' ',end=' ')
                else:
                    print(k,end=' ')
            print()
        for j in range(10):
            if(i!=0 and i!=9):#行番号表示
                if(j==0 and j!=9):
                    print(cnt,end=' ')
                    cnt+=1
            if(board[j][i]==0):#何も置かれていないマスの表示
                print('☐',end=' ')
            if(board[j][i]==1):#黒色表示
                print('○',end=' ')
            if(board[j][i]==2):#白色表示
                print('●',end=' ') 
        if(i!=0):
            print()
```