Noah Leuthold
Noah Leuthold

Reputation: 65

How do I get the score to change in the game in Pygame?

I'm trying to make a Tic-Tac-Toe game in PyGame, but I can't get the score to change when a player gets three 'x's in a row. Whenever I run the code, the game starts, I can place 'x's and 'o's, I can clear the board, and close the window, but even if there is a winner, the score doesn't change. I want each "three in a row" to count as a point. I want the points counted, and when a player has five points, they win the whole game. I tried printing the score to the terminal, but those numbers are messed up after one win, but that shouldn't be a problem if you clear the board between rounds. I'm not getting any errors either, so I don't know where to start. I Googled how to fix this, but nothing made sense or fit this situation.

I don't have anything checking for whether or not the 'o's have won, but I'll just copy/paste the part with the 'x's and change a few things so it works for the 'o's as well.

I don't know what is wrong, so here is all of my code:

import pygame
import os
import sys
from pygame.locals import *
pygame.init()

WIDTH, HEIGHT = 500, 500
P_WIDTH, P_HEIGHT = 79, 80
WIN = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Tic-Tac-Toe")

main_font = pygame.font.SysFont("Comic sans", 40)
X_WINS = 0
O_WINS = 0
TIES = 0

BG = pygame.transform.scale(pygame.image.load(os.path.join("Board3.jpg")).convert_alpha(), (WIDTH, HEIGHT))
title_label1 = main_font.render("Tic-Tac-Toe", True, (0, 0, 0))
Player_1 = pygame.transform.scale(pygame.image.load(os.path.join("X.png")).convert_alpha(), (P_WIDTH, P_HEIGHT))
Player_2 = pygame.transform.scale(pygame.image.load(os.path.join("O.png")).convert_alpha(), (P_WIDTH, P_HEIGHT))
X_WINS_LABEL = main_font.render(f"X = {X_WINS}", True, (0, 0, 0))
O_WINS_LABEL = main_font.render(f"O = {O_WINS}", True, (0, 0, 0))
TIES_LABEL = main_font.render(f"Ties = {TIES}", True, (0, 0, 0))
X_WON_LABEL = main_font.render("WINNER: X", True, (0, 0, 0))
O_WON_LABEL = main_font.render("WINNER: O", True, (0, 0, 0))

board_state = [[None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None],
                [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None],
                [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None],
                [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None],
                [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None],
                [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None],
                [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None],
                [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None],
                [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None],
                [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None],
                [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None],
                [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None],
                [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None],
                [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None],
                [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None],
                [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None],
                [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None],
                [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None],
                [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None],
                [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None],
                [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None],
                [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None],
                [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None],
                [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None],
                [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None],
                [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None],
                [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None],
                [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None],
                [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None],
                [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None],
                [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None], ]


def redraw_window():
    global Player_1
    global board_state
    global TIES
    global X_WINS
    global X_WINS_LABEL
    global O_WINS_LABEL
    global TIES_LABEL

    WIN.blit(BG, (0, 0))
    WIN.blit(title_label1, (175, 20))
    WIN.blit(X_WINS_LABEL, (100, 450))
    WIN.blit(O_WINS_LABEL, (350, 450))
    WIN.blit(TIES_LABEL, (205, 450))

    y_cursor = 0
    for row in (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30):
        x_cursor = 0
        for col in (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30):
            if board_state[row][col] == 'x':
                WIN.blit(Player_1, (x_cursor, y_cursor))
            elif board_state[row][col] == 'o':
                WIN.blit(Player_2, (x_cursor, y_cursor))
            x_cursor += WIDTH // 31  # move the cursor across
        y_cursor += HEIGHT // 31  # move the cursor down

    pygame.display.update()


def main():

    while True:
        global X_WINS
        global O_WINS
        global TIES

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                exit(0)
            elif event.type == pygame.locals.KEYDOWN:

                # Place an "X"
                if event.key == K_1:
                    board_state[7][7] = 'x'
                if event.key == K_2:
                    board_state[7][13] = 'x'
                if event.key == K_3:
                    board_state[7][19] = 'x'
                if event.key == K_4:
                    board_state[13][7] = 'x'
                if event.key == K_5:
                    board_state[13][13] = 'x'
                if event.key == K_6:
                    board_state[13][19] = 'x'
                if event.key == K_7:
                    board_state[19][7] = 'x'
                if event.key == K_8:
                    board_state[19][13] = 'x'
                if event.key == K_9:
                    board_state[19][19] = 'x'

                # Place an "O"
                if event.key == K_q:
                    board_state[7][7] = 'o'
                if event.key == K_w:
                    board_state[7][13] = 'o'
                if event.key == K_e:
                    board_state[7][19] = 'o'
                if event.key == K_a:
                    board_state[13][7] = 'o'
                if event.key == K_s:
                    board_state[13][13] = 'o'
                if event.key == K_d:
                    board_state[13][19] = 'o'
                if event.key == K_z:
                    board_state[19][7] = 'o'
                if event.key == K_x:
                    board_state[19][13] = 'o'
                if event.key == K_c:
                    board_state[19][19] = 'o'

                # Check for wins
                if board_state[7][7] == 'x' and board_state[7][13] == 'x' and board_state[7][19] == 'x':
                    X_WINS += 1
                if board_state[13][7] == 'x' and board_state[13][13] == 'x' and board_state[13][19] == 'x':
                    X_WINS += 1
                if board_state[19][7] == 'x' and board_state[19][13] == 'x' and board_state[19][19] == 'x':
                    X_WINS += 1
                if board_state[7][7] == 'x' and board_state[13][7] == 'x' and board_state[19][7] == 'x':
                    X_WINS += 1
                if board_state[7][13] == 'x' and board_state[13][13] == 'x' and board_state[19][13] == 'x':
                    X_WINS += 1
                if board_state[7][19] == 'x' and board_state[13][19] == 'x' and board_state[19][19] == 'x':
                    X_WINS += 1
                if board_state[7][7] == 'x' and board_state[13][13] == 'x' and board_state[19][19] == 'x':
                    X_WINS += 1
                if board_state[19][7] == 'x' and board_state[13][13] == 'x' and board_state[7][19] == 'x':
                    X_WINS += 1

                # Winning the game
                if X_WINS >= 5:
                    WIN.blit(X_WON_LABEL, (190, 175))
                if O_WINS >= 5:
                    WIN.blit(O_WON_LABEL, (190, 175))

                # Clear the board
                if event.key == K_BACKSPACE:
                    board_state[7][7], board_state[7][13], board_state[7][19], board_state[13][7], board_state[13][13], board_state[13][19], board_state[19][7], board_state[19][13], board_state[19][19] = 'none', 'none', 'none', 'none', 'none', 'none', 'none', 'none', 'none'

                # Clear the score
                if event.key == K_DELETE:
                    X_WINS, O_WINS, TIES = 0, 0, 0
        redraw_window()


main()

Upvotes: 1

Views: 117

Answers (1)

Ryan Jenkins
Ryan Jenkins

Reputation: 890

You need to update X_WINS_LABEL when the value of X_WINS changes, e.g.

X_WINS += 1
X_WINS_LABEL = main_font.render(f"X = {X_WINS}", True, (0, 0, 0))

As it is, X_WINS_LABEL is initialized with a value but never changed, updating X_WINS will not cause X_WINS_LABEL to update on its own.

You could also get rid of the X_WINS_LABEL var all together by generating the message when redrawing:

WIN.blit(main_font.render(f"X = {X_WINS}", True, (0, 0, 0)), (100, 450))

This would be a little cleaner in that you don't have to manage the win count and the label independently, but you will be calling main_font.render more frequently. Depending on how expensive rendering a message is, this may or may not be a worthwhile tradeoff.

Upvotes: 2

Related Questions