2013-05-13 120 views
1

所以我寫了一個簡單的匹配學校的圖片,但它沒有打開,沒有在IDLE中給出錯誤。我得到的是:我的Pygame遊戲沒有打開,但沒有給出錯誤

>>> ================================ RESTART ================================ 
>>> 
>>> 

我不知道該從哪裏走。
非常抱歉,我的比賽在愛沙尼亞語中,也許這沒關係,但如果是這樣,我會將名稱翻譯成英文。

import pygame, sys, time, random 
from pygame.locals import * 
bg = pygame.image.load("bg.png") 

#Põhi muutujad (k - kast), nii on kergem hiljem muuta viga ainult ühes kohas 
kanimkiirus = 6 
rida = 5 
tulp = 5 
ksuurus = 50 
kvahe = 15 
fps = 35 
ekraanilaius = 640 
ekraanipikkus = 480 
kcolor = (255, 255, 255) 

kollane = pygame.image.load("1.png") 
punane = pygame.image.load("2.png") 
roheline = pygame.image.load("3.png") 
sinine = pygame.image.load("4.png") 
must = pygame.image.load("5.png") 

def baas(): 
     global baaskell, ekraan #Tegin need muutujad globaalseteks 
     pygame.init() 
     baaskell = pygame.time.Clock() 
     ekraan = pygame.display.set_mode([ekraanilaius, ekraanipikkus]) 
     ekraan.blit(bg, (0, 0)) 
     pygame.display.set_caption('Malukas') 

     #Need kaks muutujat hoiavad infot hiire asukoha kohta 
     hiirx = 0 
     hiiry = 0 

     baasLaud = looSuvalineLaud() 
     avatudKastid = tekitaAvatudKastideInfo(False) 

     """Need kaks järgnevat muutujat hoiavad infot kasutaja valikute kohta, kui mängija vajutab esimest korda kastile 
     saab esimeneSamm väärtuseks False ja esmineValik võrdub sellega, mis selle kasti all oli, kui oli kollane lind saab 
     selle väärtuseks see. Kui mängija vajutab järgmisele kastile saame kontrollida, kas teine valik on võrdne esimese valikuga""" 
     esimeneSamm = True 
     esimeneValik = None 

     alustaManguAnimatsiooni(baasLaud) #Mängu alguses näitab kogu lauda korra mängijale 

     while True: 
       klikitud = False 

       ekraan.blit(bg, (0, 0)) 
       joonistaLaud(baasLaud, avatudKastid) 

       #See tsükkel tegeleb sündmustega 
       for sündmus in pygame.event.get(): 
         if sündmus.type == QUIT or (sündmus.type == KEYUP and sündmus.key == K_ESCAPE): #Mängu sulgemiseks 
           pygame.quit() 
           sys.exit() 
         if sündmus.type == MOUSEMOTION: #Salvestab infot hiire asukoha kohta 
           hiirx, hiiry == sündmus.pos 
         if sündmus.type == MOUSEBUTTONUP: # 
           hiirx, hiiry = sündmus.pos 
           clicked = True 

       kastx, kasty = onKastiPeal(hiirx, hiiry) #Kui hiir liigub üle kasti, siis selle kasti kordinaadid salvestatakse siia 
       if kastx != None and kasty != None: 
         #Hiir on järelikult üle kasti 

         if not avatudKastid[kastx][kasty]: 
           raamistaKast(kastx, kasty) #See funktsioon loob raami ümber kasti, kui hiir liigub üle kasti 

         if klikitud and not avatudKastid[kastx][kasty]: 
           #Kasutaja klikkis avamata kastile 
           kastiAvamisAnimatsioon(baasLaud, [(kastx, kasty)], kanimkiirus) #See funktsioon tekitab kasti avamis animatsiooni 
           avatudKastid[kastx][kasty] = True 

           if esimeneSamm: 
             esimeneValik = (kastx, kasty) 
             esimeneSamm = False #Seame muutuja esimeneSamm väärtuse False ehk valeks, mis näitab, et mängija teeb oma teist valikut 
           else: 
             lind1 = leiaLind(baasLaud, esimeneValik[0], esimeneValik[1]) 
             lind2 = leiaLind(baasLaud, kastx, kasty) 

             if lind1 != lind2: #Katab uuesti kastid kinni, kui linnud ei sobi 
               time.sleep(0.8) 
               kastiKatmisAnimatsioon(baasLaud, [(esimeneValik[0], esimeneValik[1]), (kastx, kasty)], kanimkiirus) 
               avatudKastid[esimeneValik[0]][esimeneValik[1]] = False 
               avatudKastid[kastx][kasty] = False 
             elif onVoitnud(avatudKastid): #Kui kõik linnud on omavahel sobitatud 
               manguVoiduAnimatsioon(baasLaud) 
               time.sleep(2) 

               #Alustab mängu uuesti 
               baasLaud = looSuvalineLaud() 
               avatudKastid = tekitaAvatudKastideInfo(False) 

               #Näitab lände korra 
               joonistaLaud(baasLaud, avatudKastid) 
               pygame.display.update() 
               time.sleep(1) 

               #Mängib algus animatsiooni uuesti 
               alustaManguAnimatsiooni(baasLaud) 
             esimeneSamm = True #paneb mängija esimese sammu peale tagasi 

       pygame.display.update() 
       baaskell.tick(fps) 

def kastiVasakTipp(kastx, kasty): 
     #Arvutab kastide vahed 
     vahex = int((ekraanilaius - (rida * (ksuurus + kvahe)))/2) 
     vahey = int((ekraanipikkus - (tulp * (ksuurus + kvahe)))/2) 

     vasak = kastx * (ksuurus + kvahe) + vahex 
     tipp = kasty * (ksuurus + kvahe) + ymargin 

     return (left, top) 

def kujutaLind(lind, kastx, kasty): 
     vasak, tipp = kastiVasakTipp(kastx, kasty) 
     if lind == kollane: 
       ekraan.blit(kollane, (kastx, kasty)) 
     elif lind == punane: 
       ekraan.blit(punane, (kastx, kasty)) 
     elif lind == roheline: 
       ekraan.blit(roheline, (kastx, kasty)) 
     elif lind == sinine: 
       ekraan.blit(sinine, (kastx, kasty)) 
     elif lind == must: 
       ekraan.blit(must, (kastx, kasty)) 

def looSuvalineLaud(): 
     linnud = [kollane, punane, roheline, sinine, must] 
     random.shuffle(linnud) 
     mituIkooniKasutada = int(rida * tulp/2) 
     linnud = linnud[:mituIkooniKasutada] * 2 #ikoonide paarid 

     laud = [] 
     for x in range(tulp): 
       tulpa = [] 
       for y in range(rida): 
         suvalineIndeks = random.randint(0, len(icons) - 1) 
         tulpa.append(linnud[suvalineIndeks]) 
         del linnud[suvalineIndeks] 
       laud.append(column) 
     return laud 

def joonistaKastiKate(laud, b, kate): 
     vasak, tipp = kastiVasakTipp(b[0], b[1]) 
     pygame.draw.rect(ekraan, (vasak, tipp, ksuurus, ksuurus)) 
     lind = leiaLind(laud, b[0], b[1]) 
     kujutaLind(lind, b[0], b[1]) 
     if kate > 0: 
       pygame.draw.rect(ekraan, kcolor, (vasak, tipp, kate, ksuurus)) 

def kastiKatmisAnimatsioon(laud, kastid, kiirus): 
     for i in range(0, ksuurus): 
       for b in kastid: 
         joonistaKastiKate(laud, b, i) 
       pygame.display.update() 
       baaskell.tick(FPS) 

def kastiAvamisAnimatsioon(laud, kastid, kiirus): 
     for i in range(ksuurus, -kiirus - 1, -kiirus): 
       for b in kastid: 
         joonistaKastiKate(laud, b, i) 
       pygame.display.update() 
       baaskell.tick(FPS) 

def leiaLind(laud, kastx, kasty): 
     return laud[kastx][kasty][0], laud[kastx][kasty][1] 

def alustaManguAnimatsiooni(laud): 
     valeAvatudKastid = tekitaAvatudKastideInfo(False) 
     kastid = [] 
     for x in range(tulp): 
       for y in range(rida): 
         kastid.append((x, y)) 
     random.shuffle(kastid) 

     grupid = jagaGruppidesse(8, kastid) 

def jagaGruppidesse(grupiSuurus, list): 
     tulemus = [] 
     for i in range(0, len(list), grupiSuurus): 
       tulemus.append(list[i:i+grupiSuurus]) 
     return result 

def onVoitnud(avatud): 
     for i in avatud: 
       if False in i: 
         return False 
     return True 
def manguVoiduAnimatsioon(laud): 
     global kcolor 
     valeAvatudKastid = tekitaAvatudKastideInfo(True) 

     for i in range(14): 
       kcolor = kcolor 
       ekraan.blit(bg) 
       joonistaLaud(laud, valeAvatudKastid) 
       pygame.display.update() 
       time.sleep(0.3) 

def tekitaAvatudKastideInfo(vaartus): 
     andmed = [] 
     for c in range(tulp): 
       andmed.append([vaartus] * rida) 
     return andmed 

def joonistaLaud(laud, avatud): 
     for kastx in range(tulp): 
       for kasty in range(rida): 
         vasak, tipp = kastiVasakTipp(kastx, kasty) 
         if not avatud[kastx][kasty]: 
           pygame.draw.rect(ekraan, kcolor, (vasak, tipp, ksuurus, ksuurus)) 
         else: 
           lind = leiaLind(laud, kastx, kasty) 
           kujutaLind(lind, kastx, kasty) 

def onKastiPeal(x, y): 
     for kastx in range(tulp): 
       for kasty in range(rida): 
         vasak, tipp = kastiVasakTipp(kastx, kasty) 
         kastiKuju = pygame.rect(vasak, tipp, ksuurus, ksuurus) 
         if kastiKuju.collidepoint(x,y): 
           return (kastx, kasty) 
     return (None, None) 

def raamistaKast(kastx, kasty): 
     vasak, tipp = kastiVasakTipp(kastx, kasty) 
     pygame.draw.rect(ekraan, kcolor, (vasak - 5, tipp - 5, ksuurus + 10, ksuurus + 10), 4) 

Pastebin

Traceback (most recent call last): 
    File "C:\Users\John\Documents\Python\Lõputöö\pildid.py", line 232, in <module> 
    baas() 
    File "C:\Users\John\Documents\Python\Lõputöö\pildid.py", line 34, in baas 
    baasLaud = looSuvalineLaud() 
    File "C:\Users\John\Documents\Python\Lõputöö\pildid.py", line 139, in looSuvalineLaud 
    suvalineIndeks = random.randint(0, len(linnud) - 1) 
    File "C:\Python32\lib\random.py", line 214, in randint 
    return self.randrange(a, b+1) 
    File "C:\Python32\lib\random.py", line 192, in randrange 
    raise ValueError("empty range for randrange() (%d,%d, %d)" % (istart, istop, width)) 
ValueError: empty range for randrange() (0,0, 0) 
+0

如此多的嵌套塊/條件可能是錯誤代碼練習的標誌。您應該考慮這一點,也許不是將整塊代碼包裝在一個「if」塊中,而是先測試一個「非情況」,如果不是,則繼續正常工作而不必縮進。也;我們閱讀,回答並在stackoverflow上發佈問題,而不是pastebin。 – timss 2013-05-13 14:17:15

+0

你似乎沒有在任何地方調用'baas()'。它看起來像你的腳本將設置一些變量,加載一些圖像,然後退出。 – thegrinner 2013-05-13 14:19:38

+0

它看起來像你已經定義了所有的功能,但你永遠不會調用baas()函數來運行遊戲。 – ecline6 2013-05-13 14:20:08

回答

3

您似乎不會在任何地方撥打baas()。它看起來像你的腳本將設置一些變量,加載一些圖像,然後退出。

嘗試將if __name__=="__main__":添加到腳本末尾,您可以調用baas() - 這意味着如果腳本直接運行,它將被調用。

+1

謝謝!那是一個愚蠢的錯誤。好吧,現在我彈出窗口並停止響應,但這一次我也收到了一個錯誤。我將錯誤添加到了我原來的帖子中。 – Vasar 2013-05-13 15:38:49

3

您的程序沒有調用您定義的任何函數的主要部分。執行baas()之前的所有代碼,但只加載常量。您需要調用初始化應用程序的函數。

編輯:

random.randint(0, len(linnud) - 1) 

如果linnud沒有值,則表達式的值爲-1。這是一個無效的範圍。

相關問題