Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import pygame, random, math
- def looKaart(laius, kõrgus, sümbol = 0):
- kaart = []
- for x in range(laius):
- kaart.append([])
- for y in range(kõrgus):
- kaart[x].append(sümbol)
- return kaart
- def kopeeriKaart(kaart1, kaart2):
- for x in range(len(kaart2)):
- for y in range(len(kaart2[0])):
- kaart1[x][y] = kaart2[x][y]
- return kaart1
- class Ruut:
- laius = 15
- def __init__(self, värv = 0):
- self.värv = värv
- def joonista(self, x, y):
- äärX = Kaart.äärX
- äärY = Kaart.äärY
- if self.värv == 0:
- pygame.draw.rect(ekraan, (20, 20, 20), (äärX + x * Ruut.laius, äärY + y * Ruut.laius, Ruut.laius, Ruut.laius))
- pygame.draw.rect(ekraan, (0, 0, 0), (äärX + x * Ruut.laius + 1, äärY + y * Ruut.laius + 1, Ruut.laius - 2, Ruut.laius - 2))
- else:
- värv = self.värv
- alumineVärv = (max(0, värv[0] - 10), max(0, värv[1] - 10), max(0, värv[2] - 10))
- pygame.draw.rect(ekraan, alumineVärv, (äärX + x * Ruut.laius, äärY + y * Ruut.laius, Ruut.laius, Ruut.laius))
- ülemineVärv = [min(üksVärv + 10, 255) for üksVärv in värv]
- pygame.draw.rect(ekraan, ülemineVärv, (äärX + x * Ruut.laius, äärY + y * Ruut.laius, Ruut.laius - 1, Ruut.laius - 1))
- pygame.draw.rect(ekraan, värv, (äärX + x * Ruut.laius + 1, äärY + y * Ruut.laius + 1, Ruut.laius - 2, Ruut.laius - 2))
- class Skoor:
- def __init__(self):
- self.skoor = 0
- def suurenda(self, ridadeArv):
- if ridadeArv == 1:
- self.skoor = self.skoor + 1
- elif ridadeArv == 2:
- self.skoor = self.skoor + 3
- elif ridadeArv == 3:
- self.skoor = self.skoor + 5
- elif ridadeArv == 4:
- self.skoor = self.skoor + 8
- def joonista(self):
- tekst = font.render("Skoor: " + str(self.skoor), True, (200, 200, 200))
- ekraan.blit(tekst, (5, 2))
- class Müra:
- def __init__(self, amplituud, sagedus, kasSujuv = True):
- self.punktid = random.sample(range(100000 * amplituud), sagedus)
- self.punktid = [x / 100000 for x in self.punktid]
- if kasSujuv:
- self.sujuvda()
- def sujuvda(self):
- uuedPunktid = [self.punktid[0]]
- for i in range(1, len(self.punktid) - 1):
- uuedPunktid.append(0.25 * self.punktid[i - 1] + 0.5 * self.punktid[i] + 0.25 * self.punktid[i+1])
- uuedPunktid.append(self.punktid[len(self.punktid) - 1])
- self.punktid = uuedPunktid
- def interpoleeri(self, eelmine, järgmine, x):
- x = x * math.pi
- kaal = 0.5 * (1 - math.cos(x))
- return eelmine * (1 - kaal) + järgmine * kaal
- def sämpli(self, x, laius):
- müraXtäpne = x * len(self.punktid) / laius
- müraX = int(müraXtäpne)
- müraY = int(self.interpoleeri(self.punktid[müraX - 1], self.punktid[müraX], müraX - müraXtäpne))
- return müraY
- #See klass hoiab väljaku seisu ja oskab seda joonistada
- class Kaart:
- laius = 10 #niipalju ruute laiuses
- kõrgus = 15 #niipalju ruute kõrguses
- äärX = 0
- äärY = 20
- tühiRuut = Ruut(0)
- reaKaotamiseAeg = 1000
- def __init__(self):
- #Teeme 2-mõõtmelise listi
- self.kaart = looKaart(self.laius, self.kõrgus)
- self.täisRead = []
- self.kasKaotanRidu = False
- self.kaotanRiduKaart = False
- self.kaotanRiduRead = []
- self.kaotanRiduAeg = False
- def joonista(self):
- #Joonistame ruudud
- for x, rida in enumerate(self.kaart):
- for y, lahter in enumerate(rida):
- kasJoonistas = False
- if lahter != 0:
- kasJoonistas = lahter.joonista(x, y)
- if lahter == 0:
- Kaart.tühiRuut.joonista(x, y)
- #Rea kaotamise animatsioon
- if self.kasKaotanRidu:
- vaheAeg = self.kaotanRiduAeg - pygame.time.get_ticks()
- if vaheAeg < 0:
- self.kaotanRiduAeg = False
- self.kaotanRiduRead = []
- self.kasKaotanRidu = False
- self.kaart = kopeeriKaart(self.kaart, self.kaotanRiduKaart)
- protsent = 1 - vaheAeg / Kaart.reaKaotamiseAeg
- for rida in self.kaotanRiduRead:
- eelminePunkt = False
- for x in range(0, int(protsent * Kaart.laius * Ruut.laius)):
- müraY = rida[1].sämpli(x, Kaart.laius * Ruut.laius)
- punkt = [x, Kaart.äärY + (rida[0]) * Ruut.laius + müraY]
- if eelminePunkt:
- pygame.draw.line(ekraan, (255, 255, 255), eelminePunkt, punkt)
- eelminePunkt = punkt
- def lisaKujund(self, kujund):
- kasSaabLisada = True
- for lokaalneX, rida in enumerate(kujund.kujund):
- for lokaalneY, lahter in enumerate(rida):
- if kujund.kujund[lokaalneX][lokaalneY]:
- kasSaabLisada &= self.kaart[kujund.x + lokaalneX][kujund.y + lokaalneY] == 0
- if kasSaabLisada:
- for lokaalneX, rida in enumerate(kujund.kujund):
- for lokaalneY, lahter in enumerate(rida):
- if kujund.kujund[lokaalneX][lokaalneY]:
- self.kaart[kujund.x + lokaalneX][kujund.y + lokaalneY] = kujund;
- return kasSaabLisada
- def kaotaRead(self):
- kaardiKoopia = looKaart(self.laius, self.kõrgus)
- kaardiKoopia = kopeeriKaart(kaardiKoopia, self.kaart)
- koopiaNihe = 0
- self.täisRead.sort()
- print(self.täisRead)
- for y in self.täisRead:
- print("Kaotame rea: " + str(y))
- self.kaotanRiduRead.append([y, Müra(Ruut.laius, 90)])
- for x in range(len(self.kaart)):
- for koopiaY in range(y, -1, -1):
- if koopiaY - koopiaNihe <= 0:
- kaardiKoopia[x][koopiaY] = 0
- else:
- kaardiKoopia[x][koopiaY] = kaardiKoopia[x][koopiaY - 1]
- self.täisRead = []
- print(self.täisRead)
- print("Ridade kaotamine läbi")
- #self.kaart = kopeeriKaart(self.kaart, kaardiKoopia)
- self.kaotanRiduKaart = kaardiKoopia
- self.kaotanRiduAeg = pygame.time.get_ticks() + Kaart.reaKaotamiseAeg
- self.kasKaotanRidu = True
- def uuenda(self, kujund):
- kasSaabLiikuda = kujund.y < len(self.kaart[0]) - len(kujund.kujund[0])
- if kasSaabLiikuda:
- for x in range(len(kujund.kujund)):
- for y in range(len(kujund.kujund[0])):
- 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):
- kasSaabLiikuda = False
- if not kasSaabLiikuda:
- break
- #Kui kujundi all on veel tühjasi ridu:
- if kasSaabLiikuda:
- kujund.liigu(self, pygame.K_DOWN)
- else:
- self.lukusta(kujund)
- def lukusta(self, kujund):
- #Kujund ei saa enam liikuda, lukustame selle kujundi (kirjutame värvid väljakule)
- print("Lukusta")
- kujund.kasElus = False
- for x in range(len(kujund.kujund)):
- for y in range(len(kujund.kujund[0])):
- if kujund.kujund[x][y]:
- self.kaart[kujund.x + x][kujund.y + y] = kujund.kujund[x][y]
- for y in range(len(kujund.kujund[0])):
- kasRidaTäis = True
- for x in range(len(self.kaart)):
- kasRidaTäis &= self.kaart[x][kujund.y + y] != 0
- if kasRidaTäis:
- self.täisRead.append(kujund.y + y)
- #Klass, mille objektid on erinevad kujundid
- class Kujund:
- def __init__(self, x, y, kujund, värv):
- self.x = x #Kujundi asukoht kaardil
- self.y = y
- self.kujund = kujund[0] #2-mõõtmeline list, mis hoiab kujundit
- self.pöörded = kujund
- self.pööre = 0
- self.värv = värv
- self.kasElus = True
- for pööre in self.pöörded:
- for x in range(len(pööre)):
- for y in range(len(pööre[x])):
- if pööre[x][y]:
- pööre[x][y] = Ruut(self.värv)
- def joonista(self, kaardiX, kaardiY):
- #Joonistame kujundi vastavatele kordinaatidele, kui kujund on seal
- x = kaardiX - self.x
- y = kaardiY - self.y
- if x >= 0 and y >= 0 and self.kujund[x][y]:
- self.kujund[x][y].joonista(kaardiX, kaardiY)
- return True
- else:
- return False
- def liigu(self, kaart, suund):
- deltaX = 0
- deltaY = 0
- #Leiame, kui palju liikuda mingites suundades
- if suund == pygame.K_LEFT:
- deltaX = -1
- elif suund == pygame.K_RIGHT:
- deltaX = 1
- elif suund == pygame.K_DOWN:
- deltaY = 1
- else:
- return
- #Vasakul võib olla tühjasi tulpi (et kujund oleks tsentris)
- vasakulTühjasiTulpi = 0
- for x in range(len(self.kujund)):
- kasTühi = True
- for y in range(len(self.kujund[0])):
- kasTühi &= not self.kujund[x][y]
- if kasTühi:
- vasakulTühjasiTulpi += 1
- else:
- break;
- #Vaatame, kas üldse saab liikuda vastavas suunas
- kasSaabLiikuda = True
- for x in range(len(self.kujund)):
- for y in range(len(self.kujund[0])):
- uusX = self.x + deltaX + x
- uusY = self.y + deltaY + y
- kasSaabLiikuda &= uusX >= -vasakulTühjasiTulpi
- kasSaabLiikuda &= uusY < len(kaart.kaart[0])
- kasSaabLiikuda &= uusX < len(kaart.kaart)
- if kasSaabLiikuda and self.kujund[x][y]:
- #Liikuda saab siis, kui kõik uued kujundi ruudud on hetkel tühjad
- kasSaabLiikuda &= (kaart.kaart[uusX][uusY] == 0 or kaart.kaart[uusX][uusY] == self)
- if kasSaabLiikuda:
- self.kustutaKaardilt(kaart)
- self.x += deltaX
- self.y += deltaY
- self.asetaKaardile(kaart)
- def pööra(self, kaart, kasVastupäeva):
- if kasVastupäeva:
- indeks = self.pööre + 1
- else:
- indeks = self.pööre - 1
- indeks %= len(self.pöörded)
- uusKujund = self.pöörded[indeks]
- kasSaabPöörata = True
- #Vaatame, kas üldse saab pöörata
- for x in range(len(uusKujund)):
- for y in range(len(uusKujund[0])):
- 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]):
- #Pööre viib kaardilt välja, ei saa pöörata
- kasSaabPöörata &= False
- continue
- if uusKujund[x][y] and (kaart.kaart[self.x + x][self.y + y] != 0 and kaart.kaart[self.x + x][self.y + y] != self):
- #Uus ruut ei ole vaba ruut, ei saa pöörata
- kasSaabPöörata &= False
- print("Saab pöörata: " + str(kasSaabPöörata))
- if kasSaabPöörata:
- self.kustutaKaardilt(kaart)
- self.pööre = indeks
- self.kujund = uusKujund
- self.asetaKaardile(kaart)
- def kustutaKaardilt(self, kaart):
- for x in range(len(self.kujund)):
- for y in range(len(self.kujund[0])):
- if self.kujund[x][y]:
- kaart.kaart[self.x + x][self.y + y] = 0
- def asetaKaardile(self, kaart):
- for x in range(len(self.kujund)):
- for y in range(len(self.kujund[0])):
- if self.kujund[x][y]:
- kaart.kaart[self.x + x][self.y + y] = self
- class KujundiGeneraator:
- def __init__(self):
- self.kujundid = [
- [ # --- kujund
- [[False, False, False, False], [True, True, True, True]],
- [[False, True], [False, True], [False, True], [False, True]]
- ],
- [ # _|_ kujund
- [[False, True, False], [True, True, True]],
- [[False, True, False], [False, True, True], [False, True, False]],
- [[False, False, False], [True, True, True], [False, True, False]],
- [[False, True], [True, True], [False, True]]
- ],
- [ # kasti kujund
- [[True, True], [True, True]]
- ],
- [ # |__ kujund
- [[True, False, False], [True, True, True]],
- [[True, True], [True, False], [True, False]],
- [[True, True, True], [False, False, True]],
- [[False, True], [False, True], [True, True]]
- ],
- [ # __| kujund
- [[True, True, True], [True, False, False]],
- [[True, True], [False, True], [False, True]],
- [[False, False, True], [True, True, True]],
- [[True, False], [True, False], [True, True]]
- ],
- [ # _|- kujund
- [[True, True, False], [False, True, True]],
- [[False, True], [True, True], [True, False]],
- ],
- [ # -|_ kujund
- [[False, True, True], [True, True, False]],
- [[True, False], [True, True], [False, True]],
- ],
- ]
- self.värvid = [
- (100, 0, 0),
- (100, 100, 0),
- (0, 100, 0),
- (0, 100, 100),
- (0, 0, 100),
- (100, 0, 100)
- ]
- def genereeri(self):
- return Kujund(10, 0, random.choice(self.kujundid), random.choice(self.värvid))
- class Mäng:
- algkiirus = 500
- def alusta(self):
- self.kaart = Kaart()
- self.skoor = Skoor()
- self.kujundiGeneraator = kujundiGeneraator = KujundiGeneraator()
- self.kasMängKäib = True
- self.kiirus = Mäng.algkiirus
- self.looKujund()
- pygame.time.set_timer(UUENDUS, self.kiirus)
- def looKujund(self):
- self.kujund = self.kujundiGeneraator.genereeri()
- self.kujund.x = len(self.kaart.kaart) // 2
- self.kasMängKäib &= self.kaart.lisaKujund(self.kujund)
- print("Lisa kujund")
- def joonista(self):
- self.kaart.joonista()
- self.skoor.joonista()
- if not self.kasMängKäib:
- taustaPind = pygame.Surface(aknaMõõtmed, pygame.SRCALPHA)
- taustaPind.fill((60, 60, 60, 200))
- ekraan.blit(taustaPind, (0,0))
- tekst = font.render("Mäng läbi!", True, (200, 40, 40))
- tekstiKast = tekst.get_rect()
- tekstiKast.centerx = aknaMõõtmed[0] // 2 - tekstiKast[0] // 2
- tekstiKast.centery = aknaMõõtmed[1] // 2 - 10
- ekraan.blit(tekst, tekstiKast)
- tekst = fontVäike.render("Vajuta [SPACE] jätkamiseks!", True, (220, 220, 220))
- tekstiKast = tekst.get_rect()
- tekstiKast.centerx = aknaMõõtmed[0] // 2 - tekstiKast[0] // 2
- tekstiKast.centery = aknaMõõtmed[1] // 2 + 10
- ekraan.blit(tekst, tekstiKast)
- def muudaKiirust(self):
- #self.kiirus = 2 * self.kiirus // 3
- self.kiirus = int(Mäng.algkiirus * 0.7 ** (self.skoor.skoor // 10))
- print("Uus kiirus: " + str(self.kiirus))
- def event(self, event):
- if self.kasMängKäib:
- if event.type == UUENDUS:
- self.eventUuendus()
- elif event.type == pygame.KEYDOWN:
- self.eventKlahvivajutus(event.key)
- else:
- self.eventMuu(event)
- else:
- if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
- self.alusta()
- def eventUuendus(self):
- if not self.kaart.kasKaotanRidu:
- if len(self.kaart.täisRead) > 0:
- pygame.time.set_timer(UUENDUS, 0)
- self.skoor.suurenda(len(self.kaart.täisRead))
- self.kaart.kaotaRead()
- self.kaart.joonista()
- self.muudaKiirust()
- pygame.time.set_timer(UUENDUS, self.kiirus)
- else:
- if not self.kujund.kasElus:
- self.looKujund()
- else:
- self.kaart.uuenda(self.kujund)
- def eventMuu(self, event):
- klahvid = pygame.key.get_pressed()
- if event.type == PÖÖRA_VP:
- if klahvid[pygame.K_q]:
- self.kujund.pööra(self.kaart, True)
- pygame.time.set_timer(PÖÖRA_VP, 100)
- else:
- pygame.time.set_timer(PÖÖRA_VP, 0)
- elif event.type == PÖÖRA_PP:
- if klahvid[pygame.K_w]:
- self.kujund.pööra(self.kaart, False)
- pygame.time.set_timer(PÖÖRA_PP, 100)
- else:
- pygame.time.set_timer(PÖÖRA_PP, 0)
- elif event.type == LIIGU:
- if klahvid[pygame.K_DOWN]:
- self.kujund.liigu(self.kaart, pygame.K_DOWN)
- pygame.time.set_timer(LIIGU, 100)
- elif klahvid[pygame.K_LEFT]:
- self.kujund.liigu(self.kaart, pygame.K_LEFT)
- pygame.time.set_timer(LIIGU, 100)
- elif klahvid[pygame.K_RIGHT]:
- self.kujund.liigu(self.kaart, pygame.K_RIGHT)
- pygame.time.set_timer(LIIGU, 100)
- else:
- pygame.time.set_timer(LIIGU, 0)
- def eventKlahvivajutus(self, klahv):
- if klahv == pygame.K_q:
- self.kujund.pööra(self.kaart, True)
- pygame.time.set_timer(PÖÖRA_VP, 300)
- elif klahv == pygame.K_w:
- self.kujund.pööra(self.kaart, False)
- pygame.time.set_timer(PÖÖRA_PP, 300)
- else:
- self.kujund.liigu(self.kaart, klahv)
- pygame.time.set_timer(LIIGU, 300)
- #Alustame Pygame asju
- pygame.init()
- #Vastava suurusega aken (globaalsed muutujad)
- aknaMõõtmed = [Ruut.laius * Kaart.laius, Ruut.laius * Kaart.kõrgus + 20]
- ekraan = pygame.display.set_mode(aknaMõõtmed)
- #Globaalne font
- font = pygame.font.SysFont("monospace", 14)
- fontVäike = pygame.font.SysFont("monospace", 12)
- #Globaalsed evendid
- UUENDUS = pygame.USEREVENT + 1
- LIIGU = pygame.USEREVENT + 2
- PÖÖRA_VP = pygame.USEREVENT + 3
- PÖÖRA_PP = pygame.USEREVENT + 4
- mäng = Mäng()
- mäng.alusta()
- while True:
- ekraan.fill((0,0,0))
- mäng.joonista()
- pygame.display.flip()
- pygame.time.delay(10)
- events = pygame.event.get()
- for event in events:
- mäng.event(event)
- if event.type == pygame.QUIT:
- #quit()
- exit()
- break;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement