うまく動いてくれません
オセロのプログラムを作ろうとしているのですが、肝心の「石を置き、挟んだ部分をひっくり返す」部分がうまく動いてくれません。
プログラムのエラーは出ないのですが,プログラムに入れたerrorばかり出てうまくいっていないです。
python
1import numpy as np 2 3white = 1 4black = -1 5blank = 0 6tablesize = 8 7class Board(object): 8 # 初期設定 9 def __init__(self): 10 self.cell = np.zeros((tablesize,tablesize)) 11 self.cell = self.cell.astype(int) 12 self.cell[3][3] = self.cell[4][4] = 1 13 self.cell[3][4] = self.cell[4][3] = -1 14 self.current = black 15 16 def turnchange(self): 17 self.current*= -1 18 def stonenumber(self): 19 return self.stones 20 21 def rangecheck(self,x,y): 22 if x<0 or 7<x or y<0 or 7<y: 23 return False 24 return True 25 26 def check_can_reverse(self): # 置けるかどうか 27 for i in range(8): 28 for j in range (8): 29 if not self.rangecheck(i,j): 30 return False 31 elif not self.cell[i][j] ==0: 32 return False 33 elif not self.can_reverse_stone(i,j): 34 return False 35 else: return True 36 37 def can_reverse_one(self,x,y,dx,dy): # 敵石の先に自石があるかどうか 38 length = 0 39 if self.cell[x + dx][y + dy] == 0: 40 print(x + dx, y + dy) 41 return False 42 elif self.cell[x + dx][y + dy] ==self.current: 43 return False 44 else: 45 while self.cell[x+dx][y+dy] == -self.current: 46 x +=dx 47 y +=dy 48 length += 1 49 if self.cell[x+dx][y+dy]== self.current: 50 return True 51 elif self.cell[x +dx][y +dy] ==0: 52 return False 53 continue 54 55 56 57 58 def can_reverse_stone(self,x,y): # 指定座標ではひっくり返せる石はあるか 59 print(x,y) 60 for dx in (-1,0,1): 61 for dy in (-1,0,1): 62 if dx ==dy == 0: continue 63 elif not self.cell[x + dx][y + dy] == 0: 64 continue 65 elif not self.can_reverse_one(x,y,dx,dy): 66 continue 67 else: 68 return True 69 70 def can_put_stone(self,x,y): # 入力座標に石は置けるか 71 if not self.rangecheck(x,y): 72 return False 73 elif not self.cell[x][y] == 0: 74 return False 75 elif not self.can_reverse_stone(x,y): 76 return False 77 else: return True 78 79 def reverse_stone(self,x,y): # 座標に石を置いて石をひっくり返す 80 if self.check_can_reverse(): 81 for dx in (-1,0,1): 82 for dy in (-1,0,1): 83 if self.can_reverse_one(x,y,dx,dy): 84 for k in length: 85 self.cell[x + dx*k][y + dy*k] *= -1 86 else: print('error') 87 88 def display(self): 89 print('--' * 20) 90 for i in range(8): 91 for j in range(8): 92 if self.cell[i][j] == white: 93 print('W', end = ' ') 94 elif self.cell[i][j] == black: 95 print('B', end = ' ') 96 else: 97 print('*', end = ' ') 98 print('\n', end = '') 99 100 def put_stone(self,x,y): 101 if self.can_reverse_stone(x,y): 102 self.reverse_stone(x,y) 103 self.turnchange() 104 else: 105 print('error') 106 107 108 109if __name__ == '__main__' : 110 board = Board() 111 board.display() 112 board.put_stone(3,2) 113 board.put_stone(4,2)
出力結果
python
1---------------------------------------- 2* * * * * * * * 3* * * * * * * * 4* * * * * * * * 5* * * W B * * * 6* * * B W * * * 7* * * * * * * * 8* * * * * * * * 9* * * * * * * * 10error 11error
やってみたこと
挟まれた石を全く選択出来ていないみたいなのですが、ここの改善方法がわかりませんでした。助力いただけると嬉しいです。
> うまくいっていない
具体的に、どうなることを期待し、質問記載のコードで実行するとどうなり、期待した物と実行した物で何が異なっているのかを質問に記載ください。
質問するときのヒント https://teratail.com/help/question-tips
を参照されて質問を記載されると回答が得られやすくなりますよ :-)
説明不足で申し訳ありません、以後気をつけます...
W(白),B(黒),*(blank)を表示する8×8の盤面のオセロを作ってます。上記のソースコードでは初期の盤面(白黒2つずつ)は出ます。しかし、「駒を置き、挟んだ駒をひっくり返す」動作をboard.put_stone(x,y)で書いたつもりなのですが、(x,y)座標を入たら表示されるのはerrorになってしまいます(作動はするのですが、どの座標でもコードに組み込んだerror表示が現れます)。
自分で色々試したところ、ひっくり返す石を見つけるcan_reverse_one関数の部分に問題があるとは思うのですが、そこの部分をどう変えればいいのかがわかりません。
質問を編集して質問自体に追記ください。
ここに書かれていても目に付きづらいので、判る方に見てもらえない可能性が高いです。
なんどもありがとうございます。
今修正しました!
回答2件
あなたの回答
tips
プレビュー