我正在做一个井字游戏程序,由于某些原因,当我试图打印一个3x3的板时,它不起作用。我得打印一块4x4板。程序的工作方式是,我们先输入一行,然后输入一列,然后在这些坐标处打印X或O,但就像我说的。。。它不适合3x3板。每当我输入第3行或第3列时,它会说坐标超出范围。。。任何帮助都将不胜感激。谢谢您。在
def playTicTacToe():
rows,cols = 4,4
winLength = 3
board = makeNewBoard(rows, cols)
moves = 0
player = 1
while (moves < rows*cols):
row,col = getMove(board, player)
board = setPiece(board, row, col, player)
if (didWin(board, player, winLength)):
printBoard(board)
print getPieceLabel(player), " WINS!!!"
return
player = otherPlayer(player)
moves += 1
print "TIE GAME!!!!"
def makeNewBoard(rows, cols): return [([0]*cols) for row in xrange(rows)]
def getRows(board): return len(board)
def getCols(board): return len(board[0])
def getPiece(board, row, col): return board[row][col]
def setPiece(board, row, col, value):
board[row][col] = value
return board
def isEmpty(board, row, col):
return (getPiece(board, row, col) == 0)
def isOnBoard(board, row, col):
rows = getRows(board)
cols = getCols(board)
return ((row >= 0) and (row < rows) and
(col >= 0) and (col < cols))
def getPieceLabel(piece):
if (piece == 1): return "X"
elif (piece == 2): return "O"
else: return "-"
def printBoard(board):
print "\n**************************"
rows = getRows(board)
cols = getCols(board)
for row in xrange(rows):
for col in xrange(cols):
piece = getPiece(board, row, col)
label = getPieceLabel(piece)
print label,
print
def didWin(board, player, winLength):
rows = getRows(board)
cols = getCols(board)
for startRow in xrange(rows):
for startCol in xrange(cols):
if (didWin1(board, player, winLength, startRow, startCol)):
return True
return False
def didWin1(board, player, winLength, startRow, startCol):
for drow in xrange(-1,+2):
for dcol in xrange(-1,+2):
if ((drow != 0) or (dcol != 0)):
if (didWin2(board, player, winLength,
startRow, startCol, drow, dcol)):
return True
return False
def didWin2(board, player, winLength,
startRow, startCol, drow, dcol):
rows = getRows(board)
cols = getCols(board)
for step in xrange(winLength):
row = startRow + step*drow
col = startCol + step*dcol
if (not isOnBoard(board, row, col)):
return False
elif (getPiece(board, row, col) != player):
return False
return True
def otherPlayer(player):
return 1 if (player == 2) else 2
def oops(msg):
print " ", msg, "Try again."
def readInt(prompt):
while (True):
try:
return int(raw_input(prompt))
except:
oops("Input must be an integer.")
def getMove(board, player):
while (True):
printBoard(board)
print "Enter move for player", getPieceLabel(player)
row = readInt(" Row --> ")
col = readInt(" Col --> ")
if (not isOnBoard(board, row, col)):
oops("Out of range (not on the board)!")
elif (not isEmpty(board, row, col)):
oops("Already occupied!")
else:
return (row, col)
playTicTacToe()
我试过把第二行改成:
我在Python2.7解释器中做了这个,没问题!您忘了Python使用索引0、1和2而不是1、2和3吗?在
使用0代替1 用1代替2 用2代替3
你可以尝试让它使游戏使用1,2和3,使它更加用户友好,祝你好运!:)
您应该使用小于您作为索引输入的值,因为在python和其他大多数语言中,索引从
0
开始设置
row,cols=3,3
而在
getMove()
函数中,则使用此函数当为行或列输入3时,将调用
哪个叫
^{pr2}$它将行设置为3
导致
求值为假
您希望减少行和列,以符合Python基于零的索引
相关问题 更多 >
编程相关推荐