Turns are now functioning

This commit is contained in:
Alexander Munch-Hansen 2018-04-14 18:47:38 +02:00
parent 7764a70799
commit 7993da0db7
2 changed files with 381 additions and 280 deletions

View File

@ -2,306 +2,406 @@
# TODO: An issue with the bouncing back things. It appears to do the move and then # TODO: An issue with the bouncing back things. It appears to do the move and then
# it doesn't properly restore the buckets to where they should be. # it doesn't properly restore the buckets to where they should be.
import random
import pygame import pygame
import threading
from board import Board from board import Board
import numpy as np import numpy as np
import time
# --- constants --- (UPPER_CASE names) # --- constants --- (UPPER_CASE names)
SCREEN_WIDTH = 1050
SCREEN_HEIGHT = 400
SPACING = 83.333
#BLACK = ( 0, 0, 0) class Board_painter:
#242 209 107
SAND = (242, 209, 107)
GREEN_FILT = (0,102,0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
SALMON = (250,128,114)
BLACK = (0,0,0)
BROWN = (160,82,45)
LIGHT_GREY = (220,220,220)
num_pieces = 15
FPS = 30
cen = SPACING/2 - 11
t = 5*SPACING - cen-22
m = 7*SPACING+50 - cen-22
STARTING_IDX_P1 = [[cen,0], [cen, 30], [cen, 60], [cen, 90], [cen,120], [SCREEN_WIDTH-cen-22, 0], [SCREEN_WIDTH-cen-22, 30], [t, 378],[t,348],[t,318],[m, 378], [m,348],[m,318],[m,288],[m,258]]
STARTING_IDX_P2 = [[cen, 378], [cen, 348], [cen, 318], [cen, 288], [cen, 258], [SCREEN_WIDTH-cen-22, 378], [SCREEN_WIDTH-cen-22, 348], [t, 0], [t, 30], [t, 60], [m, 0], [m,30],[m,60],[m,90],[m,120]] def __init__(self):
self.SCREEN_WIDTH = 1050
self.SCREEN_HEIGHT = 400
self.SPACING = 83.333
# --- classses --- (CamelCase names) #BLACK = ( 0, 0, 0)
#242 209 107
# empty self.SAND = (242, 209, 107)
self.GREEN_FILT = (0,102,0)
# --- functions --- (lower_case names) self.WHITE = (255, 255, 255)
self.RED = (255, 0, 0)
# empty self.SALMON = (250,128,114)
self.BLACK = (0,0,0)
# --- main --- self.BROWN = (160,82,45)
self.LIGHT_GREY = (220,220,220)
# - init - self.num_pieces = 15
self.FPS = 999
pygame.init() cen = self.SPACING/2 - 11
t = 5*self.SPACING - cen-22
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) m = 7*self.SPACING+50 - cen-22
#screen_rect = screen.get_rect() self.STARTING_IDX_P1 = [[cen,0], [cen, 30], [cen, 60], [cen, 90], [cen,120], [self.SCREEN_WIDTH-cen-22, 0], [self.SCREEN_WIDTH-cen-22, 30], [t, 378],[t,348],[t,318],[m, 378], [m,348],[m,318],[m,288],[m,258]]
pygame.display.set_caption("Backgammon")
# - objects -
all_rects = {-1 : [], 1 : []}
x, y = [0, 0]
for p in [-1,1]:
if p == -1:
for idx in STARTING_IDX_P1:
all_rects[p] += [pygame.rect.Rect(idx[0],idx[1], 22, 22)]
if p == 1:
for idx in STARTING_IDX_P2:
all_rects[p] += [pygame.rect.Rect(idx[0],idx[1], 22, 22)]
# for i in range(num_pieces):
# x = x+20
# all_rects[p] += [pygame.rect.Rect(x,y, 22, 22)]
# x = 100
# y += 100
all_drag = {-1 : [], 1 : []}
all_drag[-1] += [False]*num_pieces
all_drag[1] += [False]*num_pieces
all_off = {-1 : [], 1 : []}
all_off[-1] += [[0,0]]*num_pieces
all_off[1] += [[0,0]]*num_pieces
is_true = False
# - mainloop -
clock = pygame.time.Clock()
buckets = [[5,-1],[0,0],[0,0],[0,0],[3,1],[0,0],[5,1],[0,0],[0,0],[0,0],[0,0],[2,-1],[5,1],[0,0],[0,0],[0,0],[3,-1],[0,0],[5,-1],[0,0],[0,0],[0,0],[0,0],[2,1]]
running = True
player = 1
roll = []
def switch_player(roll):
roll = roll
player *= -1
def gen_buckets_from_board(board):
meh = []
for i in range(13,25):
pin = board[i]
print(pin)
meh.append([abs(pin), np.sign(pin)])
for i in range(1,13):
pin = board[i]
meh.append([abs(pin), np.sign(pin)])
return meh self.STARTING_IDX_P2 = [[cen, 378], [cen, 348], [cen, 318], [cen, 288], [cen, 258], [self.SCREEN_WIDTH-cen-22, 378], [self.SCREEN_WIDTH-cen-22, 348], [t, 0], [t, 30], [t, 60], [m, 0], [m,30],[m,60],[m,90],[m,120]]
pygame.init()
self.screen = pygame.display.set_mode((self.SCREEN_WIDTH, self.SCREEN_HEIGHT))
#screen_rect = screen.get_rect()
def gen_board_from_buckets(buckets): pygame.display.set_caption("Backgammon")
board = []
board.append([0,0])
for i in range(-1,-13,-1):
board.append(buckets[i])
for i in range(0,12):
board.append(buckets[i])
board.append([0,0])
board = [x*y for x,y in board]
return board
def move_legal(from_board, buckets, roll):
board = gen_board_from_buckets(buckets)
legal_states = Board.calculate_legal_states(from_board, 1, roll)
# print(legal_states)
if board in [list(state) for state in list(legal_states)]:
return True
return False
def find_pin(pos):
x,y = pos
x -= 50 if x > 550 else 0
if y < 175:
pin = (13 + int(x / SPACING))
idx = int(x / SPACING)
elif y > 225:
pin = (12 - int(x / SPACING))
idx = 12+ int(x / SPACING)
return pin, idx
# Find the y position based on the chosen pin
def calc_pos(buckets, chosen):
amount = buckets[chosen][0]
# My math is incredibly off
if chosen > 11:
print("Amount at pin:", amount)
y = 378 - (30 * amount)
chosen -= 11
x = (SPACING*(chosen-1))+(SPACING/2)
x += 50 if x > 500 else 0
else:
chosen += 1
y = 30 * amount
x = (SPACING*(chosen-1))+(SPACING/2)
x += 50 if x > 500 else 0
return x,y self.all_rects = {-1 : [], 1 : []}
from_board = None
from_buckets = [x for x in buckets]
from_locat = None
while running:
# - events -
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1:
rectangles = all_rects[player]
offsets = all_off[player]
meh = [rect.collidepoint(event.pos) for rect in rectangles]
if any(meh):
is_true = np.where(meh)[0][0]
if any(meh):
print("GETTING CALLED")
rectangles_drag[is_true] = True
mouse_x, mouse_y = event.pos
# Need this to be a deepcopy :<
from_buckets = []
for x in buckets:
tmp = []
for y in x:
tmp.append(y)
from_buckets.append(tmp)
from_board = [x for x in gen_board_from_buckets(buckets)]
# print("From board in mousedown:", from_board)
pin, idx = find_pin(event.pos)
from_pin = pin
buckets[idx][0] -= 1
if buckets[idx][0] == 0:
buckets[idx][1] = 0
offsets[is_true][0] = rectangles[is_true].x - mouse_x
offsets[is_true][1] = rectangles[is_true].y - mouse_y
from_locat = [rectangles[is_true].x, rectangles[is_true].y]
elif event.type == pygame.MOUSEBUTTONUP:
if event.button == 1:
meh = [rect.collidepoint(event.pos) for rect in rectangles]
if any(meh):
is_true = np.where(meh)[0][0]
pin, idx = find_pin(event.pos)
x, y = calc_pos(buckets,idx)
buckets[idx][0] += 1
buckets[idx][1] = player
print(from_board)
print("To :",gen_board_from_buckets(buckets))
# print(move_legal(from_board, buckets, [1,2]))
if move_legal(from_board, buckets, [1,0]):
print("From:",gen_board_from_buckets(from_buckets))
print("WOHO!"*10)
rectangles_drag = all_drag[player]
rectangles_drag[is_true] = False
rectangles[is_true].x = x
rectangles[is_true].y = y
else:
print("From:",gen_board_from_buckets(from_buckets))
buckets = [x for x in from_buckets]
rectangles_drag = all_drag[player]
rectangles_drag[is_true] = False
rectangles[is_true].x = from_locat[0]
rectangles[is_true].y = from_locat[1]
print("End :",gen_board_from_buckets(buckets))
elif event.type == pygame.MOUSEMOTION:
rectangles_drag = all_drag[player]
rectangles = all_rects[player]
offsets = all_off[player]
if any(rectangles_drag):
is_true = np.where(rectangles_drag)[0][0]
mouse_x, mouse_y = event.pos
rectangles[is_true].x = mouse_x + offsets[is_true][0]
rectangles[is_true].y = mouse_y + offsets[is_true][1]
screen.fill(GREEN_FILT)
# pygame.draw.polygon(screen, (RED), [[0, 0], [50,0],[25,100]], 2)
color = LIGHT_GREY
x = 0
y = 150
# for _ in range(2):
for i in range(12):
if x < 500 and x+SPACING > 500:
x = 550
color = SALMON if color == LIGHT_GREY else LIGHT_GREY
pygame.draw.polygon(screen, color, [[x, 0], [x+SPACING, 0], [(2*x+SPACING)/2, y]])
x += SPACING
# y += 50
x = 0
y = 250
# for _ in range(2):
color = SALMON if color == LIGHT_GREY else LIGHT_GREY
for i in range(12):
if x < 500 and x+SPACING > 500:
x = 550
color = SALMON if color == LIGHT_GREY else LIGHT_GREY
pygame.draw.polygon(screen, color, [[x, 400], [x+SPACING, 400], [(2*x+SPACING)/2, y]])
x += SPACING
# print(gen_board_from_buckets(buckets))
pygame.draw.rect(screen, BROWN, pygame.rect.Rect((500, 0, 50, 400)))
for p in [-1,1]: for p in [-1,1]:
for rect in all_rects[p]: if p == -1:
for idx in self.STARTING_IDX_P1:
self.all_rects[p] += [pygame.rect.Rect(idx[0],idx[1], 22, 22)]
pygame.draw.rect(screen, RED if p == -1 else BLACK, rect) if p == 1:
for idx in self.STARTING_IDX_P2:
self.all_rects[p] += [pygame.rect.Rect(idx[0],idx[1], 22, 22)]
# for i in range(num_pieces):
# x = x+20
# all_rects[p] += [pygame.rect.Rect(x,y, 22, 22)]
# x = 100
# y += 100
pygame.display.flip()
# - constant game speed / FPS -
clock.tick(FPS) self.all_drag = {-1 : [], 1 : []}
self.all_drag[-1] += [False]*self.num_pieces
self.all_drag[1] += [False]*self.num_pieces
self.all_off = {-1 : [], 1 : []}
self.all_off[-1] += [[0,0]]*self.num_pieces
self.all_off[1] += [[0,0]]*self.num_pieces
self.is_true = False
self.clock = pygame.time.Clock()
self.buckets = [[5,-1],[0,0],[0,0],[0,0],[3,1],[0,0],[5,1],[0,0],[0,0],[0,0],[0,0],[2,-1],[5,1],[0,0],[0,0],[0,0],[3,-1],[0,0],[5,-1],[0,0],[0,0],[0,0],[0,0],[2,1]]
self.running = True
self.player = -1
self.roll = [random.randrange(1, 7), random.randrange(1, 7)]
print("initial_roll:", self.roll)
self.from_board = None
self.from_buckets = [x for x in self.buckets]
self.from_locat = None
self.total_moves = 0
def switch_player(self):
self.player *= -1
print("CHANGED PLAYER!")
def gen_buckets_from_board(self, board):
meh = []
for i in range(13,25):
pin = board[i]
# print(pin)
meh.append([abs(pin), np.sign(pin)])
for i in range(1,13):
pin = board[i]
meh.append([abs(pin), np.sign(pin)])
return meh
def gen_board_from_buckets(self, buckets):
board = []
board.append([0,0])
for i in range(-1,-13,-1):
board.append(buckets[i])
for i in range(0,12):
board.append(buckets[i])
board.append([0,0])
board = [x*y for x,y in board]
return board
def move_legal(self, from_board, buckets, roll):
board = self.gen_board_from_buckets(buckets)
legal_states = Board.calculate_legal_states(from_board, self.player, roll)
# print(legal_states)
if board in [list(state) for state in list(legal_states)]:
return True
return False
def find_pin(self, pos):
SPACING = self.SPACING
x,y = pos
x -= 50 if x > 550 else 0
if y < 175:
pin = (13 + int(x / SPACING))
idx = int(x / SPACING)
elif y > 225:
pin = (12 - int(x / SPACING))
idx = 12+ int(x / SPACING)
return pin, idx
# Find the y position based on the chosen pin
def calc_pos(self, buckets, chosen):
amount = buckets[chosen][0]
SPACING = self.SPACING
if chosen > 11:
# print("Amount at pin:", amount)
y = 378 - (30 * amount)
chosen -= 11
x = (SPACING*(chosen-1))+(SPACING/2)
x += 50 if x > 500 else 0
else:
chosen += 1
y = 30 * amount
x = (SPACING*(chosen-1))+(SPACING/2)
x += 50 if x > 500 else 0
return x,y
def calc_move_sets(self, from_board, roll, player):
# board = self.gen_board_from_buckets(buckets)
board = from_board
sets = []
total = 0
for r in roll:
# print("Value of r:",r)
sets.append([Board.calculate_legal_states(board, player, [r,0]), r])
total += r
sets.append([Board.calculate_legal_states(board, player, [total,0]), total])
return sets
def calc_turn(self):
player = self.player
if self.total_moves == 0:
return player * -1
return player
def handle_move(self, from_board, buckets, roll, player):
board = self.gen_board_from_buckets(buckets)
# print("Cur board:",board)
sets = self.calc_move_sets(from_board, roll, player)
for idx, board_set in enumerate(sets):
board_set[0] = list(board_set[0])
# print("My board_set:",board_set)
if board in [list(c) for c in board_set[0]]:
self.total_moves -= board_set[1]
if idx < 2:
# print("Roll object:",self.roll)
self.roll[idx] = 0
else:
self.roll = [0,0]
break
print("Total moves left:",self.total_moves)
# while running:
def paint_board(self):
# - events -
if self.player != self.calc_turn():
self.switch_player()
self.roll = [random.randrange(1, 7), random.randrange(1, 7)]
self.total_moves = self.roll[0] + self.roll[1]
print("Player:",self.player,"rolled:",self.roll)
player = self.player
rectangles_drag = self.all_drag[player]
rectangles = self.all_rects[player]
offsets = self.all_off[player]
buckets = self.buckets
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1:
meh = [rect.collidepoint(event.pos) for rect in rectangles]
if any(meh):
is_true = np.where(meh)[0][0]
if any(meh):
# print("GETTING CALLED")
rectangles_drag[is_true] = True
mouse_x, mouse_y = event.pos
# Need this to be a deepcopy :<
self.from_buckets = []
for x in buckets:
tmp = []
for y in x:
tmp.append(y)
self.from_buckets.append(tmp)
self.from_board = [x for x in self.gen_board_from_buckets(buckets)]
# print("From board in mousedown:", from_board)
pin, idx = self.find_pin(event.pos)
from_pin = pin
buckets[idx][0] -= 1
if buckets[idx][0] == 0:
buckets[idx][1] = 0
offsets[is_true][0] = rectangles[is_true].x - mouse_x
offsets[is_true][1] = rectangles[is_true].y - mouse_y
self.from_locat = [rectangles[is_true].x, rectangles[is_true].y]
elif event.type == pygame.MOUSEBUTTONUP:
if event.button == 1:
meh = [rect.collidepoint(event.pos) for rect in rectangles]
if any(meh):
is_true = np.where(meh)[0][0]
pin, idx = self.find_pin(event.pos)
x, y = self.calc_pos(buckets,idx)
buckets[idx][0] += 1
buckets[idx][1] = player
# print(self.from_board)
# print("To :",self.gen_board_from_buckets(buckets))
# print(move_legal(from_board, buckets, [1,2]))
# if self.move_legal(self.from_board, buckets, self.roll):
sets = self.calc_move_sets(self.from_board, self.roll, player)
pot_board = self.gen_board_from_buckets(buckets)
# print("board:",pot_board)
truth_values = []
for t in sets:
b = [list(c) for c in list(t)[0]]
if pot_board in list(b):
truth_values.append(pot_board in list(b))
print("Truth values:",truth_values)
if any(truth_values):
self.handle_move(self.from_board, buckets, self.roll, player)
# print("From:",self.gen_board_from_buckets(self.from_buckets))
# print("WOHO!"*10)
rectangles_drag[is_true] = False
rectangles[is_true].x = x
rectangles[is_true].y = y
else:
# print("From:",self.gen_board_from_buckets(self.from_buckets))
self.buckets = []
for x in self.from_buckets:
tmp = []
for y in x:
tmp.append(y)
self.buckets.append(tmp)
rectangles_drag[is_true] = False
rectangles[is_true].x = self.from_locat[0]
rectangles[is_true].y = self.from_locat[1]
# print("End :",self.gen_board_from_buckets(buckets))
elif event.type == pygame.MOUSEMOTION:
if any(rectangles_drag):
is_true = np.where(rectangles_drag)[0][0]
mouse_x, mouse_y = event.pos
rectangles[is_true].x = mouse_x + offsets[is_true][0]
rectangles[is_true].y = mouse_y + offsets[is_true][1]
self.screen.fill(self.GREEN_FILT)
# pygame.draw.polygon(screen, (RED), [[0, 0], [50,0],[25,100]], 2)
color = self.LIGHT_GREY
x = 0
y = 150
# for _ in range(2):
for i in range(12):
if x < 500 and x+self.SPACING > 500:
x = 550
color = self.SALMON if color == self.LIGHT_GREY else self.LIGHT_GREY
pygame.draw.polygon(self.screen, color, [[x, 0], [x+self.SPACING, 0], [(2*x+self.SPACING)/2, y]])
x += self.SPACING
# y += 50
x = 0
y = 250
# for _ in range(2):
color = self.SALMON if color == self.LIGHT_GREY else self.LIGHT_GREY
for i in range(12):
if x < 500 and x+self.SPACING > 500:
x = 550
color = self.SALMON if color == self.LIGHT_GREY else self.LIGHT_GREY
pygame.draw.polygon(self.screen, color, [[x, 400], [x+self.SPACING, 400], [(2*x+self.SPACING)/2, y]])
x += self.SPACING
# print(gen_board_from_buckets(buckets))
pygame.draw.rect(self.screen, self.BROWN, pygame.rect.Rect((500, 0, 50, 400)))
for p in [-1,1]:
for rect in self.all_rects[p]:
pygame.draw.rect(self.screen, self.RED if p == -1 else self.BLACK, rect)
pygame.display.flip()
# - constant game speed / FPS -
self.clock.tick(self.FPS)
def test(self):
while True:
self.paint_board()
b = Board_painter()
b.test()
# class myThread (threading.Thread):
# def __init__(self, threadID, name, counter):
# threading.Thread.__init__(self)
# self.threadID = threadID
# self.name = name
# self.counter = counter
# def run(self, function):
# print ("Starting " + self.name)
# function()
# print ("Exiting " + self.name)
# def change_player():
# while True:
# time.sleep(5)
# b.switch_player([1,2])
# def keep_painting():
# while True:
# b.paint_board()
# # Create new threads
# thread2 = myThread( keep_painting() )
# thread1 = myThread( change_player() )
# # Start new Threads
# thread1.start()
# thread2.start()
# thread1.join()
# thread2.join()
# print ("Exiting Main Thread")
# # - end -
# pygame.quit()
# - end -
pygame.quit()

View File

@ -284,9 +284,10 @@ class Board:
legal_moves = set() legal_moves = set()
if not Board.any_move_valid(board, player, roll): if not Board.any_move_valid(board, player, roll):
return { board } print("Inside board:",board)
return [ board ]
dice_permutations = list(itertools.permutations(roll)) if roll[0] != roll[1] else [[roll[0]]*4] dice_permutations = list(itertools.permutations(roll)) if roll[0] != roll[1] else [[roll[0]]*4]
print("Dice permuts:",dice_permutations) # print("Dice permuts:",dice_permutations)
for roll in dice_permutations: for roll in dice_permutations:
# Calculate boards resulting from first move # Calculate boards resulting from first move
#print("initial board: ", board) #print("initial board: ", board)