塾でバイトしているのですが、夏期講習期間の鬼シフトからようやく解放されました。8月はお盆もあったのに、それでも20万稼いだ。すごい。
久しぶりにパソコンに触れたので、夏の間こっそり勉強してたPythonでオセロを作りました。今時点ではかつてないほど見にくいです。
明日以降Tkinterでアプリにして、あわよくばAIも、、、と考えています。
きっともっと上手な書き方があるんだろうなあ、と思います。精進します。
オセロ
#空きマス→0,白石→2,黒石→1
class player:
def __init__(self):
self.name="name"
self.disc=0
player1=player()
player2=player()
player1.name=input("先攻のプレイヤーの名前を入力してください。")
player1.disc=1
player2.name=input("後攻のプレイヤーの名前を入力してください。")
player2.disc=2
def reverse(place,board,player):#裏返す関数、戻り値→裏返せる枚数
dir=(-11,-10,-9,-1,1,9,10,11)#方向ベクトル
sum_cnt_rev=0#そこに置いたときに裏返せる枚数
for i in dir:
tmp_place=place#placeの初期化
cnt_rev=0#その方向においての裏返せる枚数
while board[tmp_place+i]!=player.disc:
if board[tmp_place+i]==(int(player.disc)-1.5)*-1+1.5:#ディスクが1なら2,2なら1(相手のディスクがある)
tmp_place+=i
cnt_rev+=1
else:#0(空きマス)か5(壁)
cnt_rev=0
break
for j in range(1,cnt_rev+1):
board[place+j*i]=player.disc
sum_cnt_rev+=cnt_rev
return sum_cnt_rev
def check(player,board,Re_board):#まだ置ける場所があるかチェックする関数,戻り値→置ける場所の数、座標
dir=(-11,-10,-9,-1,1,9,10,11)#方向ベクトル
cnt_can=0#置ける場所の数
can_place=[]
for place in Re_board:
sum_cnt_rev=0#そこに置いたときに裏返せる枚数
if board[place]==0:
for i in dir:
tmp_place=place#placeの初期化
cnt_rev=0#その方向においての裏返せる枚数
while board[tmp_place+i]!=player.disc:
if board[tmp_place+i]==(int(player.disc)-1.5)*-1+1.5:#ディスクが1なら2,2なら1(相手のディスクがある)
tmp_place+=i
cnt_rev+=1
else:#0(空きマス)か5(壁)
cnt_rev=0
break
sum_cnt_rev+=cnt_rev
else:
pass
if sum_cnt_rev!=0:
cnt_can+=1
can_place.append(place)
else:
pass
return (cnt_can,can_place)
def run(player,board):
#石を置く
success=False
while success==False:
placeX=input()
placeY=input()
try:
place=int(placeX)+(int(placeY))*10
if board[place]==0:
board[place]=int(player.disc)
#裏返す
sum_cnt_rev=reverse(place,board,player)
if sum_cnt_rev==0:
print("そこには置けません")
success=False
else:
success=True
else:
print("そこには置けません")
success=False
except:
print("整数の値を入力してください")
success=False
#盤面表示
for i in range(0,100):
print(board[i],end=' ')
if (i+1)%10==0 and i!=0:
print("\n")
#勝敗確認
def win(board):
cnt1=0
cnt2=0
for i in Re_board:
if board[i]==1:
cnt1+=1
elif board[i]==2:
cnt2+=1
else:
pass
return (cnt1,cnt2)
#ボードの初期化
board=[]#壁も含めた盤面
Re_board=[]#壁をのぞいた盤面
for i in range(0,100):
if (0<=i and i<=9) or (90<=i and i<=99) or i%10==0 or i%10==9:
board.append(5)
elif i==44 or i==55:
board.append(2)
Re_board.append(i)
elif i==45 or i==54:
board.append(1)
Re_board.append(i)
else:
board.append(0)
Re_board.append(i)
#盤面表示
for i in range(0,100):
print(board[i],end=' ')
if (i+1)%10==0 and i!=0:
print("\n")
#勝敗がつくまで実行
cnt=0#両方置けない場合の対策
tmp_canX=[]
tmp_canY=[]
while cnt==0 or cnt==1:
#1の番
cnt_can,can_place=check(player1,board,Re_board)
tmp_canX.clear()
tmp_canY.clear()
for i in can_place:
tmp_canX.append(i%10)
tmp_canY.append(i//10)
if cnt_can!=0:
print(player1.name+"の番です。どこに"+str(player1.disc)+"を置きますか?(xが先、yが後)")
for i in range(0,len(can_place)):
print(f'({tmp_canX[i]},{tmp_canY[i]})',end=' ')
print("に置けます")
run(player1,board)
cnt=0
else:
print("どこにも置けません")
cnt+=1
num1,num2=win(board)
if (num1+num2==64) or (num1==0) or (num2==0):
break
#2の番
cnt_can,can_place=check(player2,board,Re_board)
tmp_canX.clear()
tmp_canY.clear()
for i in can_place:
tmp_canX.append(i%10)
tmp_canY.append(i//10)
if cnt_can!=0:
print(player2.name+"の番です。どこに"+str(player2.disc)+"を置きますか?(xが先、yが後)")
for i in range(0,len(can_place)):
print(f'({tmp_canX[i]},{tmp_canY[i]})',end=' ')
print("に置けます")
run(player2,board)
cnt=0
else:
print("どこにも置けません")
cnt+=1
num1,num2=win(board)
if (num1+num2==64) or (num1==0) or (num2==0):
break
num1,num2=win(board)
if num1>num2:
print(f'{num1}対{num2}で{player1.name}の勝利です')
elif num1<num2:
print(f'{num2}対{num1}で{player2.name}の勝利です')
else:
print("引き分けです")