Advertisement
jee7

TIA Tetris - Versioon 36

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