from UBpygame import *
from random import *
## ECRAN
window_size = (400, 640)
window = initialize(window_size[0], window_size[1], "Folt")
delai = 300
delai_short = 100
delai_win = 500
## VARIABLES
# Couleurs
WHITE = (255, 255, 255)
GREY = (50, 50, 50)
BLACK = (0, 0, 0)
BLUE = (0, 0, 255)
# Menu
menu_height = 100
menu_spacing = 5
# Grid
grid_size = (5, 7)
grid = []
for i in range(grid_size[0]):
grid.append([])
for j in range(grid_size[1]):
grid[i].append(0)
# Cases
case_size = (window_size[0]//grid_size[0], (window_size[1] - menu_height)//grid_size[1])
small_case_size = (3/4) * case_size[0], (3/4) * case_size[1]
tip_case_size = (1/4) * case_size[0], (1/4) * case_size[1]
tip_case_inner_size = tip_case_size[0] - 5, tip_case_size[1] - 5
tip_cte = 1
current_case = ((grid_size[0] - 1)//2, (grid_size[1] - 1)//2)
grid[current_case[0]][current_case[1]] = randint(1, 2)
case_ammount = 3
next_cases = []
last_case = (0, 0)
# Interaction
interaction={'up':False, 'down':False, 'left':False, 'right':False}
# Score
score = 0
score_max = 15
game_finished = False
game_already_finished = False
game_won_msg = "You WIN"
game_lost_msg = "Game Over"
# Rectangles
menu_bar_bg = create_rectangle((0, 0), window_size[0], menu_height, GREY)
draw_rectangle(menu_bar_bg)
grid_bg = create_rectangle((0, menu_height), window_size[0], window_size[1] - menu_height, WHITE)
draw_rectangle(grid_bg)
## FUNCTION: METTRE A JOUR LA LISTE DES PROCHAINES CASES
def case_next(l):
while (len(l) < case_ammount):
l.append(randint(1, 2))
## FUNCTION: DESSINER L'ECRAN
def draw_screen():
global game_finished
# Dessiner les 3 prochaines cases
draw_rectangle(grid_bg)
draw_rectangle(menu_bar_bg)
for i in range (len(next_cases)):
if(next_cases[i] == 1):
small_case_rec = create_rectangle((menu_spacing*2 + i*(small_case_size[0] + menu_spacing), (menu_height - small_case_size[1])/2), small_case_size[0], small_case_size[1], BLACK)
elif(next_cases[i] == 2):
small_case_rec = create_rectangle((menu_spacing*2 + i*(small_case_size[0] + menu_spacing), (menu_height - small_case_size[1])/2), small_case_size[0], small_case_size[1], BLUE)
draw_rectangle(small_case_rec)
# Dessiner les cases
for i in range (grid_size[0]):
for j in range (grid_size[1]):
if (grid[i][j] == 1):
case_rec = create_rectangle((i * case_size[0], menu_height + j * case_size[1]), case_size[0], case_size[1], BLACK)
draw_rectangle(case_rec)
elif (grid[i][j] == 2):
case_rec = create_rectangle((i * case_size[0], menu_height + j * case_size[1]), case_size[0], case_size[1], BLUE)
draw_rectangle(case_rec)
# Dessiner petite casse montrant la casse actuelle
small_case_rec = create_rectangle((current_case[0] * case_size[0] + case_size[0]/2 - tip_case_size[0]/2, menu_height + current_case[1] * case_size[1] + case_size[1]/2 - tip_case_size[1]/2), tip_case_size[0], tip_case_size[1], WHITE)
draw_rectangle(small_case_rec)
c = 0
case = grid[current_case[0]][current_case[1]]
if (case == 1):
c = BLACK
elif (case == 2):
c = BLUE
small_case_inner_rec = create_rectangle((current_case[0] * case_size[0] + case_size[0]/2 - tip_case_inner_size[0]//2 - tip_cte, menu_height + current_case[1] * case_size[1] + case_size[1]/2 - tip_case_inner_size[1]//2 - tip_cte), tip_case_inner_size[0] + tip_cte, tip_case_inner_size[1] + tip_cte, c)
draw_rectangle(small_case_inner_rec)
# Dessiner le score
sc = str(score) + " / " + str(score_max)
tw, th = text_size(sc, 50)
draw_text(sc, (3*window_size[0]/4 - (tw/2), (menu_height - th)/2), BLACK, 50)
if (game_finished == True):
if (score >= score_max):
tw, th = text_size(game_won_msg, 100)
for i in range(0, 256, 5):
draw_text(game_won_msg, (window_size[0]/2 - tw/2, window_size[1]/2 - th/2), (255-i, 255, 255-i), 100)
refresh_window()
delay(delai_short)
delay(delai_win)
game_finished = False
else:
tw, th = text_size(game_lost_msg, 80)
for i in range(0, 256, 5):
draw_text(game_lost_msg, (window_size[0]/2 - tw/2, window_size[1]/2 - th/2), (255, 255-i, 255-i), 80)
refresh_window()
delay(delai_short)
delay(delai_win)
game_finished = False
refresh_window()
def draw_animation_next_case(pos, cmd):
c = 0
if (grid[pos[0]][pos[1]] == 1):
c = BLACK
elif (grid[pos[0]][pos[1]] == 2):
c = BLUE
if(cmd["up"]):
i = 0
while(i < case_size[1]):
case_rec = create_rectangle((pos[0] * case_size[0], menu_height + pos[1] * case_size[1] + case_size[1] - i), case_size[0], i, c)
draw_rectangle(case_rec)
refresh_window()
i += 3
if(cmd["down"]):
i = 0
while(i < case_size[1]):
case_rec = create_rectangle((pos[0] * case_size[0], menu_height + pos[1] * case_size[1]), case_size[0], i, c)
draw_rectangle(case_rec)
refresh_window()
i += 3
if(cmd["right"]):
i = 0
while(i < case_size[1]):
case_rec = create_rectangle((pos[0] * case_size[0], menu_height + pos[1] * case_size[1]), i, case_size[1], c)
draw_rectangle(case_rec)
refresh_window()
i += 3
if(cmd["left"]):
i = 0
while(i < case_size[1]):
case_rec = create_rectangle((pos[0] * case_size[0] + case_size[0] - i, menu_height + pos[1] * case_size[1]), i, case_size[1], c)
draw_rectangle(case_rec)
refresh_window()
i += 3
def list_neighbors(pos):
if (pos[1] > 0):
u = (pos[0], pos[1] - 1)
else:
u = None
if (pos[1] < grid_size[1] - 1):
d = (pos[0], pos[1] + 1)
else:
d = None
if (pos[0] < grid_size[0] - 1):
l = (pos[0] + 1, pos[1])
else:
l = None
if (pos[0] > 0):
r = (pos[0] - 1, pos[1])
else:
r = None
return(u, d, l, r)
def count_neighbors(pos, c):
grid[pos[0]][pos[1]] = 3
n = 1
for i in list_neighbors(pos):
if(i != None and grid[i[0]][i[1]] == c):
n = n + count_neighbors(i, c)
return(n)
def check_neighbors(pos, c):
global score
a = count_neighbors(pos, c)
if (a > 2):
for i in range (grid_size[0]):
for j in range (grid_size[1]):
if (grid[i][j] == 3):
grid[i][j] = 0
score += a - 1
else:
for i in range (grid_size[0]):
for j in range (grid_size[1]):
if (grid[i][j] == 3):
grid[i][j] = c
grid[pos[0]][pos[1]] = c
def game_lost(pos):
c = grid[pos[0]][pos[1]]
n = 0
for i in list_neighbors(pos):
if (i == None):
n += 1
elif(grid[i[0]][i[1]] != 0):
n += 1
if (n == 4):
return(True)
else:
return(False)
## FUNCTION: GERER LA GRILLE
def handle_grid(pos, cmd):
global game_finished, game_already_finished
# Mettre a jour la grille
grid[pos[0]][pos[1]] = next_cases[0]
# Mettre a jour la liste des prochaines cases
del(next_cases[0])
case_next(next_cases)
# S'occuper des cases adjacentes
check_neighbors(pos, grid[pos[0]][pos[1]])
# Verifier si le joueur a perdu, ou gagner
if(game_lost(pos) != False):
game_finished = True
if (game_already_finished == True):
game_already_finished = False
else:
game_already_finished = True
if (score >= score_max and game_already_finished == False):
game_finished = True
game_already_finished = True
draw_animation_next_case(pos, cmd)
draw_screen()
## FUNCTION: GERER LES INTERACTIONS
def handle_interaction():
global current_case
k_up, k_down, k_left, k_right = False, False, False, False
if (is_key_pressed(K_UP)):
if (current_case[1] > 0 and grid[current_case[0]][current_case[1] - 1] == 0):
last_case = current_case
current_case = (current_case[0], current_case[1] - 1)
k_up = True
elif (is_key_pressed(K_DOWN)):
if (current_case[1] < grid_size[1] - 1 and grid[current_case[0]][current_case[1] + 1] == 0):
last_case = current_case
current_case = (current_case[0], current_case[1] + 1)
k_down = True
elif (is_key_pressed(K_LEFT)):
if (current_case[0] > 0 and grid[current_case[0] - 1][current_case[1]] == 0):
last_case = current_case
current_case = (current_case[0] - 1, current_case[1])
k_left = True
elif (is_key_pressed(K_RIGHT)):
if (current_case[0] < grid_size[0] - 1 and grid[current_case[0] + 1][current_case[1]] == 0):
last_case = current_case
current_case = (current_case[0] + 1, current_case[1])
k_right = True
return({'up':k_up, 'down':k_down, 'left':k_left, 'right':k_right})
## FUNCTION: GERER LES ANIMATIONS
def handle_animation(cmd):
global current_case
global game_finished
if (cmd['up']):
handle_grid(current_case, cmd)
delay(delai)
if (cmd['down']):
handle_grid(current_case, cmd)
delay(delai)
if (cmd['left']):
handle_grid(current_case, cmd)
delay(delai)
if (cmd['right']):
handle_grid(current_case, cmd)
delay(delai)
## FUNCTION: LE JEU ET SA FENETRE
def Folt():
global interaction
case_next(next_cases)
draw_screen()
## ECRAN
while(not is_any_quit_event()):
interaction = handle_interaction()
handle_animation(interaction)
refresh_window()
uninitialize()
Folt()
Comments
0 B
|👍
/👎