パーソナルブログメモリ

a = [1, 1]
for _ in "*" * 999: a += [sum(a[-2:])]
print(a)

巨大リバーシの作成

2018-09-23 | python入門(すぐさまマスター)
入門用のサンプルとしてランダムリバーシを作成してみました。
当初6x6として完成したのですが、少し手直しして50x50ぐらいとか、すました顔でランダム対戦をします。
最初に大きさを聞いてきますので好きな数を入力してみてください。

プログラムとしてはBoardのクラスにだいたい全部仕込んでみました。
使っている技としては
Boardのbdにリスト
putの関数にスライス
printWinnerの関数に内包表記
あとpythonは文字列をリストのように利用できるのでそれも使っています。

独特かなと思うのは
revcheckでひっくり返せる方向をリストにして返します。
revには打つ座標(x,y)と駒(s)とひっくり返せる方向を渡しています。

randputは全座標、駒が打てるか判断しています。
打てる座標にランダムでスコアを与えて最もスコアの高い座標に打ちます。
pass打てる場所がない時は-1を返します。

100も試してみました。


import random
import copy
#py reversi 6x6

class Board:
    def __init__(sf,w):
        sf.bw=int(w)
        sf.bh=int(w)
        sf.bd=[" "*sf.bw]*sf.bh
        sf.put(sf.bw//2-1,sf.bh//2-1,"o")
        sf.put(sf.bw//2,sf.bh//2-1,"x")
        sf.put(sf.bw//2-1,sf.bh//2,"x")
        sf.put(sf.bw//2,sf.bh//2,"o")
        sf.dx=[-1,0,1,-1,1,-1,0,1]
        sf.dy=[-1,-1,-1,0,0,1,1,1]
    def put(sf,x,y,s):
        sf.bd[y]=sf.bd[y][:x]+s+sf.bd[y][x+1:]
    def get(sf,x,y):
        if 0>x or 0>y or x>sf.bw-1 or y>sf.bh-1:return " "
        return sf.bd[y][x]
    def view(sf):
        for i in sf.bd:print(i)
    def revcheck(sf,x,y,s):
        if sf.bd[y][x]!=" ":return []
        ret=[]
        for dr in range(8):
            sw=0
            for i in range(1,6):
                p=sf.get(x+sf.dx[dr]*i,y+sf.dy[dr]*i)
                if sw==0 and (p==" " or p==s):break
                elif sw==0:sw=1
                elif sw==1 and p==" ":break
                elif sw==1 and p==s:
                    ret+=[dr]
                    break
        return ret
    def rev(sf,x,y,s,revdr):
        sf.put(x,y,s)
        for dr in revdr:
            for i in range(1,max(sf.bw,sf.bh)+1):
                px=x+sf.dx[dr]*i
                py=y+sf.dy[dr]*i
                p=sf.get(px,py)
                if p!=s:sf.put(px,py,s)
                else:break
    def printWinner(sf):
        bc=sum([i.count("o") for i in sf.bd])
        wc=sum([i.count("x") for i in sf.bd])
        print("o",bc,"vs","x",wc)
        if bc==wc:print("drow")
        elif bc>wc:print("o win")
        else:print("x win")
    def randput(sf,s):
        #0:ok -1:noput
        bestS=bestX=bestY=-1
        bestDr=[]
        for x in range(sf.bw):
            for y in range(sf.bh):
                revdr=sf.revcheck(x,y,s)
                if len(revdr)>0:
                    score=random.randint(0,10000000)
                    if score>bestS:
                        bestS=score
                        bestDr=copy.deepcopy(revdr)
                        bestX=x
                        bestY=y
        if bestS==-1:return -1
        else:
            sf.rev(bestX,bestY,s,bestDr)
            return 0
            
print("大きさは?")
w=input()
b=Board(w)
b.view()
endFlag=0
for i in "ox"*10000:
    r=b.randput(i)
    if r==0:
        b.view()
        print("-"*b.bw)
        endFlag=0
    else:
        if endFlag==-1:
            b.printWinner()
            print("game over")
            break
        endFlag=-1


最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。