質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.92%

pythonでオセロ(横端がつながったもの)を作りたい

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 3,020

score 7

pythonでオセロプログラムを作っています。

今までにないものにしたく、端と端がつながった円柱型のオセロを作りたいです。(トーラスオセロの次元が少ない版)
__
①|盤 |②
①|_ |②

(①と②がつながっている
以下のようなコードを実行しているのですが、おけるところの判定につながっている部分が出ません。
count_reversibleでxがsize以上になったらsizeを引くことでつながっているところを表現できていると思ったのですが…
よろしくお願い致します。

!/usr/bin/env python3

 -*- coding:utf-8 -*-

import time
import random
import copy

class Othello:

def play(self):
global computer
global user
start_time = time.time()
board = Board()
player1 = computer = Computer(BLACK, "PC")
player2 = user = User(WHITE, "あなた")

player1 = user = User(BLACK, "あなた")

player2 = computer = Computer(WHITE, "PC")

turn = 0
hand1 = hand2 = None
while board.is_playable() and not hand1 == hand2 == "pass":
turn += 1
print("TURN = %s" % turn)

print(board)
hand1 = player1.play(board)
print("%sの手: %s" % (player1.name, hand1))

print(board)
hand2 = player2.play(board)
print("%sの手: %s" % (player2.name, hand2))

self.show_result(board)

end_time = time.time()
print("試合時間:" + str(end_time - start_time))

def show_result(self, board):
print("------------------RESULT-------------------")  # 結果発表
print(board)
computer_stones = board.count(computer.stone)
user_stones = board.count(user.stone)
print("Computer: %s" % computer_stones)
print("You: %s" % user_stones)
print()
if computer_stones > user_stones:
print("YOU LOST!!!!!")
elif computer_stones < user_stones:
print("YOU WON!!!!!")
else:
print("DRAW")

class Stone(str):
pass

BLACK = Stone("b")
WHITE = Stone("w")
BLANK = Stone("x")
OPPONENT = {BLACK: WHITE, WHITE: BLACK}

class Board:
SIZE = 8
DIRECTIONS_XY = ((-1, -1), (+0, -1), (+1, -1),
(-1, +0),           (+1, +0),
(-1, +1), (+0, +1), (+1, +1))

def init(self):
size = self.SIZE
center = size // 2
square = [[BLANK for y in range(size)] for x in range(size)]  # 最初の盤面を定義
square[center - 1][center - 1:center + 1] = [WHITE, BLACK]
square[center + 0][center - 1:center + 1] = [BLACK, WHITE]
self.square = square

def str(self):
return '\n'.join(''.join(row) for row in self.square)

def getitem(self, x):
return self.square[x]

def is_playable(self):
return any(col != BLANK
for row in self.square
for col in row)

def count(self, stone):         # 石が何個あるかを返す関数
return sum(col == stone     # True is 1, False is 0
for row in self.square
for col in row)

def put(self, x, y, stone):     # y,xは置く石の座標、stoneにはWHITEかBLACKが入る。
self[x][y] = stone

 reverse

for dx, dy in Board.DIRECTIONS_XY:
n = self.count_reversible(x, y, dx, dy, stone)
for i in range(1, n + 1):
self[x + i * dx][y + i * dy] = stone

def count_reversible(self, x, y, dx, dy, stone):
size = self.SIZE
for n in range(size):
x += dx
if size<=x:
x-=size
dx=dx*(-1)
y += dy
if not (0 <= x < size and 0 <= y < size):
return 0
if self[x][y] == BLANK:
return 0
if self[x][y] == stone:
return n
n +=1
return 0

def is_available(self, x, y, stone):
if self[x][y] != BLANK:
return False
flag=any(self.count_reversible(x, y, dx, dy, stone) > 0
for dx, dy in self.DIRECTIONS_XY)
return flag

def availables(self, stone):  # 打てる場所の探索
return [(x, y)
for x in range(self.SIZE)
for y in range(self.SIZE)
if self.is_available(x, y, stone)]

class Player:   # abstract class

def init(self, stone, name):
self.stone = stone
self.name = name

def play(self, board):
availables = board.availables(self.stone)
if not availables:
return "pass"
return self.think(board, availables)

class Computer(Player):

def think(self, board, availables):
starttime = time.time()
print(availables)
print("thinking……")
own = self.stone
opponent = OPPONENT[own]
etc=availables
x,y=etc[0]
board.put(x, y, self.stone)
endtime = time.time()
interval = endtime - starttime
print("%s秒" % interval)  # 計算時間を表示
return x, y

class User(Player):

def think(self, board, availables):
while True:
print("打てる場所(Y, X): " + str(availables))   # 内部のx,yと表示のX,Yが逆なので注意
try:
line = input("Y X or quit: ")
except:
print("強制終了")
exit(1)
if line == "quit" or line == "exit":
print("放棄終了")
exit(1)
try:
x, y = map(int, line.split())
if (x, y) in availables:
board.put(x, y, self.stone)
return x, y
else:
print("そこには置けません")
except:
print("意味不明")

if name == 'main':
Othello().play()

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • pashango2

    2017/06/04 21:47

    pythonコードを```で囲んでください

    キャンセル

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る