LoginSignup
0
1

Pythonでオセロ作成

Posted at

塾でバイトしているのですが、夏期講習期間の鬼シフトからようやく解放されました。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("引き分けです")
0
1
0

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
1