0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

pythonで記述するオセロ

Last updated at Posted at 2022-12-10

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

実行結果:
vscode_実行結果.png
オセロボード仕様
0(☐):何も置かれていないマス
1:黒色が置かれているマス
2:白色が置かれているマス
9(✕):置いてはいけないマス

 0123456789 列(col)
0 ✕✕✕✕✕✕✕✕✕✕
1✕☐☐☐☐☐☐☐☐✕
2✕☐☐☐☐☐☐☐☐✕
3✕☐☐☐☐☐☐☐☐✕
4✕☐☐☐21☐☐☐✕
5✕☐☐☐12☐☐☐✕
6✕☐☐☐☐☐☐☐☐✕
7✕☐☐☐☐☐☐☐☐✕
8✕☐☐☐☐☐☐☐☐✕
9 ✕✕✕✕✕✕✕✕✕✕
行(row)

main関数こんな感じ

#変数、リストの定義
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]:列番号

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

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

#駒が置けるか判定する関数
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   

ターミナル上でオセロを表示する関数

#ボード表示関数
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()
0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?