Reputation: 65
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
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