Advertisement
boris-vlasenko

tetris vs comments for windows

May 16th, 2016
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.77 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, speed
  111.     speed =  old_speed # сборить скорость на нормальную (на случай, если фигуру опускали быстро)
  112.     for dr,dc in current_fig:
  113.         a[r+dr][c+dc] = 1
  114.     current_fig = []
  115.     check()
  116.  
  117. def move_left(): # смещение фигуры влево
  118.     global c
  119.     move = True # предположим, что фигуру можно переместить влево
  120.     for dr,dc in current_fig:
  121.         if not (c+dc-1 >= 0 and a[r+dr][c+dc-1] == 0): # если слева от фигуры стена или непустые клетки, то не перемещать
  122.             move = False
  123.             break
  124.     if move:
  125.         c -= 1     
  126.        
  127. def move_right(): # смещение фигуры вправо
  128.     global c
  129.     move = True
  130.     for dr,dc in current_fig:
  131.         if not (c+dc+1 < nc and a[r+dr][c+dc+1] == 0):
  132.             move = False
  133.     if move:
  134.         c += 1     
  135.  
  136. def turn_left(): # поворот фигуры
  137.     global current_fig, current_fig_number, current_fig_turn
  138.     # рассчитать номер поворота фигуры
  139.     next_current_fig_turn = current_fig_turn - 1
  140.     if next_current_fig_turn < 0:
  141.         next_current_fig_turn = len(figs[current_fig_number])-1
  142.     ##
  143.    
  144.     next_current_fig = figs[current_fig_number][next_current_fig_turn]
  145.     move = True # предположим, что повернуть можно
  146.     for dr, dc in next_current_fig:
  147.         if r+dr >= nr or c+dc >= nc or a[r+dr][c+dc] == 1: # если после поворота клетки фигуры наложатся на занятые клетки, то поворачивать нельзя
  148.             move = False
  149.             break
  150.     if move:
  151.         current_fig_turn = next_current_fig_turn # запомнить новый номер повтора
  152.         current_fig = figs[current_fig_number][current_fig_turn] # взять новый набор клеток фигуры
  153.    
  154. def tick(): # смещение падающей фигуры на строку вниз и проверки
  155.     global r,c
  156.     stop = False # предположим, что фигуре есть куда падать
  157.     for dr,dc in current_fig:
  158.         if r+dr+1 >= nr or a[r+dr+1][c+dc] == 1: # если снизу есть хотя бы одна занятая клетка, но остановить фигуру
  159.             stop = True
  160.             break
  161.     if stop: # если нужно остановится
  162.         fix_fig() # внести клетки из фигуры в основной массив
  163.         delete_lines() # удалить строки, если это возможно
  164.         new_fig() # запустить новую фигуру
  165.     else:
  166.         r += 1 # иначе просто сместить фигуру вниз на одну строку
  167.    
  168. new_fig() # создать новую фигуру и начать игру
  169.  
  170. def keyDown(event): # действия при нажатии клавиши
  171.     global speed, old_speed
  172.     #print(event.keycode)
  173.     if event.keycode == 40: # если нажата кл. вниз, тогда взять новую скорость (быструю)
  174.         old_speed = speed
  175.         speed = 40
  176.     if event.keycode == 38: # вверх - поворот
  177.         turn_left()
  178.     if event.keycode == 37:
  179.         move_left()
  180.     if event.keycode == 39:
  181.         move_right()
  182.  
  183. def keyUp(event): # действия при отпускании клавиши
  184.     global speed
  185.     if event.keycode == 40: # если кл. вниз отпущена, то вернуть нормальную скорость
  186.         speed = old_speed
  187.    
  188.    
  189.  
  190. root.bind('<Key>',keyDown) # привязать реакцию на нажатие клавиши к соотв. функции
  191. root.bind('<KeyRelease>',keyUp) # привязать реакцию на отпускание клавиши к соотв. функции
  192. frame_to_tick = 0 # счетчик кадров до смещения падающей фигуры на строку вниз
  193.  
  194. while mode == 'game': #
  195.     if frame_to_tick <= 0:
  196.         frame_to_tick = 30 # 30 - значит одна строка за 0,03*30=0,9сек на скорости speed = 1
  197.         tick()
  198.     frame_to_tick -= speed # чем больше speed, тем быстрее будет смещение на строку вниз
  199.     paint() # обновить экран
  200.    
  201.     time.sleep(0.03) # задержка на 3 сотых секунды
  202.  
  203. canv.create_text(200,350,text='Game over', font = 'Arial 40') # надпись "Конец игры"
  204.  
  205.  
  206. mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement