IsakViste icon

L1: Project Folt

IsakViste | PRO | 12/12/16 08:37:36 AM UTC | 0 ⭐ | 295 👁️ | Never ⏰ | []
Python |

10.15 KB

|

None

|

0 👍

/

0 👎

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

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎