入門用のサンプルとしてランダムリバーシを作成してみました。
当初6x6として完成したのですが、少し手直しして50x50ぐらいとか、すました顔でランダム対戦をします。
最初に大きさを聞いてきますので好きな数を入力してみてください。
プログラムとしてはBoardのクラスにだいたい全部仕込んでみました。
使っている技としては
Boardのbdにリスト
putの関数にスライス
printWinnerの関数に内包表記
あとpythonは文字列をリストのように利用できるのでそれも使っています。
独特かなと思うのは
revcheckでひっくり返せる方向をリストにして返します。
revには打つ座標(x,y)と駒(s)とひっくり返せる方向を渡しています。
randputは全座標、駒が打てるか判断しています。
打てる座標にランダムでスコアを与えて最もスコアの高い座標に打ちます。
pass打てる場所がない時は-1を返します。
100も試してみました。
当初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