Advertisement
jee7

TIA Tetris - Versioon 39

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