Restart game after showing end screen

Question:

I’m creating a simple tic-tac-toegame with a little bit of support from this page. I want to extend reset_game() to show the end screen for a few seconds and then reset the game. I do not understand how to handle time. time.sleep works when I want to wait 2 seconds before showing end screen, but it doesn’t work when I want to show end screen, and then reset game. Here’s my code:

def reset_game():

    global winner, draw, main_board, XO

    time.sleep(2)
    screen.fill((255, 255, 255))
    if winner:
        end_message = game_font.render(f"{winner} is the winner!", False, (0, 0, 0,))
        end_message_rect = end_message.get_rect(center = (width/2, (height/2)+50))
        screen.blit(end_message, end_message_rect)


    elif draw:
        end_message = game_font.render("Draw", False, (0, 0, 0,))
        end_message_rect = end_message.get_rect(center = (width/2, (height/2)+50))
        screen.blit(end_message, end_message_rect)

    winner = None
    draw = None
    XO = "X"
    main_board = [[None] * 3, [None] * 3, [None] * 3]
    game_initiating_window()
Asked By: Kamil Gryboś

||

Answers:

You’re going to want to put a time.sleep call before you reset the game:

def reset_game():

    global winner, draw, main_board, XO

    time.sleep(2)
    screen.fill((255, 255, 255))
    if winner:
        end_message = game_font.render(f"{winner} is the winner!", False, (0, 0, 0,))
        end_message_rect = end_message.get_rect(center = (width/2, (height/2)+50))
        screen.blit(end_message, end_message_rect)


    elif draw:
        end_message = game_font.render("Draw", False, (0, 0, 0,))
        end_message_rect = end_message.get_rect(center = (width/2, (height/2)+50))
        screen.blit(end_message, end_message_rect)

    time.sleep(3)
    winner = None
    draw = None
    XO = "X"
    main_board = [[None] * 3, [None] * 3, [None] * 3]
    game_initiating_window()
Answered By: pigrammer

First you have to blit() (to draw in buffer), later you have to update() or flip() (to send buffer to video card which will display it) and later sleep()

def reset_game():
    global winner, draw, main_board, XO

    # draw in buffer

    screen.fill((255, 255, 255))
    
    if winner:
        text = f"{winner} is the winner!"
    else:
        text = "Draw"
        
    end_message = game_font.render(text, False, (0, 0, 0,))
    end_message_rect = end_message.get_rect(center = (width/2, (height/2)+50))
    screen.blit(end_message, end_message_rect)

    # send buffer to video card - and it will display it on monitor

    pygame.display.flip()  

    # sleep
    
    time.sleep(2)

    # reset 

    winner = None
    draw = None
    XO = "X"
    main_board = [[None] * 3, [None] * 3, [None] * 3]
    game_initiating_window()
Answered By: furas
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.