Implemented hovering stones under mouse cursor, and implemented a simple game clock
This commit is contained in:
parent
cf1b892d21
commit
55dbed09f5
63
pygo.py
63
pygo.py
|
@ -8,7 +8,7 @@ import pygame
|
||||||
from pygame.locals import *
|
from pygame.locals import *
|
||||||
|
|
||||||
|
|
||||||
def load_png(name):
|
def load_png(name, alpha=None):
|
||||||
""" Load image and return image object"""
|
""" Load image and return image object"""
|
||||||
fullname = os.path.join('res', name)
|
fullname = os.path.join('res', name)
|
||||||
|
|
||||||
|
@ -19,6 +19,9 @@ def load_png(name):
|
||||||
else:
|
else:
|
||||||
image = image.convert_alpha()
|
image = image.convert_alpha()
|
||||||
|
|
||||||
|
if alpha is not None:
|
||||||
|
image.set_alpha(alpha)
|
||||||
|
|
||||||
except pygame.error, message:
|
except pygame.error, message:
|
||||||
print 'Cannot load image:', fullname
|
print 'Cannot load image:', fullname
|
||||||
raise SystemExit, message
|
raise SystemExit, message
|
||||||
|
@ -34,10 +37,12 @@ def build_img_res():
|
||||||
ret['w'] = load_png('go_w.png')
|
ret['w'] = load_png('go_w.png')
|
||||||
ret['wT'] = load_png('go_w.png')
|
ret['wT'] = load_png('go_w.png')
|
||||||
ret['wT'].blit(triangle, (0,0))
|
ret['wT'].blit(triangle, (0,0))
|
||||||
|
ret['wH'] = load_png('go_w.png', 128)
|
||||||
|
|
||||||
ret['b'] = load_png('go_b.png')
|
ret['b'] = load_png('go_b.png')
|
||||||
ret['bT'] = load_png('go_b.png')
|
ret['bT'] = load_png('go_b.png')
|
||||||
ret['bT'].blit(triangle, (0,0))
|
ret['bT'].blit(triangle, (0,0))
|
||||||
|
ret['bH'] = load_png('go_b.png', 128)
|
||||||
|
|
||||||
circle = load_png('go_c.png')
|
circle = load_png('go_c.png')
|
||||||
|
|
||||||
|
@ -122,8 +127,23 @@ class Goban:
|
||||||
self.captures = []
|
self.captures = []
|
||||||
self.captures.append(0)
|
self.captures.append(0)
|
||||||
self.captures.append(0)
|
self.captures.append(0)
|
||||||
|
self.hover = None
|
||||||
|
self.elapsed_time = 0
|
||||||
|
|
||||||
|
|
||||||
|
def set_hover(self, pos):
|
||||||
|
if not self._valid_move(pos):
|
||||||
|
self.clear_hover()
|
||||||
|
return
|
||||||
|
|
||||||
|
x,y = pos
|
||||||
|
self.hover = self.board[x][y]
|
||||||
|
|
||||||
|
|
||||||
|
def clear_hover(self):
|
||||||
|
self.hover = None
|
||||||
|
|
||||||
|
|
||||||
def place_stone(self, pos):
|
def place_stone(self, pos):
|
||||||
if not self._valid_move(pos):
|
if not self._valid_move(pos):
|
||||||
return
|
return
|
||||||
|
@ -176,7 +196,11 @@ class Goban:
|
||||||
|
|
||||||
kills_group = False
|
kills_group = False
|
||||||
for d in [(x, y+1), (x, y-1), (x+1, y), (x-1, y)]:
|
for d in [(x, y+1), (x, y-1), (x+1, y), (x-1, y)]:
|
||||||
if not self._has_liberties(d, opponent):
|
new_x, new_y = d
|
||||||
|
if new_x < 0 or new_x > 18 or new_y < 0 or new_y > 18:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if self._has_liberties(d, opponent) == 0:
|
||||||
kills_group = True
|
kills_group = True
|
||||||
break
|
break
|
||||||
self._clear_checks()
|
self._clear_checks()
|
||||||
|
@ -274,12 +298,21 @@ class Goban:
|
||||||
for row in self.board:
|
for row in self.board:
|
||||||
j = 0
|
j = 0
|
||||||
for square in row:
|
for square in row:
|
||||||
s = pygame.transform.scale(img_res[square.get_draw_code()], (inc, inc))
|
s = img_res[square.get_draw_code()]
|
||||||
|
s = pygame.transform.scale(s, (inc, inc))
|
||||||
ret.blit(s, (j*inc,i*inc))
|
ret.blit(s, (j*inc,i*inc))
|
||||||
|
|
||||||
|
if self.hover == square:
|
||||||
|
c = img_res['bH']
|
||||||
|
if self.turn == 1:
|
||||||
|
c = img_res['wH']
|
||||||
|
c = pygame.transform.scale(c, (inc, inc))
|
||||||
|
ret.blit(c, (j*inc,i*inc))
|
||||||
|
|
||||||
j += 1
|
j += 1
|
||||||
i += 1
|
i += 1
|
||||||
|
|
||||||
return ret.convert()
|
return ret.convert_alpha()
|
||||||
|
|
||||||
|
|
||||||
def draw_info(self):
|
def draw_info(self):
|
||||||
|
@ -288,6 +321,7 @@ class Goban:
|
||||||
textbox.fill((250, 250, 250))
|
textbox.fill((250, 250, 250))
|
||||||
|
|
||||||
font = pygame.font.Font(None, 24)
|
font = pygame.font.Font(None, 24)
|
||||||
|
time = font.render('Time: {:02d}:{:02d}'.format(self.elapsed_time / 60, self.elapsed_time % 60), 1, (10, 10, 10))
|
||||||
heading = font.render('Captures', 1, (10, 10, 10))
|
heading = font.render('Captures', 1, (10, 10, 10))
|
||||||
black_cap = font.render('Black: {}'.format(self.captures[0]), 1, (10, 10, 10))
|
black_cap = font.render('Black: {}'.format(self.captures[0]), 1, (10, 10, 10))
|
||||||
white_cap = font.render('White: {}'.format(self.captures[1]), 1, (10, 10, 10))
|
white_cap = font.render('White: {}'.format(self.captures[1]), 1, (10, 10, 10))
|
||||||
|
@ -297,6 +331,7 @@ class Goban:
|
||||||
textbox.blit(black_cap, (0, 28))
|
textbox.blit(black_cap, (0, 28))
|
||||||
textbox.blit(white_cap, (0, 56))
|
textbox.blit(white_cap, (0, 56))
|
||||||
textbox.blit(turn, (0, 100))
|
textbox.blit(turn, (0, 100))
|
||||||
|
textbox.blit(time, (0, 150))
|
||||||
|
|
||||||
return textbox
|
return textbox
|
||||||
|
|
||||||
|
@ -330,11 +365,27 @@ def main():
|
||||||
screen.blit(background, (0, 0))
|
screen.blit(background, (0, 0))
|
||||||
pygame.display.flip()
|
pygame.display.flip()
|
||||||
|
|
||||||
|
pygame.time.set_timer(USEREVENT, 1000)
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
event = pygame.event.wait()
|
event = pygame.event.wait()
|
||||||
|
|
||||||
if event.type == QUIT:
|
if event.type == QUIT:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
# Hover a transparent stone over our
|
||||||
|
# cursor position, assuming play is legal
|
||||||
|
if event.type == MOUSEMOTION:
|
||||||
|
x, y = event.pos
|
||||||
|
row = y / board_inc
|
||||||
|
col = x / board_inc
|
||||||
|
|
||||||
|
if x <= board_size:
|
||||||
|
goban.set_hover((row,col))
|
||||||
|
else:
|
||||||
|
goban.clear_hover()
|
||||||
|
|
||||||
|
# Place a stone on left-click
|
||||||
if event.type == MOUSEBUTTONDOWN:
|
if event.type == MOUSEBUTTONDOWN:
|
||||||
x, y = event.pos
|
x, y = event.pos
|
||||||
row = y / board_inc
|
row = y / board_inc
|
||||||
|
@ -343,8 +394,12 @@ def main():
|
||||||
if x <= board_size:
|
if x <= board_size:
|
||||||
if event.button == 1:
|
if event.button == 1:
|
||||||
goban.place_stone((row, col))
|
goban.place_stone((row, col))
|
||||||
|
|
||||||
if event.button == 3:
|
if event.button == 3:
|
||||||
goban.toggle_marked((row, col))
|
goban.toggle_marked((row, col))
|
||||||
|
|
||||||
|
if event.type == USEREVENT:
|
||||||
|
goban.elapsed_time += 1
|
||||||
|
|
||||||
board = goban.draw_board(board_size, img_res)
|
board = goban.draw_board(board_size, img_res)
|
||||||
background.blit(board, (0,0))
|
background.blit(board, (0,0))
|
||||||
|
|
Loading…
Reference in New Issue
Block a user