I've decided to learn Python about 2 weeks ago, been going through various books and videos, and I've decided to try my hand at programming a tic tac toe game. I was somewhat successful (it doesn't recognize if there's already a mark in a certain spot and allows overwriting of already placed marks) and I was wondering if any more experienced programmers could give me some general feedback about how I could do things better. Thank you so much and I hope you're all staying safe.
board = ['-'] * 9def print_board():print (board[0] + '|' + board[1] + '|' + board[2])print (board[3] + '|' + board[4] + '|' + board[5])print (board[6] + '|' + board[7] + '|' + board[8])legalMoves = [1,2,3,4,5,6,7,8,9]
print_board()turnCount = 0
def move():move = int(input('Pick a number 1-9:'))while move not in legalMoves:print('Illegal move')move = int(input('Pick a number 1-9:'))marks = ['X','O']if turnCount % 2 == 0:board[move - 1] = marks[1]else:board[move - 1] = marks[0]while True:if board[0] == board[1] == board[2] == 'X'\or board[3] == board[4] == board[5] == 'X'\or board[6] == board[7] == board[8] == 'X'\or board[0] == board[3] == board[6] == 'X'\or board[1] == board[4] == board[7] == 'X'\or board[2] == board[5] == board[8] == 'X'\or board[0] == board[4] == board[8] == 'X'\or board[2] == board[4] == board[6] == 'X' \or board[0] == board[1] == board[2] == 'O' \or board[3] == board[4] == board[5] == 'O' \or board[6] == board[7] == board[8] == 'O' \or board[0] == board[3] == board[6] == 'O' \or board[1] == board[4] == board[7] == 'O' \or board[2] == board[5] == board[8] == 'O' \or board[0] == board[4] == board[8] == 'O':print('Victory')breakelse:move()print_board()turnCount = turnCount + 1
well you need to check if the user has typed
an int or something else, so that breaks your
program, also prevent the user from overwriting
existed cell input, also prevent the user from
typing a number out of range which you have
already taken care of that, so I have written
this small function to give you the correct
input and deals with wrong ones, you can use it
def isInt(strInt):for c in strInt:if c not in "0123456789": return Falsereturn Truedef getNextMove():while True:moveStr = input("Pick a number 1-9: ") if not isInt(moveStr): print("Pls write only a number")continuemove = int(moveStr)if move < 1 or move > 9: print("Pls only 1-9 numbers are allowed")continueif board[move - 1] != "-":print("Pls choose an empty cell")continuereturn move
Well, if that helped, I couldn't stop my self from writing the full code for the game, I couldn't sleep anyway, so here it is, you may get some ideas, happy coding!
board = [" "] * 9
winner = ""def printBoard():print("-" * 7)for i in range(3):print(f"|{board[i * 3]}|{board[i * 3 + 1]}|{board[i * 3 + 2]}|")print("-" * 7)def isInt(strInt):for c in strInt:if c not in "0123456789": return Falsereturn Truedef getNextMove():while True:moveStr = input("Pick a number 1-9: ") if not isInt(moveStr): print("Pls write only a number")continuemove = int(moveStr)if move < 1 or move > 9: print("Pls only 1-9 numbers are allowed")continueif board[move - 1] != " ":print("Pls choose an empty cell")continuereturn movedef checkHVD():for i in range(3):if board[i * 3] == board[i * 3 + 1] == board[i * 3 + 2] and board[i * 3] != " ":return board[i * 3]elif board[i] == board[i + 3] == board[i + 6] and board[i] != " ":return board[i]if (board[0] == board[4] == board[8] or board[2] == board[4] == board[6]) and board[4] != " ":return board[4]return Falsefor i in range(9):board[getNextMove() - 1] = i % 2 == 0 and "X" or "O"printBoard()winner = checkHVD();if winner:identity = winner == "X" and "first" or "second"print(f"The {identity} player({winner}) won")breakif not winner:print("It's a tie")