How can I improve this simple code to look better, concise and elegant? I've been learning Python for 2 weeks. I knew about basic Python stuff and some algorithms and data structure as well. I made a Tic-Tac-Toe game and it worked well but the problem is that I can't write code in a Pythonic way.
#importing libraries
from __future__ import print_function
import random
import os
import sys
#clear output
clear = lambda : os.system('cls')
#creating display board
def display_board(board):
clear()
print(' | |')
print(' ' + board[7] + ' | ' + board[8] + ' | ' + board[9])
print(' | |')
print('-----------')
print(' | |')
print(' ' + board[4] + ' | ' + board[5] + ' | ' + board[6])
print(' | |')
print('-----------')
print(' | |')
print(' ' + board[1] + ' | ' + board[2] + ' | ' + board[3])
print(' | |')
#getting input from player
def player_input():
marker = ' '
while not (marker == 'X' or marker == 'O'):
marker = raw_input('Choose O or X to play!').upper()
if marker == 'X':
return ('X','O')
else:
return ('O','X')
#place marker on borard
def place_marker(board,marker,postion):
board[position] = marker
#Checking win or not
def win_check (board,mark):
return ((board[7] == mark and board[8] == mark and board[9] == mark) or # across the top
(board[4] == mark and board[5] == mark and board[6] == mark) or # across the middle
(board[1] == mark and board[2] == mark and board[3] == mark) or # across the bottom
(board[7] == mark and board[4] == mark and board[1] == mark) or # down the middle
(board[8] == mark and board[5] == mark and board[2] == mark) or # down the middle
(board[9] == mark and board[6] == mark and board[3] == mark) or # down the right side
(board[7] == mark and board[5] == mark and board[3] == mark) or # diagonal
(board[9] == mark and board[5] == mark and board[1] == mark)) # diagonal
# who first to go
def choose_first():
if random.randint(0,1) == 0:
return 'Player 1'
else:
return 'Player 2'
# checking space is free or not
def check_space(board,position):
return board[position] == ' '
#full board check
def full_board_check (board):
for i in range (1,10):
if check_space(board,i):
return False
return True
#player choice
def player_choice (board):
position = ' '
while position not in '1 2 3 4 5 6 7 8 9'.split() or not check_space(board, int(position)):
position = raw_input('Choose number input 1-9')
return int(position)
#asking replay or not
def replay():
return raw_input('Do you want to play again? Enter Yes or No: ').lower().startswith('y')
print('Welcome to Tic Tac Toe Game!')
while True:
# Reset the board
theBoard = [' '] * 10
player1_marker, player2_marker = player_input()
turn = choose_first()
print(turn + ' will go first.')
game_on = True
while game_on:
if turn == 'Player 1':
# Player1's turn.
display_board(theBoard)
position = player_choice(theBoard)
place_marker(theBoard, player1_marker, position)
if win_check(theBoard, player1_marker):
display_board(theBoard)
print('Congratulations! You have won the game!')
game_on = False
else:
if full_board_check(theBoard):
display_board(theBoard)
print('The game is a draw!')
break
else:
turn = 'Player 2'
else:
# Player2's turn.
display_board(theBoard)
position = player_choice(theBoard)
place_marker(theBoard, player2_marker, position)
if win_check(theBoard, player2_marker):
display_board(theBoard)
print('Player 2 has won!')
game_on = False
else:
if full_board_check(theBoard):
display_board(theBoard)
print('The game is a tie!')
break
else:
turn = 'Player 1'
if not replay():
break