Advertisement
boris-vlasenko

tetris1

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