Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

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

Total beginner wrote a tic tac toe game in Python and would like some feedback

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 = ['-'] * 9

def 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')
        break

    else:
        move()
        print_board()
        turnCount = turnCount + 1
See Question&Answers more detail:os

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

1 Reply

0 votes
by (71.8m points)

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 False
  return True

def getNextMove():
  while True:
    moveStr = input("Pick a number 1-9: ") 
    if not isInt(moveStr): 
      print("Pls write only a number")
      continue
    move = int(moveStr)
    if move < 1 or move > 9: 
      print("Pls only 1-9 numbers are allowed")
      continue
    if board[move - 1] != "-":
      print("Pls choose an empty cell")
      continue
    return 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 False
  return True

def getNextMove():
  while True:
    moveStr = input("Pick a number 1-9: ") 
    if not isInt(moveStr): 
      print("Pls write only a number")
      continue
    move = int(moveStr)
    if move < 1 or move > 9: 
      print("Pls only 1-9 numbers are allowed")
      continue
    if board[move - 1] != " ":
      print("Pls choose an empty cell")
      continue
    return move

def 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 False

for 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")
    break

if not winner:
  print("It's a tie")

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...