VScodeのターミナル上でオセロを実現 環境>>>VScode python 3.10.2
実行結果:
オセロボード仕様
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()