Is it possible to derive a Connect 4 Game out of my Tic Tac Toe Game? (Please see code below)

I’m a beginner at Python and barely have any experience in programming. Anyways, as the title suggests, is it possible to derive my tic tac toe code into a 7 x 6 board of Connect Four? Below is my code for tic tac toe:

"""
    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!\n")


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("\n*** GAME OVER ***\n")


# Start the game!
main()

If it’s possible, how would you change the dimension of the board and the mechanics of the game? I’ve tried modifying the board many times but to no avail. One of my attempts:

    Author: Victor Xu

    Date: Jan 20, 2021

    Description: Connect Four, the classic game where a player needs to match 4 horizontally, vertically, or diagonally
    in order to win.
"""

import random


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'."""

    # Check rows for winner

    # 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(" 0   1   2   3   4   5   6")
    print(" ", board[0], " | ", board[1], " | ", board[2], " | ", board[3], " | ", board[4], " | ", board[
        5], " | ", board[6])
    print("---+---+---+---+---+---+---")
    print(" ", " | ", " | ", " | ", " | ", " | ", " | ")
    print("---+---+---+---+---+---+---")
    print(" ", " | ", " | ", " | ", " | ", " | ", " | ")
    print("---+---+---+---+---+---+---")
    print(" ", " | ", " | ", " | ", " | ", " | ", " | ")
    print("---+---+---+---+---+---+---")
    print(" ", " | ", " | ", " | ", " | ", " | ", " | ")
    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 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 <= 6) and (0 <= col <= 5) and (board[row][col] == " "):
            board[row][col] = 'X'
            valid_move = True
        else:
            print("Sorry, invalid square. Please try again!\n")


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 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, 5)
        col = random.randint(0, 6)
        if (0 <= row <= 6) and (0 <= col <= 5) and (board[row][col] == " "):
            board[row][col] = 'O'
            computer_valid_move = True


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

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

    while not winner(cf_board) and (free_cells > 0):
        display_board(cf_board)
        if users_turn:
            make_user_move(cf_board)
            users_turn = not users_turn
        else:
            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("I   W O N !")
    else:
        print("S T A L E M A T E !")
    print("\n*** GAME OVER ***\n")


# Start the game!
main()

However, I’m faced with a bug where they print cf_board… Please don’t mind the rest of the code, just look at the ASCII board. I understand that the mechanics of the game will be much more different, especially the fact that we won’t be using rows anymore in the game. I just want someone to explain to me how it’ll all work out.

Thank you!

You didn’t follow your original display_board logic when creating the new version. Specifically, cf_board is a 2-dimensioned array, requiring you to specify both indices when accessing it. To wit, the first cell is board[0][0], not board[0].

I’d create a separate function to print a single line of the board. That way you don’t have to repeat six lines of printing board[0][0]board[0][6], then board[1][0]board[1][6] and so on.

If I remember, Connect4 uses Red/Blue circles, so you might want to print ‘R’ instead of ‘X’ and ‘B’ instead of ‘O’.