Advertisement
boris-vlasenko

tetris vs comments for win + lin

May 16th, 2016
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.73 KB | None | 0 0
  1. from tkinter import *
  2. from random import randrange as rnd, choice
  3. import time
  4.  
  5. root = Tk()
  6. root.geometry('550x700+800+50')
  7.  
  8. canv = Canvas(bg='white')
  9. canv.pack(fill=BOTH,expand=1)
  10.  
  11.  
  12. canv.create_rectangle(50,50,350,650,width=5)
  13.  
  14. m = 30 # размер клетки
  15. x0 = 50
  16. y0 = 50
  17. nr = 20 # высота
  18. nc = 10 # ширина
  19. colors = ['white','green'] # цвет пустой и закрашенной клетки
  20. fig_colors = ['red','red','orange','blue','#F600DA','black','black'] # цвета фигур. Повторяются, потому что Z и L по две
  21. a = [[0 for r in range(nc)] for r in range(nr)] # массив клеток
  22.  
  23. speed = 1 # скорость, любые вещественные положительные значения, чем больше, тем быстрее
  24. points = 0 # очки
  25.  
  26. canv.create_text(420,400,text='Скорость:', font = 'Arail 10')
  27. canv.create_text(433,450,text='Очки:', font = 'Arail 10')
  28.  
  29. figs = [] # список фигур L,L,T,4,|,z,z
  30. fig = [((0,0),(0,1),(0,2),(1,2)),((0,1),(1,1),(2,1),(2,0)),((0,0),(1,0),(1,1),(1,2)),((0,0),(0,1),(1,0),(2,0))] #"L-1"
  31. figs.append(fig)
  32. fig = [((1,0),(1,1),(1,2),(0,2)),((0,0),(1,0),(2,0),(2,1)),((0,0),(1,0),(0,1),(0,2)),((0,0),(0,1),(1,1),(2,1)),] #"L-2"
  33. figs.append(fig)
  34. fig = [((1,0),(1,1),(1,2),(2,1)),((0,1),(1,1),(1,2),(2,1)),((1,0),(1,1),(0,1),(1,2)),((1,1),(0,2),(1,2),(2,2))] #"T"
  35. figs.append(fig)
  36. fig = [((1,1),(1,2),(2,1),(2,2))] #"4"
  37. figs.append(fig)
  38. fig = [((0,0),(0,1),(0,2),(0,3)),((0,1),(1,1),(2,1),(3,1))] #"|"
  39. figs.append(fig)
  40. fig = [((0,0),(0,1),(1,1),(1,2)),((1,0),(2,0),(0,1),(1,1))] #"Z-1"
  41. figs.append(fig)
  42. fig = [((1,0),(1,1),(0,1),(0,2)),((1,1),(2,1),(0,0),(1,0))] #"Z-2"
  43. figs.append(fig)
  44.  
  45. mode = 'game' # изменяется при конце игры, обеспечивает выход из цикла
  46.  
  47. def check(): # проверка, не конец ли игры
  48.     global mode
  49.     k = 0
  50.     for c in range(nc): # считать клетки в верней строке
  51.         k += a[0][c]
  52.     if k > 0:
  53.         mode = 'end game' # конец, если хотя бы одна клетка в верхней строке заполнена
  54.  
  55. def new_fig(): # создать новую фигуру
  56.     global current_fig, r,c, current_fig_number, current_fig_turn
  57.     r = 0 # строка левого верхнего угла падающей фигуры
  58.     c = 2 # столбец левого верхнего угла падающей фигуры
  59.     current_fig_number = rnd(len(figs)) # номер фигуры
  60.     current_fig_turn = rnd(len(figs[current_fig_number])) # номер поворота фигуры
  61.     current_fig = figs[current_fig_number][current_fig_turn] # сама фигура (клетки, которые нужно закрасить)
  62.    
  63. def paint_fig(): # отрисовать падающую фигуру
  64.     for dr, dc in current_fig:
  65.         rr = r + dr
  66.         cc = c + dc
  67.         x = x0 + cc*m
  68.         y = y0 + rr*m
  69.         canv.create_rectangle(x,y,x+m,y+m,outline='gray',fill=fig_colors[current_fig_number],tag='cells')
  70.    
  71. def paint():
  72.     canv.delete('cells') # удалить все ячейки
  73.     canv.delete('points') # удалить значения очков и скорости
  74.     for rr in range(0,nr):
  75.         for cc in range(nc):
  76.             x = x0 + cc*m
  77.             y = y0 + rr*m
  78.             canv.create_rectangle(x,y,x+m,y+m,outline='gray',fill=colors[a[rr][cc]],tag='cells')
  79.            
  80.     paint_fig()
  81.     canv.create_text(480,400,text=speed,tag='points', font = 'Arail 10')
  82.     canv.create_text(480,450,text=points,tag='points', font = 'Arail 10')
  83.     canv.update()
  84.  
  85. def delete_lines(): # удаление заполненных строк, если возможно, подсчет очков
  86.     global points, speed
  87.     lines = 0
  88.     for r in range(nr):
  89.         k = 0
  90.         for c in range(nc):
  91.             k += a[r][c]
  92.         if k == nc:
  93.             lines += 1
  94.             for rr in range(r,0,-1):
  95.                 for c in range(nc):
  96.                     a[rr][c] = a[rr-1][c]
  97.     if lines == 1: # очки считаются нелинейно. Больше строк за один раз - больше очков
  98.         points += 1
  99.     elif lines == 2:
  100.         points += 3
  101.     elif lines == 3:
  102.         points += 5
  103.     elif lines == 4:
  104.         points += 10
  105.    
  106.     speed = max(points//20,1) # скорость определяется количеством очков. max - чтобы вначале скорость не оказалась равна нулю
  107.                    
  108.                    
  109. def fix_fig(): # перенос клеток фигуры в основной массив "а"
  110.     global current_fig, t1
  111.     for dr,dc in current_fig:
  112.         a[r+dr][c+dc] = 1
  113.     current_fig = []
  114.     check()
  115.  
  116. def move_left(): # смещение фигуры влево
  117.     global c
  118.     move = True # предположим, что фигуру можно переместить влево
  119.     for dr,dc in current_fig:
  120.         if not (c+dc-1 >= 0 and a[r+dr][c+dc-1] == 0): # если слева от фигуры стена или непустые клетки, то не перемещать
  121.             move = False
  122.             break
  123.     if move:
  124.         c -= 1     
  125.        
  126. def move_right(): # смещение фигуры вправо
  127.     global c
  128.     move = True
  129.     for dr,dc in current_fig:
  130.         if not (c+dc+1 < nc and a[r+dr][c+dc+1] == 0):
  131.             move = False
  132.     if move:
  133.         c += 1     
  134.  
  135. def turn_left(): # поворот фигуры
  136.     global current_fig, current_fig_number, current_fig_turn
  137.     # рассчитать номер поворота фигуры
  138.     next_current_fig_turn = current_fig_turn - 1
  139.     if next_current_fig_turn < 0:
  140.         next_current_fig_turn = len(figs[current_fig_number])-1
  141.     ##
  142.    
  143.     next_current_fig = figs[current_fig_number][next_current_fig_turn]
  144.     move = True # предположим, что повернуть можно
  145.     for dr, dc in next_current_fig:
  146.         if r+dr >= nr or c+dc >= nc or a[r+dr][c+dc] == 1: # если после поворота клетки фигуры наложатся на занятые клетки, то поворачивать нельзя
  147.             move = False
  148.             break
  149.     if move:
  150.         current_fig_turn = next_current_fig_turn # запомнить новый номер повтора
  151.         current_fig = figs[current_fig_number][current_fig_turn] # взять новый набор клеток фигуры
  152.    
  153. def tick(): # смещение падающей фигуры на строку вниз и проверки
  154.     global r,c
  155.     stop = False # предположим, что фигуре есть куда падать
  156.     for dr,dc in current_fig:
  157.         if r+dr+1 >= nr or a[r+dr+1][c+dc] == 1: # если снизу есть хотя бы одна занятая клетка, но остановить фигуру
  158.             stop = True
  159.             break
  160.     if stop: # если нужно остановится
  161.         fix_fig() # внести клетки из фигуры в основной массив
  162.         delete_lines() # удалить строки, если это возможно
  163.         new_fig() # запустить новую фигуру
  164.     else:
  165.         r += 1 # иначе просто сместить фигуру вниз на одну строку
  166.    
  167. new_fig() # создать новую фигуру и начать игру
  168.  
  169. def keyDown(event): # действия при нажатии клавиши
  170.     global speed, old_speed
  171.     #print(event.keycode)
  172.     if event.keycode == 40 or event.keycode == 116: # если нажата кл. вниз, тогда взять новую скорость (быструю)
  173.         old_speed = speed
  174.         speed = 40
  175.     if event.keycode == 38 or event.keycode == 111: # вверх - поворот
  176.         turn_left()
  177.     if event.keycode == 37 or event.keycode == 113:
  178.         move_left()
  179.     if event.keycode == 39 or event.keycode == 114:
  180.         move_right()
  181.  
  182. def keyUp(event): # действия при отпускании клавиши
  183.     global speed
  184.     if event.keycode == 40 or event.keycode == 116: # если кл. вниз отпущена, то вернуть нормальную скорость
  185.         speed = old_speed
  186.    
  187.    
  188.  
  189. root.bind('<Key>',keyDown) # привязать реакцию на нажатие клавиши к соотв. функции
  190. root.bind('<KeyRelease>',keyUp) # привязать реакцию на отпускание клавиши к соотв. функции
  191. frame_to_tick = 0 # счетчик кадров до смещения падающей фигуры на строку вниз
  192.  
  193. while mode == 'game': #
  194.     if frame_to_tick <= 0:
  195.         frame_to_tick = 30 # 30 - значит одна строка за 0,03*30=0,9сек на скорости speed = 1
  196.         tick()
  197.     frame_to_tick -= speed # чем больше speed, тем быстрее будет смещение на строку вниз
  198.     paint() # обновить экран
  199.    
  200.     time.sleep(0.03) # задержка на 3 сотых секунды
  201.  
  202. canv.create_text(200,350,text='Game over', font = 'Arial 40') # надпись "Конец игры"
  203.  
  204.  
  205. mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement