Advertisement
jee7

TIA Tetris - Versioon 35

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