Python/Pygame wont display any error messages when it just crashes

Question:

Im trying to implement a upgrade system in my game and it just breaks after you buy something 4 times which is not what i want i just want it to go on forever.
And Py/Pygame doesnt give me any Error Messages.

I tried changing the font from Helvetica to Segou UI
,That didnt work either

from xml.sax import SAXNotRecognizedException
import pygame
import random
import math
pygame.font.init()
pygame.init
StaticFont = "Segou UI"
originalDisplayHeight = 500
originalDisplayWidth = 500
win = pygame.display.set_mode((500,500),pygame.RESIZABLE)
pygame.display.set_caption("Block Ultima")
run = True
NewWave = 20
# Description for upgrade
def DrawUpgradeDescription(Type):
    if Type == 0:
        DrawText("Increases Crash Damage!",250,350,15,StaticFont,100,100,100,True)
    if Type == 1:
        DrawText("Makes enemy bullets hurt less!",250,350,15,StaticFont,100,100,100,True)
    if Type == 2:
        DrawText("Makes you faster!",250,350,15,StaticFont,100,100,100,True)
    if Type == 3:
        DrawText("Gives you 3% more gold per upgrade!",250,350,15,StaticFont,100,100,100,True)
    if Type == 4:
        DrawText("Gives you a dash ability!",250,350,15,StaticFont,100,100,100,True)
    if Type == 5:
        DrawText("Makes your ship hull stronger!",250,350,15,StaticFont,100,100,100,True)
    if Type == 6:
        DrawText("Increases your max Fuel!",250,350,15,StaticFont,100,100,100,True)
    if Type == 7:
        DrawText("Makes your crash fuelcells bigger!",250,350,15,StaticFont,100,100,100,True)
# Gold Cost for upgrades
def GenerateGoldCost(Type,Amount):
    cost = 0
    if Type == 0:
        cost = 1+Amount
    if Type == 1:
        cost = (5*Amount+1)*(Amount//2+1)
    if Type == 2:
        cost = 2*(Amount+1)
    if Type == 3:
        cost = 5*(((Amount+1)**2)/2)
    if Type == 4:
        cost = 2*((Amount+1)**3)
    if Type == 5:
        cost = 4*(Amount+1)
    if Type == 6:
        cost = 4*(Amount+1)
    if Type == 7:
        cost = 4*(Amount+1)
    return(cost)

# Fuel box generation

def fuelGenerator():
    boxX.append(random.randint(0,490))
    boxY.append(random.randint(0,490))
    if random.randint(1,4) == 4:
        boxType = "hp"
    else:
        boxType = "fuel"
    Box.append(boxType)

# Next Wave Also refills the enemies
def nextWave():
    global enemiesToBeSpawned
    global wave
    global NewWave
    if enemiesToBeSpawned == 0:
        if len(enemyHP) == 0:
            NewWave = 20
            wave = wave + 1
            if wave < 5:
                enemiesToBeSpawned = wave
            else:
                enemiesToBeSpawned = 5+((wave)%3)


# Despawn Bullets
def despawnBullets(i):
    BulletX.pop(i)
    BulletVelocityX.pop(i)
    BulletY.pop(i)
    BulletVelocityY.pop(i)
    BulletTeam.pop(i)
    

# Spawn enemies


def spawnEnemy():
    global enemiesToBeSpawned
    if enemiesToBeSpawned > 0:
        enemiesToBeSpawned = enemiesToBeSpawned -1
        X = random.randint(0,500)
        Y = random.randint(0,500)
        
        if random.randint(0,1) == 1:
            if X > 250:
                X = 0
            else: 
                X = 500
        else:
            if Y > 250:
                Y = 0
            else:
                Y = 500
        enemyX.append(X)
        enemyY.append(Y)
        enemyFireCooldownCalculate = 60 - wave//2
        if enemyFireCooldownCalculate <= 25:
            enemyFireCooldownCalculate = 30
        enemyHP.append(50+(wave*25))
        enemySpeed.append(0.5)
        enemyFireCooldown.append(enemyFireCooldownCalculate)
        enemyHeight.append(5)
        enemyWidth.append(5)

# The name says it all
def enemyDegreesTowardPlayer(x1,y1,x2,y2):
    radianAngle = math.atan2((y2-y1),(x2-x1))
    return(radianAngle)

# Random number generator
def Random(base ,randoriginal):
    rand = randoriginal*2
    rand = random.randint(0,rand)
    rand = randoriginal-rand
    base = base + rand
    return(base)

# Calculate the smallest for height and width
# CalculateHeightANDwidthIntoSmallesT = CHADIST
def CHADIST():
    if win.get_width() > win.get_height():
        return(win.get_height())
    else:
        return(win.get_width())

# Draw Next Wave
def DrawWave():
    global NewWave
    if NewWave > 0:
        NewWave=NewWave-1
        DrawText("Wave " + str(wave),100,50,30,"Segoe UI",120,240,240,True)



# Draw Rectangle(resizes with screen)
def DrawRect(surface,R,G,B,X,Y,W,H):
    pygame.draw.rect((surface),(R,G,B), (((CHADIST()/originalDisplayWidth)*X)+((win.get_width()-CHADIST())/2),((CHADIST()/originalDisplayHeight)*Y)+((win.get_height()-CHADIST())/2), (CHADIST()/originalDisplayWidth)*W, (CHADIST()/originalDisplayHeight)*H))

# Draw Rectangle thats Centered(resizes with screen)
def DrawRectCentered(surface,R,G,B,X,Y,W,H):
    X = X-W/2
    Y = Y-H/2
    pygame.draw.rect((surface),(R,G,B), (((CHADIST()/originalDisplayWidth)*X)+((win.get_width()-CHADIST())/2),((CHADIST()/originalDisplayHeight)*Y)+((win.get_height()-CHADIST())/2), (CHADIST()/originalDisplayWidth)*W, (CHADIST()/originalDisplayHeight)*H))

# Draw Text at X,Y with specific size,font and RGB (resizes with screen)
def DrawText(text,X,Y,Size,font,R,G,B,Boolean):
    font = pygame.font.SysFont(font, math.floor((CHADIST()/originalDisplayHeight)*Size))
    textSurface = font.render(text, Boolean, (R, G, B))
    textrect = textSurface.get_rect(center= ( math.floor(((CHADIST()/originalDisplayWidth)*X)+((win.get_width()-CHADIST())/2)),math.floor(((CHADIST()/originalDisplayHeight)*Y)+((win.get_height()-CHADIST())/2)) ))
    win.blit(textSurface, textrect)

# Draws an Image
def DrawImage(X,Y,imgname,rotation):
    image = pygame.image.load(imgname)
    Size = image.get_size()
    ratio = (CHADIST()/originalDisplayWidth)
    image1 = pygame.transform.scale(image ,(math.floor(ratio*Size[0]) , math.floor(ratio*Size[1])) ) 
    image2 = pygame.transform.rotate(image1, rotation)
    imgRect = image2.get_rect(center= ( math.floor(((CHADIST()/originalDisplayWidth)*X)+((win.get_width()-CHADIST())/2)),math.floor(((CHADIST()/originalDisplayHeight)*Y)+((win.get_height()-CHADIST())/2)) ))
    win.blit(image2, imgRect)

### Menu Variables
gold = 0
upgradetype = []
upgradeCount = []

listOfUpgradeTypes = [0,1,2,3,4,5,6,7]

listOfUpgradesNumber = [0,0,0,0,0,0,0,0]

Damage = 0
buyTypeNumber = 0
alreadychanged1 = 0

Buy = False

alive = True
restart = 1
gameWindow = "game"
while run:
    if restart == 1:
        restart = 0
        ## Variables
        # Player variables
        x = 250
        y = 250
        width = 5
        height = 5
        hp = 100
        hpmax = 100
        fuel = 25
        fuelmax = 25
        chargemeter = 0
        chargemax = 25
        i10 = 0
        i11 = 0

        # Movement variables , VelChange is speed
        velChange = 0.1
        velocityX = 0
        velocityY = 0

        # Trail variables
        xold = []
        yold = []

        # Enemy X,Y,HP,Speed,Firing cooldown
        enemyX = []
        enemyY = []
        enemyHP = []
        enemySpeed = []
        enemyFireCooldown = []

        # Enemy Hitbox
        enemyHeight = []
        enemyWidth = []

        # Enemy Spawn
        enemySpawnCooldown = 30
        wave = 0
        i3 = 0
        enemiesToBeSpawned = 0
        NewWave = 20

        # Enemy Bullet X,Y,VelocityX,VelocityY
        BulletX = []
        BulletY = []
        BulletVelocityX = []
        BulletVelocityY = []
        BulletTeam = []

        # Fuel boxes
        boxX = []
        boxY = []
        Box = []

        # Define Keys
        chargeon = 0

        # Define Effects
        EffectsType = []
        Effects1 = []
        Effects2 = []
        fuelGenerator()

        ### Menu variables

        # Gold variables
        enemyDeathCountThisRun = 0
    pygame.time.delay(16)
    if listOfUpgradesNumber[0] > 0:
        Damage = 0.1*listOfUpgradesNumber[0]
    else:
        Damage = 0.1
    if listOfUpgradesNumber[1] > 0:
        Defence = 0.1*listOfUpgradesNumber[1]
    else:
        Defence = 0
    if listOfUpgradesNumber[2] > 0:
        velChange = 0.1*listOfUpgradesNumber[2]
    if listOfUpgradesNumber[3] > 0:
        goldMultiplier = 1.4**listOfUpgradesNumber[3]
    else:
        goldMultiplier = 1
    if 4 in listOfUpgradesNumber:
        break
    if listOfUpgradesNumber[5] >= 0:
        hpmax= 100+25*listOfUpgradesNumber[5]
    if listOfUpgradesNumber[6] >= 0:
        fuelmax= 25+5*listOfUpgradesNumber[6]
    if listOfUpgradesNumber[7] >= 0:
        chargemax= 25+5*listOfUpgradesNumber[7]
        

    keys = pygame.key.get_pressed() 
    if keys[pygame.K_m]:
        if gameWindow == "menu":
            if alreadychanged == 0:
                gameWindow = "game"
                alreadychanged = 1
        if gameWindow == "game":
            if alreadychanged == 0:
                gameWindow = "menu"
                alreadychanged = 1
    else:
        alreadychanged = 0

    for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    run = False 
    
    if gameWindow == "game":
        nextWave()
        chargeon = 0
        if alive == True:
            Drag = 1.05
            if keys[pygame.K_LEFT]:
                velocityX = velocityX - velChange
                Drag = 1.01
            if keys[pygame.K_RIGHT]:
                velocityX = velocityX + velChange
                Drag = 1.01
            if keys[pygame.K_UP]:
                velocityY = velocityY - velChange
                Drag = 1.01
            if keys[pygame.K_DOWN]:    
                velocityY = velocityY + velChange
                Drag = 1.01
            if event.type == pygame.MOUSEBUTTONDOWN:    
                Lmb = pygame.mouse.get_pressed()
                if Lmb[0]:
                    chargeon = 1


        tryRestart = 0

        if keys[pygame.K_SPACE]:
            tryRestart = 1

        if chargemeter <= 0:
            charge = 0
            chargeon = 0
        i = 0
        while i < len(EffectsType):
            if Effects1[i] > Effects2[i]:
                Effects1[i] = Effects1[i] - 1
            else:
                Effects1.pop(i)
                Effects2.pop(i)
                EffectsType.pop(i)
            i=i+1

        if ("ChargeCooldown" in EffectsType) == False:
            if chargeon == 1:
                charge = 1
                chargeon = 0
                EffectsType.append("ChargeInvincibility")
                Effects1.append(60)
                Effects2.append(0)
                EffectsType.append("ChargeCooldown")
                Effects1.append(120)
                Effects2.append(0)

        velocityX = velocityX/Drag
        velocityY = velocityY/Drag

        x = x + velocityX
        y = y + velocityY
        # Check if player has went out of bounds
        if x > (500-width/2):
            x = 500 - width/2
            velocityX = 0 - velocityX
        if x < (0+width/2):
            x = 0+width/2
            velocityX = 0 - velocityX
        if y > (500-height/2):
            y = 500 - height
            velocityY = 0 - velocityY
        if y < (0+height/2):
            y = 0+height/2
            velocityY = 0 - velocityY




    
        win.fill((0,0,0))

        # Check for chargemeter
        if chargemeter <= 0:
            charge = 0

        # Enemy Movement and Damage
        i2 = 0
        while i2 < len(enemySpeed):
            radiansVar = enemyDegreesTowardPlayer(x,y,enemyX[i2],enemyY[i2])
            enemyDistanceFromPlayer = math.sqrt((x-enemyX[i2])**2+(y-enemyY[i2])**2)
            if charge == 1:
                if enemyDistanceFromPlayer < 20:
                    enemyHP[i2] =  enemyHP[i2]-((2*(math.sqrt((velocityX)**2+(velocityY)**2)))*(Damage+1))
            if enemyDistanceFromPlayer > 120:
                enemyX[i2]=   enemyX[i2]-math.cos(radiansVar)*enemySpeed[i2]
                enemyY[i2]=   enemyY[i2]-math.sin(radiansVar)*enemySpeed[i2]
            i2 = i2 + 1

        # Bullet and Enemy Collision
        i15 = 0
        while i15 < len(enemyX):
            i16=0
            while i16 < len(BulletX):
                if BulletTeam[i16] == "Player":
                    enemyDistanceFromPlayer = math.sqrt((BulletX[i16]-enemyX[i15])**2+(BulletY[i16]-enemyY[i15])**2)
                    if enemyDistanceFromPlayer < 20:
                        enemyHP[i15] =  enemyHP[i15]-(0.1*(math.sqrt((BulletX[i16]-BulletVelocityX[i16])**2+(BulletY[i16]-BulletVelocityY[i16])**2)))
                        BulletX.pop(i16)
                        BulletVelocityX.pop(i16)
                        BulletY.pop(i16)
                        BulletVelocityY.pop(i16)
                        BulletTeam.pop(i16)
                        break
                i16=i16+1
            i15=i15+1
        
        
        # Enemy Death
        i6 = 0
        while i6 < len(enemySpeed):
            if enemyHP[i6] <= 0:
                enemyHP.pop(i6)
                enemySpeed.pop(i6)
                enemyX.pop(i6)
                enemyY.pop(i6)
                enemyFireCooldown.pop(i6)
                enemyDeathCountThisRun = enemyDeathCountThisRun + 1
            i6 = i6+1
        
        # Enemy Spawning
        
        if enemySpawnCooldown <= i3:
            spawnEnemy()
            i3 = 0
        i3 = i3 + 1

        # Enemy anti Cliping
        i51 = 0
        i52 = 0
        while i51 < len(enemySpeed):
            while i52 < len(enemySpeed):
                if i51 == i52:
                    break
                radiansVar = enemyDegreesTowardPlayer(enemyX[i51],enemyY[i51],enemyX[i52],enemyY[i52])
                enemyDistanceFromPlayer = math.sqrt((enemyX[i51]-enemyX[i52])**2+(enemyY[i51]-enemyY[i52])**2)
                if enemyDistanceFromPlayer < 5:
                    enemyX[i51]=   enemyX[i51]-math.cos(radiansVar)*enemySpeed[i51]
                    enemyY[i51]=   enemyY[i51]-math.sin(radiansVar)*enemySpeed[i51]
                i52 = i52 +1
            i51 = i51 + 1
            i52 = 0



        # Enemy Firing
        i7 = 0
        while i7 < len(enemySpeed):
            radiansVar = enemyDegreesTowardPlayer(x,y,enemyX[i7],enemyY[i7])
            if enemyFireCooldown[i7] == 0:
                BulletVelocityX.append((math.cos(radiansVar))*2)
                BulletVelocityY.append((math.sin(radiansVar))*2)
                BulletX.append(enemyX[i7])
                BulletY.append(enemyY[i7])
                BulletTeam.append("Enemy")
                enemyFireCooldown[i7] = 61
            enemyFireCooldown[i7] = enemyFireCooldown[i7] - 1
            i7 = i7 +1

        # Enemy Bullet Velocity
        i9 = 0
        while i9 < len(BulletY):
            BulletY[i9] = BulletY[i9] - BulletVelocityY[i9]
            BulletX[i9] = BulletX[i9] - BulletVelocityX[i9]
            i9=i9+1
        # Check if bullets are offscreen
        i=0
        while i < len(BulletX):
            if BulletX[i] > (500-width/2):
                despawnBullets(i)
                break
            if BulletX[i] < 0+width/2:
                despawnBullets(i)
            i=i+1
        i=0
        while i < len(BulletX):
            if BulletY[i] > (500-height/2):
                despawnBullets(i)
                break
            if BulletY[i] < 0+height/2:
                despawnBullets(i)
            i=i+1
            
            
        # stats draw
        hpbar = hp/hpmax*500
        fuelbar = fuel/fuelmax*500
        chargebar = chargemeter/chargemax*500

        # Fuel to charge 
        if chargemax > chargemeter:
            if fuel > 0:
                fuel = fuel - 0.1
                chargemeter = chargemeter + 0.1

        # Charge used up
        if charge == 1:
            chargemeter = chargemeter - 0.5

        # Box collison
        i11 = 0
        while i11 < len(Box):
            enemyDistanceFromPlayer = math.sqrt((x-boxX[i11])**2+(y-boxY[i11])**2)
            if enemyDistanceFromPlayer < 20:
                if Box[i11] == "fuel":
                    fuel = fuel + 25
                if Box[i11] == "hp":
                    hp = hp + 25
                boxX.pop(0)
                boxY.pop(0)
                Box.pop(0)
            i11 = i11+1
        
        

        # Charge,Fuel overflow/underflow check
        if chargemeter < 0:
            chargemeter = 0
        if chargemeter >= chargemax:
            chargemeter = chargemax
        if fuel < 0:
            fuel = 0
        if fuel >= fuelmax:
            fuel = fuelmax

        # Hp Overflow check
        if hp > hpmax:
            hp = hpmax

        # Generate fuel boxes around the map
        if 1 > len(Box):
            fuelGenerator()


        # Check for bullet and player collision
        i14 = 0
        while i14 < len(BulletY):
            bulletDistanceFromPlayer = math.sqrt((x-BulletX[i14])**2+(y-BulletY[i14])**2)
            if bulletDistanceFromPlayer < 10:
                if ("ChargeInvincibility" in EffectsType) == False:
                    if BulletTeam[i14] == "Enemy":
                        enemydmg = (20+wave)-Defence
                        if enemydmg <= 0:
                            enemydmg = 1
                        hp = hp - enemydmg
                else:
                    if BulletTeam[i14] == "Enemy":
                        BulletVelocityY[i14] = 0 - BulletVelocityY[i14] 
                        BulletVelocityX[i14] = 0 - BulletVelocityX[i14] 
                        BulletTeam[i14] = "Player"
                if ("ChargeInvincibility" in EffectsType) == False:
                    BulletX.pop(i14)
                    BulletY.pop(i14)
                    BulletVelocityX.pop(i14)
                    BulletVelocityY.pop(i14)
            i14 = i14 + 1 

        ### Drawing
        ## Game Layer
        # Draw Fuel boxes
        i13 = 0
        while i13 < len(Box):
            if Box[i13] == "fuel":
                DrawRect(win,90,90,90, boxX[i13], boxY[i13], 10, 10)
            if Box[i13] == "hp":
                DrawRect(win,90,150,90, boxX[i13], boxY[i13], 10, 10)
            i13 = i13 +1
        
        # Player trails
        if len(xold) > 10:
            xold.pop(0)
        if len(yold) > 10:
            yold.pop(0)

        xold.append(x)
        yold.append(y)

        i1 = 0
        while i1 < len(xold):
            R = Random(20,20)
            G = Random(20,20)
            B = Random(20,20)
            DrawRectCentered(win,R,G,B, xold[i1], yold[i1], width, height)
            i1 = i1 + 1
        
            # Enemy Bullet draw
        i8 = 0
        while i8 < len(BulletY):
            if BulletTeam[i8] == "Player":
                DrawRectCentered(win,0, 250, 0, BulletX[i8], BulletY[i8], 6, 6)
            if BulletTeam[i8] == "Enemy":
                DrawRectCentered(win,230, 0, 0, BulletX[i8], BulletY[i8], 6, 6)
            i8 = i8 + 1
        
        # Display the enemy
        i4 = 0
        while i4 < len(enemySpeed):
            DrawRectCentered(win,250, 200, 0, enemyX[i4], enemyY[i4], enemyWidth[i4], enemyHeight[i4])
            if enemyHP[i4] < (50+(wave*25)):
                enemyHpBarY = enemyY[i4] - 5
                enemyHpBarX = enemyX[i4] - 5
                enemyBarWidth = (enemyHP[i4]/(50+(wave*25)))*15
                DrawRectCentered(win,255, 190, 190, enemyHpBarX, enemyHpBarY, enemyBarWidth, 4)
            i4=i4+1

        
        # Draw HP,Fuel,Chargebar and the player 
        DrawRect(win,255,192,203, 0, 0, hpbar, 5)
        DrawRect(win,100,100,100, 0, 5, fuelbar, 5)
        DrawRect(win,230,230,0, 0, 10, chargebar, 5)

        if charge == 0:
            DrawRectCentered(win,232, 190, 172, x, y, width, height)
        if charge == 1:
            DrawRectCentered(win,255, 255, 255, x, y, width, height)

        # Death Message screen

        if hp <= 0:
            DrawText("You have Died...",250,250,25,"Helvetica",120,0,0,True)  
            DrawText("Press space to restart.",250,250,10,"Helvetica",50,0,0,True)  
            alive = False
            if tryRestart == 1:
                restart = 1
                alive = True
            if enemyDeathCountThisRun > 0:
                gold = gold + (math.floor(((enemyDeathCountThisRun*(((wave//2)*0.2)+1)*goldMultiplier)+0.000000000000001)*100))//100
                enemyDeathCountThisRun = 0
        DrawWave()
    if gameWindow == "menu":
        win.fill((5,5,5))
        DrawRectCentered(win,10,10,10,250,250,50,50)
        DrawRectCentered(win,50,50,50,200,250,35,35)
        DrawRectCentered(win,50,50,50,300,250,35,35)
        DrawText("Gold: "+str(gold),80,40,30,"Helvetica",210,210,10,True)
        displaySpriteType = 'ultima-sprites-' + str(buyTypeNumber) + '.png'
        DrawImage(250,250,displaySpriteType,0)
        keys = pygame.key.get_pressed() 
        AC1reset = False
        if keys[pygame.K_UP]:
            AC1reset = True
            if alreadychanged1 == False:
                buyTypeNumber = buyTypeNumber+1
                alreadychanged1 = True
        if keys[pygame.K_DOWN]: 
            AC1reset = True
            if alreadychanged1 == False:
                buyTypeNumber = buyTypeNumber-1
                alreadychanged1 = True
        if keys[pygame.K_b]: 
            AC1reset = True
            if alreadychanged1 == False:
                Buy = True
                alreadychanged1 = True
        if AC1reset == False:
            alreadychanged1 = False
        
        if buyTypeNumber > 7:
            buyTypeNumber = 0
        if buyTypeNumber < 0:
            buyTypeNumber = 7
        # Buying and displaying info about buying = cost,amount bought,desc

        gold = 100
        if Buy == True:
            Buy = False
            Cost = GenerateGoldCost(buyTypeNumber,listOfUpgradesNumber[buyTypeNumber])
            if gold >= Cost:
                listOfUpgradesNumber[buyTypeNumber] = listOfUpgradesNumber[buyTypeNumber] + 1
                gold = gold - Cost
        DrawText("Cost: "+str(GenerateGoldCost(buyTypeNumber,listOfUpgradesNumber[buyTypeNumber])),250,290,30,StaticFont,210,210,10,True)
        DrawText("Amount Bought: "+str(listOfUpgradesNumber[buyTypeNumber]),250,315,23,StaticFont,210,210,10,True)
        DrawUpgradeDescription(buyTypeNumber)



    pygame.display.update()
    
pygame.quit()
Asked By: NightLeDum

||

Answers:

After some minor testing with the code myself. It seems as if it ends up going to the final statement in the code, which is when the loop ends and the window closes. Or as in your case, the game "crashes." In order to fix this, you just need to remove the following lines of code:

    if 4 in listOfUpgradesNumber:
        break

Unless you intend for this to serve some other function, this will fix your problem. And if you want this to serve some other function then remove the break and add in the code needed for the other function.

Answered By: Hatsune Miku
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.