Advertisement
boris-vlasenko

tetris2

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