Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
3.3k views
in Technique[技术] by (71.8m points)

python - Is is possible to derive a Connect Four out of my Tic Tac Toe game?

I'm somewhat of a beginner and I'm wondering if I'd be able to derive a Connect Four game out of my existing Tic Tac Toe game. I somewhat understand the mechanics, but am stumped at how to expand the board to 7 (rows) x 6 (columns). I know that there won't be any use for rows, because a column would be fine because a piece drops to the bottom of a Connect Four game. Below is my Tic Tac Toe code.

"""
    Author: Victor Xu

    Date: Jan 12, 2021

    Description: An implementation of the game Tic-Tac-Toe in Python,
    using a nested list, and everything else we've learned this quadmester!
"""

import random


def winner(board):
    """This function accepts the Tic-Tac-Toe 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'."""

    # Check rows for winner
    for row in range(3):
        if (board[row][0] == board[row][1] == board[row][2]) and 
                (board[row][0] != " "):
            return board[row][0]

    # COMPLETE THE REST OF THE FUNCTION CODE BELOW
    for col in range(3):
        if (board[0][col] == board[1][col] == board[2][col]) and 
                (board[0][col] != " "):
            return board[0][col]

    # Check diagonal (top-left to bottom-right) for winner
    if (board[0][0] == board[1][1] == board[2][2]) and 
            (board[0][0] != " "):
        return board[0][0]

    # Check diagonal (bottom-left to top-right) for winner
    if (board[0][2] == board[1][1] == board[2][0]) and 
            (board[0][2] != " "):
        return board[0][2]

    # No winner: return the empty string
    return ""


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

    print("   0   1   2")
    print("0: " + board[0][0] + " | " + board[0][1] + " | " + board[0][2])
    print("  ---+---+---")
    print("1: " + board[1][0] + " | " + board[1][1] + " | " + board[1][2])
    print("  ---+---+---")
    print("2: " + board[2][0] + " | " + board[2][1] + " | " + board[2][2])
    print()


def make_user_move(board):
    """This function accepts the Tic-Tac-Toe 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 0 and 2, and that square
    is not already occupied, then it will place an 'X' in that square."""

    valid_move = False
    while not valid_move:
        row = int(input("What row would you like to move to (0-2):"))
        col = int(input("What col would you like to move to (0-2):"))
        if (0 <= row <= 2) and (0 <= col <= 2) and (board[row][col] == " "):
            board[row][col] = 'X'
            valid_move = True
        else:
            print("Sorry, invalid square. Please try again!
")


def make_computer_move(board):
    """This function accepts the Tic-Tac-Toe board as a parameter.
    It will randomly pick row and column values between 0 and 2.
    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:
        row = random.randint(0, 2)
        col = random.randint(0, 2)
        if (0 <= row <= 2) and (0 <= col <= 2) and (board[row][col] == " "):
            board[row][col] = 'O'
            computer_valid_move = True


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

    free_cells = 9
    users_turn = True
    ttt_board = [[" ", " ", " "], [" ", " ", " "], [" ", " ", " "]]

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

    display_board(ttt_board)
    if (winner(ttt_board) == 'X'):
        print("Y O U   W O N !")
    elif (winner(ttt_board) == 'O'):
        print("I   W O N !")
    else:
        print("S T A L E M A T E !")
    print("
*** GAME OVER ***
")


# Start the game!
main()

Also, I'm unsure how to check for a winning combination (connecting 4 in a row) since the board has become much larger. In a 3 x 3 tic tac toe board, I could list out the diagonal coordinates and that would be it, but it's much more difficult with a board larger than 4 x 4. Any guidance would be appreciated!

EDIT

I've created a 7 x 6 board for my Connect Four game, but now I don't know how to verify if a column's space is empty because Connect Four pieces drop to the bottom. Below is my code:

"""
    Author: Victor Xu

    Date: Jan 12, 2021

    Description: An implementation of the game Tic-Tac-Toe in Python,
    using a nested list, and everything else we've learned this quadmester!
"""

import random


def winner(board):
    """This function accepts the Tic-Tac-Toe 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'."""



    # No winner: return the empty string
    return ""


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

    print("   0   1   2   3   4   5   6")
    print("   " + board[0][0] + " | " + board[0][1] + " | " + board[0][2] + " | " + board[0][3] + " | " + board[0][
        4] + " | " + board[0][5] + " | " + board[0][6])
    print("  ---+---+---+---+---+---+---")
    print("   " + board[1][0] + " | " + board[1][1] + " | " + board[1][2] + " | " + board[1][3] + " | " + board[1][
        4] + " | " + board[1][5] + " | " + board[1][6])
    print("  ---+---+---+---+---+---+---")
    print("   " + board[2][0] + " | " + board[2][1] + " | " + board[2][2] + " | " + board[2][3] + " | " + board[2][
        4] + " | " + board[2][5] + " | " + board[2][6])
    print("  ---+---+---+---+---+---+---")
    print("   " + board[3][0] + " | " + board[3][1] + " | " + board[3][2] + " | " + board[3][3] + " | " + board[3][
        4] + " | " + board[3][5] + " | " + board[3][6])
    print("  ---+---+---+---+---+---+---")
    print("   " + board[4][0] + " | " + board[4][1] + " | " + board[4][2] + " | " + board[4][3] + " | " + board[4][
        4] + " | " + board[4][5] + " | " + board[4][6])
    print("  ---+---+---+---+---+---+---")
    print("   " + board[5][0] + " | " + board[5][1] + " | " + board[5][2] + " | " + board[5][3] + " | " + board[5][
        4] + " | " + board[5][5] + " | " + board[5][6])
    print("  ---+---+---+---+---+---+---")
    print("   " + board[6][0] + " | " + board[6][1] + " | " + board[6][2] + " | " + board[6][3] + " | " + board[6][
        4] + " | " + board[6][5] + " | " + board[6][6])
    print()


def make_user_move(board):
    """This function accepts the Tic-Tac-Toe 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 0 and 2, and that square
    is not already occupied, then it will place an 'X' in that square."""

    valid_move = False
    while not valid_move:
        col = int(input("What col would you like to move to (0-6):"))
        if (0 <= col <= 6) and (board[col] == " "):
            board[col] = 'X'
            valid_move = True
        else:
            print("Sorry, invalid square. Please try again!
")


def make_computer_move(board):
    """This function accepts the Tic-Tac-Toe board as a parameter.
    It will randomly pick row and column values between 0 and 2.
    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 (0 <= col <= 6) and (board[col] == " "):
            board[col] = 'O'
            computer_valid_move = True


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

    free_cells = 42
    users_turn = True
    ttt_board = [[" ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " "],
                 [" ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " "],
                 [" ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " "],
                 [" ", " ", " ", " ", " ", " ", " "]]

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

    display_board(ttt_board)
    if (winner(ttt_board) == 'X'):
        print("Y O U   W O N !")
    elif (winner(ttt_board) == 'O'):
        print("I   W O N !")
    else:
        print("S T A L E M A T E !")
    print("
*** GAME OVER ***
")


# Start the game!
main()

Whenever I enter a column number, it says that it's not a valid square...


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

You're currently checking if the column is 'X'

board[col] = 'X'

But the column can't be a string - because it's a list.

You need to check what the highest element with the value of 'X'. Replace

if board[col][6] == 'X':
    print("Sorry, that column is full. Please try again!
")
else:
    for row in range(6, 0, -1):
        if board[col][row] == 'X':
            board[col][row + 1] = 'X'
            valid_move = True
    if not valid_move:
        board[col][0] = 'X'
        valid_move = True

You'll learn far better ways to work with lists as you continue to learn programming but this should get you started for now!


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...