Advertisement
jee7

TIA Tetris - Versioon 33

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