Pygame TikTacToe Player Winning Problem How To Fix?

Viewed 64

I am making a tiktactoe and I have a problem with my player winning like the game even tho I dont get 3 in a row and I just get VIDEO << I didnt event get 3 in a row it just won the game for player 2

my buttons position

                   
white = (250,250,250)
greenbutton2 = button((0,255,0),190,215,100,100, '2')

greenbutton3 = button((0,255,0),335,215,100,100, '3')

greenbutton4 = button((0,255,0),71,215,100,100, '4')

greenbutton5 = button((0,255,0),71,350,100,100, '5')

greenbutton6 = button((0,255,0),190,350,100,100, '6')

greenbutton7 = button((0,255,0),335,350,100,100, '7')


greenbutton8 = button((0,255,0),70,90,100,100, '8')

greenbutton9 = button((0,255,0),190,90,100,100, '9')

greenbutton10 = button((0,255,0),335,90,100,100, '10')

greenbutton4 = button((0,255,0),71,215,100,100, '4')

what I did for example for the first one is 215,215,215 if my partics are over those it should blit the winning image but it blits another image IMAGE but its not blitting the correct image instead its blitting this VIDEO << its the same for all of them it keeps blitting the wrong images and sometimes even though I dont get 3 in a row for the X player or the O enemy it will say I win is there a way I could fix this?

this is for my X player

    # player 2 winning for the rows part
    count = sum([1 if partic.y in [215, 215, 215] else 0 for partic in partics])
    if count == 3:
        lines.append(line(0,0,0,0,white))



    count = sum([1 if partic.y in [90, 90, 90] else 0 for partic in partics])
    if count == 3:
        lines.append(lin(0,0,0,0,white))
   

    count = sum([1 if partic.y in [350, 350, 350] else 0 for partic in partics])
    if count == 3:
        lines.append(liner(0,0,0,0,white))



    count = sum([1 if partic.x in [335, 335, 335] else 0 for partic in partics])
    if count == 3:
        lines.append(low(0,0,0,0,white))


    count = sum([1 if partic.x in [190, 190, 190] else 0 for partic in partics])
    if count == 3:
        lines.append(lowe(0,0,0,0,white))


    count = sum([1 if partic.x in [71, 71, 70] else 0 for partic in partics])
    if count == 3:
        lines.append(lower(0,0,0,0,white))


    count = sum([1 if partic.y in [90, 215, 350] else 0 for partic in partics])
    if count == 3:
        lines.append(win(0,0,0,0,white))

    count = sum([1 if partic.x in [335, 71, 190] else 0 for partic in partics])
    if count == 3:
        lines.append(winner(0,0,0,0,white))




and this is for my O player

    # player 1 winning for the rows part
    count = sum([1 if parti.y in [215, 215, 215] else 0 for parti in parts])
    if count == 3:
        lines.append(line(0,0,0,0,white))



    count = sum([1 if parti.y in [90, 90, 90] else 0 for parti in parts])
    if count == 3:
        lines.append(lin(0,0,0,0,white))
   

    count = sum([1 if parti.y in [350, 350, 350] else 0 for parti in parts])
    if count == 3:
        lines.append(liner(0,0,0,0,white))



    count = sum([1 if parti.x in [335, 335, 335] else 0 for parti in parts])
    if count == 3:
        lines.append(low(0,0,0,0,white))


    count = sum([1 if parti.x in [190, 190, 190] else 0 for parti in parts])
    if count == 3:
        lines.append(lowe(0,0,0,0,white))


    count = sum([1 if parti.x in [71, 71, 70] else 0 for parti in parts])
    if count == 3:
        lines.append(lower(0,0,0,0,white))


    count = sum([1 if parti.y in [90, 215, 350] else 0 for parti in parts])
    if count == 3:
        lines.append(win(0,0,0,0,white))

    count = sum([1 if parti.x in [335, 71, 190] else 0 for parti in parts])
    if count == 3:
        lines.append(winner(0,0,0,0,white))

my full code pastebin

1 Answers

My suggestion is to simply use the status of a .result in your button() class.

class button():
    def __init__(self, color, x,y,width,height, text=''):
        # ...
        self.result = ''    # empty

    def getResult( self ):
        return self.result

    def setResult( self, value ):
        self.result = value

    def reset( self ):
        self.result = ''   # back to empty state

Then when you create a Parti or Partic, tell the button to remember the result:

if score == 2:
    if greenbutton4.isOver(pos):
        greenbutton4.setResult( 'x' )
        partics.append(Partic(71,215,100,100,white))

#  ... 

if score == 3:
    if greenbutton4.isOver(pos):
        greenbutton4.setResult( 'o' )
        parts.append(Parti(71,215,100,100,white))

There are only 8 ways to win at tic-tac-toe / noughts-and-crosses: 3x horizontal, 3x vertical, and 2x diagonals. This is a fairly simple check:

def winner( b1, b2, b3, b4, b5, b6, b7, b8, b8 ):
    """ Given the buttons 1-9 in order from top-left to bottom right
        return whether 'x' or 'o' has won the game, or None and which
        line/row/vertical the win was made on """
    winner = ( None, None )
    # make a grid of the board-state for iteration
    board = [ [ b1.getResult(), b2.getResult(), b3.getResult() ],
              [ b4.getResult(), b5.getResult(), b6.getResult() ],
              [ b7.getResult(), b8.getResult(), b9.getResult() ] ]

    # EDIT: some debug code
    print( "BOARD IS: ")
    print( " %3s | %3s | %3s " % ( b1.getResult(), b2.getResult(), b3.getResult() ) )
    print( "-----+-----+-----" )
    print( " %3s | %3s | %3s " % ( b4.getResult(), b5.getResult(), b6.getResult() ) )
    print( "-----+-----+-----" )
    print( " %3s | %3s | %3s " % ( b7.getResult(), b8.getResult(), b9.getResult() ) )
    print( "" )


    # check the horizontals
    for row in range( 3 ):
        if ( board[row][0] != '' and
             board[row][0] == board[row][1] and board[row][0] == board[row][2] ):
            winner = ( board[row][0], 'h'+str( row ) )
            break
    # check the verticals
    for col in range( 3 ):
        if ( board[0][col] != '' and
             board[0][col] == board[1][col] and board[0][col] == board[2][col] ):
            winner = ( board[col][0], 'v'+str( col ) )
            break
    # diagonals
    if ( board[1][1] != '' ):
        if ( board[0][0] == board[1][1] and board[2][2] == board[1][1] ):
            winner = ( board[1][1], 'd1' )
        elif ( board[0][2] == board[1][1] and board[2][0] == board[1][1] ):
            winner = ( board[1][1], 'd2' )
    return winner

The code seems to create the buttons with button2 at the centre (based on the video), so the call to this function would be something like:

player_wins, row = winner( greenbutton8,  greenbutton9,  greenbutton10,   
                           greenbutton4,  greenbutton2,  greenbutton3,  
                           greenbutton5,  greenbutton6,  greenbutton7 )
if ( player_wins != None ):
    print( "Player "+ player_wins + " has won on " + row )
Related