Advertisement
jee7

TIA Tetris - Versioon 26

Nov 20th, 2014
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.42 KB | None | 0 0
  1. import pygame, random
  2.  
  3.  
  4. def joonistaRuut(x, y, värv):
  5.     alumineVärv = (max(0, värv[0] - 10), max(0, värv[1] - 10), max(0, värv[2] - 10))
  6.     pygame.draw.rect(ekraan, alumineVärv, (x * ruuduLaius, y * ruuduLaius, ruuduLaius, ruuduLaius))
  7.  
  8.     ülemineVärv = [min(üksVärv + 10, 255) for üksVärv in värv]
  9.     pygame.draw.rect(ekraan, ülemineVärv, (x * ruuduLaius, y * ruuduLaius, ruuduLaius - 1, ruuduLaius - 1))
  10.  
  11.     pygame.draw.rect(ekraan, värv, (x * ruuduLaius + 1, y * ruuduLaius + 1, ruuduLaius - 2, ruuduLaius - 2))
  12.  
  13.    
  14.  
  15. #See klass hoiab väljaku seisu ja oskab seda joonistada
  16. class Kaart:
  17.     laius = 20  #niipalju ruute laiuses
  18.     kõrgus = 40 #niipalju ruute kõrguses
  19.  
  20.     def __init__(self):
  21.         #Teeme 2-mõõtmelise listi
  22.         self.kaart = []
  23.         for x in range(Kaart.laius):
  24.             self.kaart.append([])
  25.             for y in range(Kaart.kõrgus):
  26.                 self.kaart[x].append(0)
  27.  
  28.     def joonista(self):
  29.         #Joonistame ruudud
  30.         for x, rida in enumerate(self.kaart):
  31.             for y, lahter in enumerate(rida):
  32.                 kasJoonistas = False
  33.                 if lahter != 0:
  34.                     if isinstance(lahter, Kujund):
  35.                         kasJoonistas = lahter.joonista(x, y)
  36.                     else:
  37.                         joonistaRuut(x, y, lahter)
  38.                         kasJoonistas = True
  39.                    
  40.                 if lahter == 0:
  41.                     pygame.draw.rect(ekraan, (20, 20, 20), (x * ruuduLaius, y * ruuduLaius, ruuduLaius, ruuduLaius))
  42.                     pygame.draw.rect(ekraan, (0, 0, 0), (x * ruuduLaius + 1, y * ruuduLaius + 1, ruuduLaius - 2, ruuduLaius - 2))
  43.                 elif not kasJoonistas:
  44.                     #Seda osa ei tohiks kunagi juhtuda... kustutada pärast ära.
  45.                     pygame.draw.rect(ekraan, (80, 20, 20), (x * ruuduLaius, y * ruuduLaius, ruuduLaius, ruuduLaius))
  46.                     pygame.draw.rect(ekraan, (60, 0, 0), (x * ruuduLaius + 1, y * ruuduLaius + 1, ruuduLaius - 2, ruuduLaius - 2))
  47.  
  48.  
  49.     def lisaKujund(self, kujund):
  50.         for lokaalneX, rida in enumerate(kujund.kujund):
  51.             for lokaalneY, lahter in enumerate(rida):
  52.                 if kujund.kujund[lokaalneX][lokaalneY]:
  53.                     self.kaart[kujund.x + lokaalneX][kujund.y + lokaalneY] = kujund;
  54.  
  55.     def uuenda(self, kujund):
  56.  
  57.         kasSaabLiikuda = kujund.y < len(self.kaart[0]) - len(kujund.kujund[0])
  58.         if kasSaabLiikuda:
  59.             for x in range(len(kujund.kujund)):
  60.                 for y in range(len(kujund.kujund[0])):
  61.                     if (kujund.kujund[x][y] and (y + 1 == len(kujund.kujund[0]) or not kujund.kujund[x][y + 1]) and self.kaart[x + kujund.x][y + kujund.y + 1] != 0):
  62.                         kasSaabLiikuda = False
  63.  
  64.                     if not kasSaabLiikuda:
  65.                         break
  66.  
  67.         #Kui kujundi all on veel tühjasi ridu:
  68.         if kasSaabLiikuda:
  69.             kujund.liigu(self, pygame.K_DOWN)
  70.         else:
  71.             self.lukusta(kujund)
  72.  
  73.  
  74.     def lukusta(self, kujund):
  75.         #Kujund ei saa enam liikuda, lukustame selle kujundi (kirjutame värvid väljakule)
  76.         print("Lukusta")
  77.         kujund.kasElus = False
  78.         for x in range(len(kujund.kujund)):
  79.             for y in range(len(kujund.kujund[0])):
  80.                 if kujund.kujund[x][y]:
  81.                     self.kaart[kujund.x + x][kujund.y + y] = kujund.värv
  82.        
  83. #Klass, mille objektid on erinevad kujundid
  84. class Kujund:
  85.  
  86.     def __init__(self, x, y, kujund, värv):
  87.         self.x = x             #Kujundi asukoht kaardil
  88.         self.y = y          
  89.         self.kujund = kujund[0]   #2-mõõtmeline list, mis hoiab kujundit
  90.         self.pöörded = kujund
  91.         self.pööre = 0
  92.         self.värv = värv
  93.         self.kasElus = True
  94.  
  95.     def joonista(self, kaardiX, kaardiY):
  96.         #Joonistame kujundi vastavatele kordinaatidele, kui kujund on seal
  97.         x = kaardiX - self.x
  98.         y = kaardiY - self.y
  99.         if x >= 0 and y >= 0 and self.kujund[x][y]:
  100.             joonistaRuut(kaardiX, kaardiY, self.värv)
  101.  
  102.             return True
  103.         else:
  104.  
  105.             return False
  106.  
  107.     def liigu(self, kaart, suund):
  108.         deltaX = 0
  109.         deltaY = 0
  110.  
  111.         #Leiame, kui palju liikuda mingites suundades
  112.         if suund == pygame.K_LEFT:
  113.             deltaX = -1
  114.         elif suund == pygame.K_RIGHT:
  115.             deltaX = 1
  116.         elif suund == pygame.K_DOWN:
  117.             deltaY = 1
  118.         else:
  119.             return
  120.  
  121.         #Vasakul võib olla tühjasi tulpi (et kujund oleks tsentris)
  122.         vasakulTühjasiTulpi = 0
  123.         for x in range(len(self.kujund)):
  124.             kasTühi = True
  125.             for y in range(len(self.kujund[0])):
  126.                 kasTühi &= not self.kujund[x][y]
  127.  
  128.             if kasTühi:
  129.                 vasakulTühjasiTulpi += 1
  130.             else:
  131.                 break;
  132.  
  133.         #Vaatame, kas üldse saab liikuda vastavas suunas
  134.         kasSaabLiikuda = True
  135.         for x in range(len(self.kujund)):
  136.             for y in range(len(self.kujund[0])):
  137.                 uusX = self.x + deltaX + x
  138.                 uusY = self.y + deltaY + y
  139.                 kasSaabLiikuda &= uusX >= -vasakulTühjasiTulpi
  140.                 kasSaabLiikuda &= uusY < len(kaart.kaart[0])
  141.                 kasSaabLiikuda &= uusX < len(kaart.kaart)
  142.                 if kasSaabLiikuda and self.kujund[x][y]:
  143.                     #Liikuda saab siis, kui kõik uued kujundi ruudud on hetkel tühjad
  144.                     kasSaabLiikuda &= (kaart.kaart[uusX][uusY] == 0 or kaart.kaart[uusX][uusY] == self)
  145.  
  146.         if kasSaabLiikuda:
  147.             self.kustutaKaardilt(kaart)
  148.             self.x += deltaX
  149.             self.y += deltaY
  150.             self.asetaKaardile(kaart)
  151.  
  152.  
  153.     def pööra(self, kaart, kasVastupäeva):
  154.         if kasVastupäeva:
  155.             indeks = self.pööre + 1
  156.         else:
  157.             indeks = self.pööre - 1
  158.  
  159.         indeks %= len(self.pöörded)
  160.         uusKujund = self.pöörded[indeks]
  161.         kasSaabPöörata = True
  162.  
  163.         #Vaatame, kas üldse saab pöörata
  164.         for x in range(len(uusKujund)):
  165.             for y in range(len(uusKujund[0])):
  166.                 if self.x + x < 0 or self.x + x >= len(kaart.kaart) or self.y + y < 0 or self.y + y >= len(kaart.kaart[0]):
  167.                     #Pööre viib kaardilt välja, ei saa pöörata
  168.                     kasSaabPöörata &= False
  169.                     continue
  170.                
  171.                 if uusKujund[x][y] and (kaart.kaart[self.x + x][self.y + y] != 0 and kaart.kaart[self.x + x][self.y + y] != self):
  172.                     #Uus ruut ei ole vaba ruut, ei saa pöörata
  173.                     kasSaabPöörata &= False
  174.  
  175.         print("Saab pöörata: " + str(kasSaabPöörata))
  176.         if kasSaabPöörata:
  177.             self.kustutaKaardilt(kaart)
  178.             self.pööre = indeks
  179.             self.kujund = uusKujund
  180.             self.asetaKaardile(kaart)
  181.            
  182.  
  183.     def kustutaKaardilt(self, kaart):
  184.         for x in range(len(self.kujund)):
  185.                 for y in range(len(self.kujund[0])):
  186.                     if self.kujund[x][y]:
  187.                         kaart.kaart[self.x + x][self.y + y] = 0
  188.  
  189.  
  190.     def asetaKaardile(self, kaart):
  191.         for x in range(len(self.kujund)):
  192.                 for y in range(len(self.kujund[0])):
  193.                     if self.kujund[x][y]:
  194.                         kaart.kaart[self.x + x][self.y + y] = self
  195.  
  196.        
  197.  
  198. class KujundiGeneraator:
  199.  
  200.     def __init__(self):
  201.         self.kujundid = [
  202.             [ # --- kujund
  203.                 [[False, False, False], [True, True, True]],
  204.                 [[False, True], [False, True], [False, True]]
  205.             ],
  206.             [ # _|_ kujund
  207.                 [[False, True, False], [True, True, True]],
  208.                 [[False, True, False], [False, True, True], [False, True, False]],
  209.                 [[False, False, False], [True, True, True], [False, True, False]],
  210.                 [[False, True], [True, True], [False, True]]
  211.             ]
  212.         ]
  213.         self.värvid = [
  214.             (100, 0, 0),
  215.             (0, 100, 0),
  216.             (0, 0, 100)
  217.         ]
  218.  
  219.     def genereeri(self):
  220.  
  221.         return Kujund(10, 10, random.choice(self.kujundid), random.choice(self.värvid))
  222.    
  223.        
  224. #Globaalne ruudu laius/kõrgus
  225. ruuduLaius = 15
  226. #Vastava suurusega aken
  227. ekraan = pygame.display.set_mode([ruuduLaius * Kaart.laius, ruuduLaius * Kaart.kõrgus])
  228. #Meie kaart
  229. kaart = Kaart()
  230.  
  231. kujundiGeneraator = KujundiGeneraator()
  232. kujund = kujundiGeneraator.genereeri()
  233. kaart.lisaKujund(kujund)
  234.  
  235. UUENDUS = pygame.USEREVENT + 1
  236. pygame.time.set_timer(UUENDUS, 500)
  237.  
  238.  
  239. while True:
  240.     ekraan.fill((0,0,0))
  241.  
  242.     kaart.joonista()
  243.    
  244.  
  245.     pygame.display.flip()
  246.     pygame.time.delay(10)
  247.  
  248.     events = pygame.event.get()
  249.     for oneEvent in events:
  250.         if oneEvent.type == UUENDUS:
  251.             kaart.uuenda(kujund)
  252.             if not kujund.kasElus:
  253.                 kujund = kujundiGeneraator.genereeri()
  254.                 kaart.lisaKujund(kujund)
  255.  
  256.         if oneEvent.type == pygame.KEYDOWN:
  257.             if oneEvent.key == pygame.K_q:
  258.                 kujund.pööra(kaart, True)
  259.             elif oneEvent.key == pygame.K_w:
  260.                 kujund.pööra(kaart, False)
  261.             else:
  262.                 kujund.liigu(kaart, oneEvent.key)
  263.            
  264.         if oneEvent.type == pygame.QUIT:
  265.             #quit()
  266.             exit()
  267.             break;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement