【问题标题】:Tic Tac Toe Python 2.7井字游戏 Python 2.7
【发布时间】:2013-12-21 10:24:06
【问题描述】:

我正在开发井字游戏程序,但由于某种原因,当我尝试打印 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()   

【问题讨论】:

  • 您应该包含完整的错误回溯。

标签: python python-2.7


【解决方案1】:

当您为行或列输入 3 时,您正在调用

isOnBoard(board, 3, 3)

哪个调用

rows = getRows(board)

将行设置为 3

导致

(row < rows)

判断为假

您希望减少 row 和 col 以符合 Python 的从零开始的索引

【讨论】:

    【解决方案2】:

    您应该使用小于作为索引输入的值,因为在 python 和大多数其他语言中,索引从 0 开始

    设置

    row,cols=3,3

    并在 getMove() 函数中改用它

    row = readInt("  Row --> ")-1
    col = readInt("  Col --> ")-1
    

    【讨论】:

    • 就是这样。我一直忘记python首先使用0。在整个编程方面,我仍然是个菜鸟。谢谢大家。
    【解决方案3】:

    我已经尝试过,只需将第二行更改为:

    rows,cols = 3,3
    

    我在 python 2.7 解释器中做了这个,很好!您是否忘记了 Python 使用索引 0、1 和 2 而不是 1、2 和 3?

    用 0 代替 1 用 1 代替 2 用 2 代替 3

    您可以尝试让游戏使用 1、2 和 3 来使其更加人性化,祝您好运! :)

    【讨论】:

    • 哈哈,我们都会犯错,伙计:)祝你好运!
    猜你喜欢
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多