Advertisement
jee7

TIA Tetris - Versioon 32

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