所以我写了一个简单的匹配学校的图片,但它没有打开,IDLE没有给出错误。我得到的只是:
>>> ================================ 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)
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 :(得分:3)
您的程序没有调用您定义的任何函数的主要部分。执行baas()
之前的所有代码,但这只是加载常量。您需要调用初始化应用程序的函数。
编辑:
random.randint(0, len(linnud) - 1)
如果linnud
没有值,则表达式将计算为-1。这是一个无效的范围。
答案 1 :(得分:3)
您似乎无法在任何地方拨打baas()
。看起来你的脚本会设置一些变量,加载一些图像,然后退出。
尝试在您调用if __name__=="__main__":
的脚本末尾添加baas()
- 这意味着如果您的脚本直接运行,它将被调用。