Advertisement
IsakViste

L1: Project Folt

Dec 12th, 2016
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 10.15 KB | None | 0 0
  1. from UBpygame import *
  2. from random import *
  3.  
  4. ## ECRAN
  5. window_size = (400, 640)
  6. window = initialize(window_size[0], window_size[1], "Folt")
  7. delai = 300
  8. delai_short = 100
  9. delai_win = 500
  10.  
  11. ## VARIABLES
  12. # Couleurs
  13. WHITE = (255, 255, 255)
  14. GREY = (50, 50, 50)
  15. BLACK = (0, 0, 0)
  16. BLUE = (0, 0, 255)
  17.  
  18. # Menu
  19. menu_height = 100
  20. menu_spacing = 5
  21.  
  22. # Grid
  23. grid_size = (5, 7)
  24. grid = []
  25. for i in range(grid_size[0]):
  26.     grid.append([])
  27.     for j in range(grid_size[1]):
  28.         grid[i].append(0)
  29.  
  30. # Cases
  31. case_size = (window_size[0]//grid_size[0], (window_size[1] - menu_height)//grid_size[1])
  32. small_case_size = (3/4) * case_size[0], (3/4) * case_size[1]
  33. tip_case_size = (1/4) * case_size[0], (1/4) * case_size[1]
  34. tip_case_inner_size = tip_case_size[0] - 5, tip_case_size[1] - 5
  35. tip_cte = 1
  36.  
  37. current_case = ((grid_size[0] - 1)//2, (grid_size[1] - 1)//2)
  38. grid[current_case[0]][current_case[1]] = randint(1, 2)
  39.  
  40. case_ammount = 3
  41. next_cases = []
  42. last_case = (0, 0)
  43.  
  44. # Interaction
  45. interaction={'up':False, 'down':False, 'left':False, 'right':False}
  46.  
  47. # Score
  48. score = 0
  49. score_max = 15
  50.  
  51. game_finished = False
  52. game_already_finished = False
  53. game_won_msg = "You WIN"
  54. game_lost_msg = "Game Over"
  55.  
  56. # Rectangles
  57. menu_bar_bg = create_rectangle((0, 0), window_size[0], menu_height, GREY)
  58. draw_rectangle(menu_bar_bg)
  59.  
  60. grid_bg = create_rectangle((0, menu_height), window_size[0], window_size[1] - menu_height, WHITE)
  61. draw_rectangle(grid_bg)
  62.  
  63. ## FUNCTION: METTRE A JOUR LA LISTE DES PROCHAINES CASES
  64. def case_next(l):
  65.     while (len(l) < case_ammount):
  66.         l.append(randint(1, 2))
  67.  
  68. ## FUNCTION: DESSINER L'ECRAN
  69. def draw_screen():
  70.     global game_finished
  71.    
  72.     # Dessiner les 3 prochaines cases
  73.     draw_rectangle(grid_bg)
  74.     draw_rectangle(menu_bar_bg)
  75.     for i in range (len(next_cases)):
  76.         if(next_cases[i] == 1):
  77.             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)
  78.         elif(next_cases[i] == 2):
  79.             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)
  80.         draw_rectangle(small_case_rec)
  81.  
  82.     # Dessiner les cases
  83.     for i in range (grid_size[0]):
  84.         for j in range (grid_size[1]):
  85.             if (grid[i][j] == 1):
  86.                 case_rec = create_rectangle((i * case_size[0], menu_height + j * case_size[1]), case_size[0], case_size[1], BLACK)
  87.                 draw_rectangle(case_rec)
  88.             elif (grid[i][j] == 2):
  89.                 case_rec = create_rectangle((i * case_size[0], menu_height + j * case_size[1]), case_size[0], case_size[1], BLUE)
  90.                 draw_rectangle(case_rec)
  91.  
  92.     # Dessiner petite casse montrant la casse actuelle
  93.     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)
  94.     draw_rectangle(small_case_rec)
  95.  
  96.     c = 0
  97.     case = grid[current_case[0]][current_case[1]]
  98.     if (case == 1):
  99.         c = BLACK
  100.     elif (case == 2):
  101.         c = BLUE
  102.  
  103.     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)
  104.     draw_rectangle(small_case_inner_rec)
  105.            
  106.     # Dessiner le score    
  107.     sc = str(score) + " / " + str(score_max)
  108.     tw, th = text_size(sc, 50)
  109.     draw_text(sc, (3*window_size[0]/4 - (tw/2), (menu_height - th)/2), BLACK, 50)
  110.  
  111.     if (game_finished == True):
  112.         if (score >= score_max):
  113.             tw, th = text_size(game_won_msg, 100)
  114.             for i in range(0, 256, 5):
  115.                 draw_text(game_won_msg, (window_size[0]/2 - tw/2, window_size[1]/2 - th/2), (255-i, 255, 255-i), 100)
  116.                 refresh_window()
  117.                 delay(delai_short)
  118.             delay(delai_win)
  119.             game_finished = False
  120.         else:
  121.             tw, th = text_size(game_lost_msg, 80)
  122.             for i in range(0, 256, 5):
  123.                 draw_text(game_lost_msg, (window_size[0]/2 - tw/2, window_size[1]/2 - th/2), (255, 255-i, 255-i), 80)
  124.                 refresh_window()
  125.                 delay(delai_short)
  126.             delay(delai_win)
  127.             game_finished = False
  128.    
  129.     refresh_window()
  130.  
  131. def draw_animation_next_case(pos, cmd):
  132.     c = 0
  133.    
  134.     if (grid[pos[0]][pos[1]] == 1):
  135.         c = BLACK
  136.     elif (grid[pos[0]][pos[1]] == 2):
  137.         c = BLUE
  138.  
  139.     if(cmd["up"]):
  140.         i = 0
  141.         while(i < case_size[1]):
  142.             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)
  143.             draw_rectangle(case_rec)
  144.             refresh_window()
  145.             i += 3
  146.     if(cmd["down"]):
  147.         i = 0
  148.         while(i < case_size[1]):
  149.             case_rec = create_rectangle((pos[0] * case_size[0], menu_height + pos[1] * case_size[1]), case_size[0], i, c)
  150.             draw_rectangle(case_rec)
  151.             refresh_window()
  152.             i += 3
  153.     if(cmd["right"]):
  154.         i = 0
  155.         while(i < case_size[1]):
  156.             case_rec = create_rectangle((pos[0] * case_size[0], menu_height + pos[1] * case_size[1]), i, case_size[1], c)
  157.             draw_rectangle(case_rec)
  158.             refresh_window()
  159.             i += 3
  160.     if(cmd["left"]):
  161.         i = 0
  162.         while(i < case_size[1]):
  163.             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)
  164.             draw_rectangle(case_rec)
  165.             refresh_window()
  166.             i += 3
  167.  
  168. def list_neighbors(pos):    
  169.     if (pos[1] > 0):
  170.         u = (pos[0], pos[1] - 1)
  171.     else:
  172.         u = None
  173.     if (pos[1] < grid_size[1] - 1):
  174.         d = (pos[0], pos[1] + 1)
  175.     else:
  176.         d = None
  177.     if (pos[0] < grid_size[0] - 1):
  178.         l = (pos[0] + 1, pos[1])
  179.     else:
  180.         l = None
  181.     if (pos[0] > 0):
  182.         r = (pos[0] - 1, pos[1])
  183.     else:
  184.         r = None
  185.     return(u, d, l, r)
  186.  
  187. def count_neighbors(pos, c):
  188.     grid[pos[0]][pos[1]] = 3
  189.     n = 1
  190.     for i in list_neighbors(pos):
  191.         if(i != None and grid[i[0]][i[1]] == c):
  192.             n = n + count_neighbors(i, c)
  193.     return(n)
  194.  
  195. def check_neighbors(pos, c):
  196.     global score
  197.    
  198.     a = count_neighbors(pos, c)
  199.     if (a > 2):
  200.         for i in range (grid_size[0]):
  201.             for j in range (grid_size[1]):
  202.                 if (grid[i][j] == 3):
  203.                     grid[i][j] = 0
  204.         score += a - 1
  205.     else:
  206.         for i in range (grid_size[0]):
  207.             for j in range (grid_size[1]):
  208.                 if (grid[i][j] == 3):
  209.                     grid[i][j] = c
  210.     grid[pos[0]][pos[1]] = c
  211.  
  212. def game_lost(pos):
  213.     c = grid[pos[0]][pos[1]]
  214.     n = 0
  215.    
  216.     for i in list_neighbors(pos):
  217.         if (i == None):
  218.             n += 1
  219.         elif(grid[i[0]][i[1]] != 0):
  220.             n += 1
  221.     if (n == 4):
  222.         return(True)
  223.     else:
  224.         return(False)
  225.            
  226.  
  227. ## FUNCTION: GERER LA GRILLE
  228. def handle_grid(pos, cmd):
  229.     global game_finished, game_already_finished
  230.    
  231.     # Mettre a jour la grille
  232.     grid[pos[0]][pos[1]] = next_cases[0]
  233.  
  234.     # Mettre a jour la liste des prochaines cases
  235.     del(next_cases[0])
  236.     case_next(next_cases)
  237.    
  238.     # S'occuper des cases adjacentes
  239.     check_neighbors(pos, grid[pos[0]][pos[1]])
  240.  
  241.     # Verifier si le joueur a perdu, ou gagner
  242.     if(game_lost(pos) != False):
  243.         game_finished = True
  244.         if (game_already_finished == True):
  245.             game_already_finished = False
  246.         else:
  247.             game_already_finished = True
  248.  
  249.     if (score >= score_max and game_already_finished == False):
  250.         game_finished = True
  251.         game_already_finished = True
  252.  
  253.     draw_animation_next_case(pos, cmd)
  254.     draw_screen()
  255.  
  256. ## FUNCTION: GERER LES INTERACTIONS
  257. def handle_interaction():
  258.     global current_case
  259.    
  260.     k_up, k_down, k_left, k_right = False, False, False, False
  261.    
  262.     if (is_key_pressed(K_UP)):
  263.         if (current_case[1] > 0 and grid[current_case[0]][current_case[1] - 1] == 0):
  264.             last_case = current_case
  265.             current_case = (current_case[0], current_case[1] - 1)
  266.             k_up = True
  267.     elif (is_key_pressed(K_DOWN)):
  268.         if (current_case[1] < grid_size[1] - 1 and grid[current_case[0]][current_case[1] + 1] == 0):
  269.             last_case = current_case
  270.             current_case = (current_case[0], current_case[1] + 1)
  271.             k_down = True
  272.     elif (is_key_pressed(K_LEFT)):
  273.         if (current_case[0] > 0 and grid[current_case[0] - 1][current_case[1]] == 0):
  274.             last_case = current_case
  275.             current_case = (current_case[0] - 1, current_case[1])
  276.             k_left = True
  277.     elif (is_key_pressed(K_RIGHT)):
  278.         if (current_case[0] < grid_size[0] - 1 and grid[current_case[0] + 1][current_case[1]] == 0):
  279.             last_case = current_case
  280.             current_case = (current_case[0] + 1, current_case[1])
  281.             k_right = True
  282.    
  283.     return({'up':k_up, 'down':k_down, 'left':k_left, 'right':k_right})
  284.  
  285. ## FUNCTION: GERER LES ANIMATIONS
  286. def handle_animation(cmd):
  287.     global current_case
  288.     global game_finished
  289.    
  290.     if (cmd['up']):
  291.         handle_grid(current_case, cmd)
  292.         delay(delai)
  293.  
  294.     if (cmd['down']):
  295.         handle_grid(current_case, cmd)
  296.         delay(delai)
  297.  
  298.     if (cmd['left']):
  299.         handle_grid(current_case, cmd)
  300.         delay(delai)
  301.  
  302.     if (cmd['right']):
  303.         handle_grid(current_case, cmd)
  304.         delay(delai)
  305.  
  306. ## FUNCTION: LE JEU ET SA FENETRE
  307. def Folt():
  308.     global interaction
  309.  
  310.     case_next(next_cases)
  311.     draw_screen()
  312.    
  313.     ## ECRAN
  314.     while(not is_any_quit_event()):
  315.         interaction = handle_interaction()
  316.         handle_animation(interaction)
  317.         refresh_window()
  318.     uninitialize()
  319.  
  320. Folt()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement