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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

3492閲覧

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

hanore

総合スコア7

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2017/05/29 09:58

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()

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pashango2

2017/06/04 12:47

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問