孤影悄然のシンデレラ

ぼくの思考のセーブポイント

頭脳王2019の考察ゲーム

今年のバレンタインぐらいに放送されていた「頭脳王」で行われた考察ゲームを雑に作ったので誰か見てという話。(どうでもいい話だが, 優勝者は最近性欲に忠実なことが広まった〇ん〇ん)

 

ルールは簡単で、2人対戦型のボードゲームで、5×5の盤面とコマxが5個、コマoが5個与えられる。交互にコマを動かしていき次のどちらかを満たしたプレイヤーの勝ちとなる。

1:相手のコマを1つとる。

2:相手のコマすべてを動けなくする。

コマの移動についてだが、将棋の飛車のように縦と横に好きなだけ動かすことができる。ただしコマをすり抜けて動かすことはできない。

コマの取り方は、相手のコマを自分のコマで挟むだけである。ただし xox のように両隣を挟んだときのみ取ることができ, xooxのように挟んでもとることは出来ない。

また x . xという盤面があったときにoが自ら真ん中に入りに行く(つまりxoxの盤面を作りに行く)ときは挟まれたという判定をしないらしいので、それに従った。

 

ファイルここに貼って遊んでもらおうかと思ったけど、はてなブログにファイルのアップロードに仕方がわからないのでキレた。ソースコード貼るからそれで許して

 

sd = ['','','','','','','']
s0 = ['0','1','2','3','4','5','']
s1 = ['A','o','o','o','o','o','']
s2 = ['B','.','.','.','.','.','']
s3 = ['C','.','.','.','.','.','']
s4 = ['D','.','.','.','.','.','']
s5 = ['E','x','x','x','x','x','']
S = [sd,s0,s1,s2,s3,s4,s5,sd]
alpha = ['A','B','C','D','E']
alpha = set(alpha)
AN = {'A':2,'B':3,'C':4,'D':5,'E':6}
dx = [1,0,-1,0]
dy = [0,1,0,-1]

print("ルール説明\n5x5の盤面(A1~E5)とコマxが5個, コマoが5個あります。\n全ての駒は縦横に好きなだけ動かすことができます。")
print("ただしコマを通り抜けて動かすことはできません。\n交互にコマを動かしていき次のどちらかを満たしたプレイヤーの勝ちとなります。")
print("1:相手のコマを一つでも取る\n2:相手のコマを全て動けなくする")
print("相手のコマは自分のコマで挟むことでとることができます\n50ターン経過時に決着がついていなかった場合は引き分けとなります。")

def output(i):
    print("")
    print(str(i)+"ターン目")
    for s in S:
        print(''.join(s))

def judge():
    x_check = []
    o_check = []
    for i in range(7):
        for j in range(7):
            if S[i][j] == 'x':
                x_check.append((i,j))
            elif S[i][j] == 'o':
                o_check.append((i,j))
    if len(x_check) == 4:
        print("oを操作しているプレイヤーの勝ちです")
        exit()
    elif len(o_check) == 4:
        print("xを操作しているプレイヤーの勝ちです")
        exit()
    else:
        draw = 0
        for y,x in x_check:
            for i in range(4):
                ny = y+dy[i]
                nx = x+dx[i]
                if S[ny][nx] == '.':
                    draw = 1
        if not draw:
            print("oを操作しているプレイヤーの勝ちです")
            exit()
        draw = 0
        for y,x in o_check:
            for i in range(4):
                ny = y+dy[i]
                nx = x+dx[i]
                if S[ny][nx] == '.':
                    draw = 1
        if not draw:
            print("xを操作しているプレイヤーの勝ちです")
            exit()

def move(a,b):
    flag = 1
    output(game_turn)
    judge()
    print(a+"を動かすプレイヤーのターンです\n動かすコマと動かす位置を入力してください")
    while flag:
        start,goal = input().split()
        if start[0] not in alpha or goal[0] not in alpha :
            print(" \nerror\n盤面外を参照しています")
        else:
            sy = AN[start[0]]
            sx = int(start[1])
            gy = AN[goal[0]]
            gx = int(goal[1])
            if not (1<=sx<=5) or not (2<=sy<=6) or S[sy][sx] != a:
                print(" \nerror\nそこに動かせるコマはありません")
            elif not (1<=gx<=5) or not (2<=gy<=6) or S[gy][gx] != '.' or (sy != gy and sx != gx) or (sy == gy and sx == gx):
                print(" \nerror\nそのコマはそこには動かせません")
            elif sy == gy:
                tmp = 0
                for i in range(min(sx,gx),max(sx,gx)+1):
                    if S[sy][i] == '.':
                        tmp += 1
                if tmp != max(sx,gx)-min(sx,gx):
                    print(" \nerror\nそのコマはそこには動かせません")
                else:
                    flag = 0
            elif sx == gx:
                tmp = 0
                for i in range(min(sy,gy),max(sy,gy)+1):
                    if S[i][sx] == '.':
                        tmp += 1
                if tmp != max(sy,gy)-min(sy,gy):
                    print(" \nerror\nそのコマはそこには動かせません")
                else:
                    flag = 0
            else:
                flag = 0

    S[sy][sx] = '.'
    S[gy][gx] = a
    if S[gy][gx+1] == b and S[gy][gx+2] == a:
        S[gy][gx+1] = '.'
    if S[gy][gx-1] == b and S[gy][gx-2] == a:
        S[gy][gx-1] = '.'
    if S[gy-1][gx] == b and S[gy-2][gx] == a:
        S[gy-1][gx] = '.'
    if S[gy+1][gx] == b and S[gy+2][gx] == a:
        S[gy+1][gx] = '.'

game_turn = 1
while game_turn < 50:
    if game_turn%2 == 1:
        move('x','o')     
    else:
        move('o','x')
    game_turn += 1

print("引き分けです")
exit()

はじまりがこんな感じ

テレビでもちらっとしかやってなかったけど、あまり面白いゲームじゃないです。多分後攻は勝てません(引き分けに持ち込むしかない)