井字游戏Python 2.7

2024-05-08 01:28:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一个井字游戏程序,由于某些原因,当我试图打印一个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()   

Tags: inboardforreturnifdefcolrows
3条回答

我试过把第二行改成:

rows,cols = 3,3

我在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()函数中,则使用此函数

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

当为行或列输入3时,将调用

isOnBoard(board, 3, 3)

哪个叫

^{pr2}$

它将行设置为3

导致

(row < rows)

求值为假

您希望减少行和列,以符合Python基于零的索引

相关问题 更多 >