Advertisement
jee7

TIA Tetris - Versioon 38

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