想写一个五子棋,但是在写一个类的时候,当不注释第八行的代码(self.is_end = None)
时,运行这段代码就会出现 TypeError: ‘NoneType’ object is not callable的错误,这是为什么呢
目前发现错误的原因:由于State类中,由于变量is_end和is_end函数使用了相同的名称,所以会出现调用出错,这是目前我发现的错误
import numpy as np
import time
BOzRD_ROWS = 15
BOARD_COLS = 15
class State:
def __init__(self):
self.data = np.zeros((BOARD_ROWS,BOARD_COLS))
# self.is_end = None 为什么在这里加这一句就会出现调用错误??
def next_state(self, row, col, symbol):
new_state = State()
new_state.data = self.data.copy()
new_state.data[row,col] = symbol
return new_state
# 最后落子在(row,col)处时是否结束比赛
def is_end(self, row, col, symbol):
directions = [[(-1,0),(1,0)],[(0,-1),(0,1)],[(-1,1),(1,-1)],[(-1,-1),(1,1)]]
for one_direction in directions:
count = 1
for direction in one_direction:
row_new = row
col_new = col
while True:
row_new += direction[0]
col_new += direction[1]
print(row_new,col_new)
if row_new < 0 or row_new > 14 or col_new < 0 or col_new > 14:
break
if self.data[row_new,col_new] == symbol:
count += 1
if count >= 5:
self.is_end = True
return self.is_end
else:
break
self.is_end = False
return self.is_end
def print_state(self):
for i in range(BOARD_ROWS):
out = str()
for j in range(BOARD_COLS):
if self.data[i,j] == 0:
token = '+ '
elif self.data[i,j] == 1:
token = '* '
else:
token = 'x '
out += token
print(out)
class Human_player():
def __init__(self):
self.state = None
self.symbol = None
def set_state(self, state):
self.state = state
def set_symbol(self, symbol):
self.symbol = symbol
def act(self):
location = input('please input you location: \n') # type: str
location_row = int(location.split(' ')[0]) - 1
location_col = int(location.split(' ')[1]) - 1
return [location_row, location_col, self.symbol]
def PVP():
state = State()
state.print_state()
player1 = Human_player()
player2 = Human_player()
player1.symbol = 1
player2.symbol = -1
while True:
[loc_row, loc_col, symbol] = player1.act()
state = state.next_state(loc_row,loc_col, symbol)
state.print_state()
is_end = state.is_end(loc_row, loc_col, symbol)
print(is_end)
if is_end:
return 0
[loc_row, loc_col, symbol] = player2.act()
state = state.next_state(loc_row, loc_col, symbol)
is_end = state.is_end(loc_row, loc_col, symbol)
state.print_state()
if is_end:
return 0
PVP()