Прием номеров от 1-9 крестики-нолики

Вот игра TIC TAC TOE, которую я создал с помощью 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):
    while True:
        os.system('cls')
        viewgrid(grid)
        print name1, ", Please enter your choice from the grid above : ",
        place = raw_input()
        try:
            place = int(place)
        except ValueError:
            print "",
        else:
            break
            #This will be executed only if no exception is raised
    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):
    while True:
        os.system('cls')
        viewgrid(grid)
        print name2, ", Please enter your choice from the grid above : ",
        place = raw_input()
        try:
            place = int(place)
        except ValueError:
            print "",
        else:
            break
            #This will be executed only if no exception is raised
    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()

Проблема, с которой я столкнулся сейчас, заключается в том, что в player11 и player12 программа может принимать ввод> 9 или ‹1 и снова запрашивает ввод... Но сразу после этого, когда предоставляется правильный ввод... Ничего не происходит. .. Любая помощь приветствуется :) ..


person Kunal Gupta    schedule 03.05.2013    source источник


Ответы (1)


Вы путаете задание = и проверку на равенство ==. Итак, у вас есть строки:

if place == 0:
        while place==0:
            place == player11(name1,grid)

(аналогично для другого играемого) и вам нужно, чтобы третий начал place =, а не place ==.

person borrible    schedule 03.05.2013
comment
Для этого не нужно ставить if place == 0:. Оператор while, в отличие от оператора do в других языках (C++, Objective C), не должен повторяться ни разу. Все, что вам нужно, это while place == 0: place = player11(name1, grid) - person erdekhayser; 03.05.2013
comment
Согласен, но, хотя это и не нужно, это не ошибка, в отличие от перепутанных = и ==. Я специально ограничил ответ указанием на ошибку в коде OP. - person borrible; 03.05.2013
comment
На мой взгляд, любой шанс сделать программиста более осведомленным о некоторых дополнительных шагах может оказаться полезным для него (или для нее) в будущем. Лучше помочь больше, чем меньше! - person erdekhayser; 04.05.2013
comment
В конце концов я понял это ... Просто некоторая усталость, которая, возможно, вызвала это: P В любом случае спасибо :) - person Kunal Gupta; 05.05.2013