繁体   English   中英

连接四板的问题

[英]Issue with Connect Four Board

我试图让用户在他们的 connect 4 游戏中输入他们想要的行数和列数,所以我试图使用他们的输入来创建棋盘。 我正在尝试创建一个嵌套列表,以便我的其他代码可以工作。 在过去的 2 个小时里,我一直在尝试搜索 web 并绞尽脑汁寻找答案。 这是代码:

import random
import ast


def winner(board):
    """This function accepts the Connect Four board as a parameter.
    If there is no winner, the function will return the empty string "".
    If the user has won, it will return 'X', and if the computer has
    won it will return 'O'."""
    for row in range(7):
        count = 0
        last = ''
        for col in range(7):
            row_win = board[row][col]
            if row_win == " ":
                count = 0
                continue
            if row_win == last:
                count += 1
            else:
                count = 1
            if count >= 4:
                return row_win
            last = row_win

    for col in range(7):
        count = 0
        last = ''
        for row in range(7):
            col_win = board[row][col]
            if col_win == " ":
                count = 0
                continue
            if col_win == last:
                count += 1
            else:
                count = 1
            if count >= 4:
                return col_win
            last = col_win

    for row in range(7):
        for col in range(7):
            try:
                if (board[row][col] == board[row + 1][col + 1] and board[row + 1][col + 1] == board[row + 2][
                    col + 2] and
                    board[row + 2][col + 2] == board[row + 3][col + 3]) and (
                        board[row][col] != " " or board[row + 1][col + 1] != " " or board[row + 2][col + 2] != " " or
                        board[row + 3][col + 3] != " "):
                    return board[row][col]
            except:
                IndexError

    for row in range(7):
        for col in range(7):
            try:
                if (board[row][col] == board[row + 1][col - 1] and board[row + 1][col - 1] == board[row + 2][
                    col - 2] and
                    board[row + 2][col - 2] == board[row + 3][col - 3]) and (
                        board[row][col] != " " or board[row + 1][col - 1] != " " or board[row + 2][col - 2] != " " or
                        board[row + 3][col - 3] != " "):
                    return board[row][col]
            except:
                IndexError

    # No winner: return the empty string
    return ""


def display_board(board):
    """This function accepts the Connect Four board as a parameter.
    It will print the Connect Four board grid (using ASCII characters)
    and show the positions of any X's and O's.  It also displays
    the column numbers on top of the board to help
    the user figure out the coordinates of their next move.
    This function does not return anything."""

    # print(" 1   2   3   4   5   6   7")
    header = "  "
    i = 1
    while i < len(board) + 1:
        header = header + str(i) + "   "
        i += 1
    header = header + str(i)

    print(header)

    for row in board:
        print(" ", " | ".join(row))
        print(" ---+---+---+---+---+---+---")
    print()

    #
    # header = "  "
    # pipe_line = "  |"
    # separator = "---+"
    #
    # for row_num in range():
    #     header = header + str(row_num)
    #     pipe_line = pipe_line + " " + " | ".join(row))
    #     separator = separator + "---+"
    # print()


def make_user_move(board):
    """This function accepts the Connect Four board as a parameter.
    It will ask the user for a row and column.  If the row and
    column are each within the range of 1 and 7, and that square
    is not already occupied, then it will place an 'X' in that square."""

    valid_move = False
    while not valid_move:
        try:
            col = int(input("What col would you like to move to (1-7): "))
            if board[0][col - 1] != ' ':
                print("Sorry, that column is full. Please try again!\n")
            else:
                col = col - 1
                for row in range(6, -1, -1):
                    if board[row][col] == ' ' and not valid_move:
                        board[row][col] = 'X'
                        valid_move = True
        except:
            ValueError
            print("Please enter a valid option! ")

    return board


def make_computer_move(board):
    """This function accepts the Connect Four board as a parameter.
    It will randomly pick row and column values between 0 and 6.
    If that square is not already occupied it will place an 'O'
    in that square.  Otherwise, another random row and column
    will be generated."""
    computer_valid_move = False
    while not computer_valid_move:
        col = random.randint(0, 6)
        if board[0][col] != ' ':
            print("Sorry, that column is full. Please try again!\n")
        else:
            for row in range(6, -1, -1):
                if board[row][col] == ' ' and not computer_valid_move:
                    board[row][col] = 'O'
                    computer_valid_move = True
    return board


def main():
    """The Main Game Loop:"""

    # free_cells = 42
    # users_turn = True
    # cf_board = [[" ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " "],
    #             [" ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " "],
    #             [" ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " "],
    #             [" ", " ", " ", " ", " ", " ", " "]]

    cf_board = []
    row = int(input("How many rows do you want your game to have? "))
    col = int(input("How many columns do you want your game to have? "))
    free_cells = col * row
    row_str = "\" \""
    board_str = "\" \""
    i = 0
    j = 0

    while i < col-1:
        row_str = row_str + "," + "\" \""
        i += 1
    row_str = "'" + row_str + "'"
    board_str = row_str + ","
    while j < row-1:
        board_str = board_str + row_str + ","
        j += 1
    Input = [board_str]
    cf_board = [list(ast.literal_eval(x)) for x in Input]
    # for i in range(row-1):
    #     cf_board.append(row_str)

    while not winner(cf_board) and (free_cells > 0):
        display_board(cf_board)
        if users_turn:
            cf_board = make_user_move(cf_board)
            users_turn = not users_turn
        else:
            cf_board = make_computer_move(cf_board)
            users_turn = not users_turn
        free_cells -= 1

    display_board(cf_board)
    if (winner(cf_board) == 'X'):
        print("Y O U   W O N !")
    elif (winner(cf_board) == 'O'):
        print("T H E   C O M P U T E R   W O N !")
    elif free_cells == 0:
        print("S T A L E M A T E !")
    print("\n*** GAME OVER ***\n")


# Start the game!
main()

我希望它变成这样的格式;

    # cf_board = [[" ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " "],
    #             [" ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " "],
    #             [" ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " "],
    #             [" ", " ", " ", " ", " ", " ", " "]]

其中行和列取决于用户。 我已经尝试过实现这一目标,但我只得到了这个不被行数和列数分隔的巨大列表。

TL;博士

请帮助我在 main() 修复我的代码,我正在尝试用用户的输入构建一个板

请尝试仅使用最小的可重现示例提出问题。 如果您只是想解决从用户输入构建板的问题,那么只需发布与此相关的必要代码。 要生成开放空间列表的列表,您可以执行以下操作。

row = int(input("How many rows do you want your game to have? "))
col = int(input("How many columns do you want your game to have? "))
cf_board = []
rowLst = []

for i in range(row):
    for j in range(col):
        rowLst.append(" ")
    cf_board.append(rowLst.copy())
    rowLst.clear()

print(board)

for j in range(col) 将一个开放空间附加到一个新列表中。 完成后,该列表将附加到主板列表,然后将 go 清除到下一行。

获得该板非常简单。 不需要 eval 或类似的东西。

只需执行cf_board = [[" "]*col]*row即可根据需要在其中放置尽可能多的空格条目和列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM