Search code examples
pythonpython-2.7tic-tac-toenumeric-input

Accepting only integers for TIC TAC TOE


Here's this TIC TAC TOE Game i have created using Python..

import os
os.system('cls')

i = 0
#Exiter
def exithoja():
    import sys
    raw_input
    sys.exit()

#Displays Win or Draw
def diswin(name,grid):
    i = checkwin(grid)
    os.system('cls')

    viewgrid(grid)

    if i ==1:
        print name, " has won the game !!"
    elif i == -1:
        print "This Match is a draw !!"
    exithoja()
#Checking for Win or Draw Function
def checkwin(grid):
    i = 0
    result = 0
    extra=0
    for i in range (1,9):            #This part checks for full grid.
        if (grid[i] == 'X' or grid[i]=='O'):
            extra += 1
        if (grid[1] == grid[2] and grid[2] == grid[3]):
            result = 1                   #This part checks for win.

        elif(grid[4] == grid[5] and grid[5] == grid[6]):
            result = 1
        elif(grid[7] == grid[8] and grid[8] == grid[9]):
            result = 1

        elif(grid[1] == grid[4] and grid[4] == grid[7]):
            result = 1

        elif(grid[2] == grid[5] and grid[5] == grid[8]):
            result = 1

        elif(grid[3] == grid[6] and grid[6] == grid[9]):
            result = 1

        elif(grid[1] == grid[5] and grid[5] == grid[9]):
            result = 1

        elif(grid[3] == grid[5] and grid[5] == grid[7]):
            result = 1

        elif(extra==9):       #This part checks for draw.
            result = -1

    return result         #0 for continue,1 for win, -1 for draw.


#Grid Print Function
def viewgrid(grid):
    print "\n\n      .       .\n",
    print "      |       |    "
    for i in range(1,10):
        if i%3==0:
            print " ",
        else:
            print "",
        print "",grid[i]," ",
        if i%3 == 0:
            if i == 9:
                print "\n      |       |",
                print "\n      '       '"
            else:
                print "\n      |       |    ",
                print "\n------+-------+-------\n",
                print "      |       |    "

        else:
            print "|",

#Grid Print Function Ends

#Marks the user choice is possible ('X' or 'O' if possible, 0 if not possible)
def markgrid(user,grid, place):
    if grid[place] != place:
        returnvalue = 0
    else:
        returnvalue = user
    return returnvalue
#End of Mark Grid Function



#Player 1 Marking Function Part 1
def player11(name1,grid):
    os.system('cls')
    viewgrid(grid)
    print name1, ", Please enter your choice from the grid above : ",
    place = raw_input()
    place = int(place,10)
    if place == '.':
        import sys
        sys.exit()
    elif place > 9 or place < 1:
        place = 0
    return place
#Player 1 Marking Function Part 1 ends

#Player 1 Marking Function Part 2
def player12(place,grid,name1):
    if place == 0:
        while place==0:
            place == player11(name1,grid)
    grid[place] = markgrid('O',grid,place)
#Player 1 Marking Function Part 2 ends


#Player 2 Marking Function Part 1
def player21(name2,grid):
    os.system('cls')
    viewgrid(grid)
    print name2, ", Please enter your choice from the grid above : ",
    place = raw_input()
    place = int(place,10)
    if place == '.':
        import sys
        sys.exit()
    elif place > 9 or place < 1:
        place = 0
    return place
#Player 2 Marking Function Part 1 ends

#Player 2 Marking Function Part 2
def player22(place,grid,name2):
    if place == 0:
        while place==0:
            place == player21(name2,grid)
    grid[place] = markgrid('X',grid,place)
#Player 2 Marking Function Part 2 ends



#Reset Grid Code starts here
def gridreset(grid):
    j = 0     
    for j in range(0,10):
        grid.append(j)
#Reset Grid Code ends here

#This is the main program, defined as a function itself
def playgame():
    print "\n\nUser 1 - Please Enter your name : ",
    name1 = raw_input()
    print "User 2 - Please Enter your name : ",
    name2 = raw_input()
    print "\n",name1,", your marking is O",
    print "\n",name2,", your marking is X"
    user1 = 'O'
    user2 = 'X'
    raw_input()
    grid = []
    gridreset(grid)
    def player1(name1):
        i = player11(name1,grid)
        if markgrid('O',grid,i) == 0:
            player1(name1)
        player12(i,grid,name1)
        i = checkwin(grid)
        print i
        if i==1 or i == -1:
            diswin(name1,grid)
        player2(name2)
        return grid
    def player2(name2):
        i = player21(name2,grid)
        if markgrid('X',grid,i) == 0:
            player2(name2)
        player22(i,grid,name2)
        i = checkwin(grid)
        if i==1 or i == -1:
            diswin(name2,grid)
        player1(name1)
        return grid
    player1(name1)
    player2(name2)
    return grid
#Main Program end

#Main Program Execution
grid = []

grid = playgame()

The main thing left is to accept only integers for the variable "place" in the functions player11 and player21.. if it's not an integer the function is to be called again and new value for "place" is to be assigned.. Please help me on how to go about it ... Thanks in advance.. EDIT: The user/player is not to be given any error code...


Solution

  • According to the principle that Seeking forgiveness is better than asking permission, I would do that with a simple try:except clause

    while True:
        r = raw_input('choose ')
        try:
            c = int(r)
        except ValueError:
                print 'Not valid.\n'
        else:
            break
            #This will be executed only if no exception is raised
    
    print c
    

    NOTE: the else: break will be executed only if no exception is raised. So if you input something different than an integer, an exception is raised, the else:break clause will not be executed, it does not break the loop and it will ask to insert again a number again. If you insert a number, then no exception is raised, 'else:break' WILL be executed and you exit the while loop, with your number still stored in the variable c