Posts: 26
Threads: 13
Joined: Dec 2017
import pygame, random
class Player:
def __init__(self):
self.speed = 5
self.tick = 0
self.interval = 30
self.rect = pygame.rect.Rect((50, 50, 70, 70))
self.x_image = pygame.image.load("player_x.png").convert_alpha()
self.o_image = pygame.image.load("player_y.png").convert_alpha()
self.one_pos = (85, 205)
self.two_pos = (410, 205)
self.three_pos = (750, 205)
self.four_pos = (80, 430)
self.five_pos = (410, 430)
self.six_pos = (755, 430)
self.seven_pos = (80, 650)
self.eight_pos = (425, 650)
self.nine_pos = (750, 650)
class Scene:
def __init__(self, game):
self.game = game
self.background = pygame.image.load("background.png")
self.player = Player()
def draw(self, surface):
surface.blit(self.background, (0, 0))
pygame.draw.rect(surface, (0, 0, 255), self.player.rect)
def event(self, event):
pass
def update(self, ticks):
if ticks > self.player.tick:
self.player.tick += self.player.interval
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
self.player.rect.move_ip(-5, 0)
print(self.player.rect)
elif keys[pygame.K_RIGHT]:
self.player.rect.move_ip(5, 0)
print(self.player.rect)
elif keys[pygame.K_UP]:
self.player.rect.move_ip(0, -5)
print(self.player.rect)
elif keys[pygame.K_DOWN]:
self.player.rect.move_ip(0, 5)
print(self.player.rect)
class Game:
def __init__(self, caption, width, height):
pygame.display.set_caption(caption)
self.rect = pygame.Rect(0, 0, width, height)
self.surface = pygame.display.set_mode(self.rect.size)
self.clock = pygame.time.Clock()
self.running = True
self.scene = Scene(self)
def mainloop(self):
while self.running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.running = False
else:
self.scene.event(event)
self.scene.update(pygame.time.get_ticks())
self.scene.draw(self.surface)
pygame.display.flip()
self.clock.tick(30)
if __name__ == "__main__":
pygame.init()
game = Game("Tic Tac Toe", 900, 900)
game.mainloop() I'm having trouble setting up the turn system (x goes then o). Any help or tips are appreciated :).
Posts: 3,458
Threads: 101
Joined: Sep 2016
The scene should maybe have a list of players, instead of just one, along with an index for which player's turn it currently is. And once a player's turn is complete, you move onto the next with something like self.current_player = (self.current_player + 1) % len(self.players)
Posts: 544
Threads: 15
Joined: Oct 2016
Created an example how you could improve some code.
import pygame
import random
class TicTacToe:
def __init__(self, game):
self.game = game
#self.background = pygame.image.load("background.png")
self.background = pygame.Surface(game.rect.size)
self.background.fill(pygame.Color('Black'))
#self.images = {
# 'x':pygame.image.load("player_x.png").convert_alpha(),
# 'y':pygame.image.load("player_o.png").convert_alpha() }
font = pygame.font.Font(None, 72)
self.images = {
'x': font.render('X', 1, pygame.Color('Blue')),
'o': font.render('O', 1, pygame.Color('Green')) }
self.turn = random.choice(['x', 'o'])
self.build_rects()
self.new_game()
def new_game(self):
self.board = [None for x in range(9)]
def build_rects(self):
self.rects = []
center = self.game.rect.center
rect = self.images['x'].get_rect()
width = rect.width * 2
height = rect.height * 2
x_pos = center[0] - rect.width * 3
y_pos = center[1] - rect.height * 3
x_end = x_pos + width * 3
y_end = y_pos + height * 3
for x in range(x_pos, x_end, width):
for y in range(y_pos, y_end, height):
self.rects.append(pygame.Rect(x, y, width, height))
def draw(self, surface):
surface.blit(self.background, (0, 0))
for rect in self.rects:
pygame.draw.rect(surface, (255, 255, 255), rect, 1)
for enum, play in enumerate(self.board):
if play:
rect = self.images[play].get_rect()
rect.center = self.rects[enum].center
surface.blit(self.images[play], rect)
def event(self, event):
if event.type == pygame.QUIT:
self.game.running = False
elif event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1:
for enum, rect in enumerate(self.rects):
if rect.collidepoint(event.pos):
if self.board[enum] is None:
self.board[enum] = self.turn
if self.turn == 'x':
self.turn = 'o'
else:
self.turn = 'x'
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
self.new_game()
class Game:
def __init__(self, caption, width, height):
pygame.display.set_caption(caption)
self.rect = pygame.Rect(0, 0, width, height)
self.surface = pygame.display.set_mode(self.rect.size)
self.clock = pygame.time.Clock()
self.running = True
self.scene = None
def mainloop(self):
while self.running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.running = False
else:
self.scene.event(event)
#self.scene.update(pygame.time.get_ticks())
self.scene.draw(self.surface)
pygame.display.flip()
self.clock.tick(30)
if __name__ == "__main__":
pygame.init()
game = Game("Tic Tac Toe", 800, 600)
game.scene = TicTacToe(game)
game.mainloop()
99 percent of computer problems exists between chair and keyboard.
|