[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[pygame] Attribute Error



Trying to run this code:
 
#Pong
#Myles Broomes
#version of the classic game pong
#player controls a paddle and competes against an AI opponent
#the aim of the game is to use the paddle to deflect the ball and get it passed the opponent, resulting in a point
#first to 10 points wins
import pygame,random,sys
from pygame import *
pygame.init()
WINWIDTH=640 #width of the window in pixels
WINHEIGHT=420 #height of the window in pixels
FPS=60 #frames per second
#sound object for the countdown before the game begins
timerSound=pygame.mixer.Sound('ding.wav')
#        r   g   b
BLACK=(  0,  0,  0)
WHITE=(255,255,255)
GREY= (131,139,134)
def get_text(color,text,size,pos,underline=False):
    """Takes 4 parameters - colour, fontsize, an XY position and text - and returns a text and surface object. """
    fontObj=pygame.font.Font('freesansbold.ttf',size)
   
    fontObj.set_underline(underline)
    surfObj=fontObj.render(text,True,color)
    textObj=surfObj.get_rect()
    textObj.center=(pos)
    return surfObj,textObj
def start_screen():
    """Wait for the player to be ready before starting the game. """
    ready=False #player is not yet ready
    fontColor=GREY
    while not ready: #stay in the loop until the player is ready
        DISPLAYSURF.fill(BLACK)
       
        pongSurf,pongText=get_text(fontColor,'Pong!',45,(WINWIDTH/2,WINHEIGHT/2))
        DISPLAYSURF.blit(pongSurf,pongText)
        startSurf,startText=get_text(fontColor,'Click here to start!',10,(WINWIDTH/2,WINHEIGHT/2+30))
        DISPLAYSURF.blit(startSurf,startText)
        devSurf,devText=get_text(WHITE,'By Myles Broomes',10,(WINWIDTH-50,WINHEIGHT-10))
        DISPLAYSURF.blit(devSurf,devText)
       
        for event in pygame.event.get():
            if event.type==QUIT:
                pygame.quit()
                sys.exit()
            elif event.type==MOUSEBUTTONUP:
                if pongText.collidepoint(event.pos):
                    ready=True
            if event.type==MOUSEMOTION:
                if pongText.collidepoint(event.pos):
                    fontColor=WHITE
                else:
                    fontColor=GREY
        pygame.display.update()
        FPSCLOCK.tick(FPS)
    return #start the game when the player is ready
               
def run_game():
    """Runs through the game loop. """
    #default parameters of the players paddle
    padXStart=30
    padXEnd=30
    padYStart=WINHEIGHT/2-30
    padYEnd=WINHEIGHT/2+30
    padWidth=5
    #default parameters for the opponents paddle
    AIpadXStart=WINWIDTH-30
    AIpadXEnd=WINWIDTH-30
    AIpadYStart=WINHEIGHT/2-30
    AIpadYEnd=WINHEIGHT/2+30
    #default parameters of the ball
    ballSize=5
    ballX=WINWIDTH/2
    ballY=WINHEIGHT/2
    #decides which way to move the paddle - up or down - depending which key the player presses, None by default (paddle is stationary)
    direction=None
    #randomise the direction that ball moves in
    possDir=[-5,5] #possible directions for the ball to move down, up, left or right
    ballMoveX=random.choice(possDir)
    ballMoveY=random.choice(possDir)
    #keeps track of the players score, 0 by default
    score=0
    #keeps track of the opponents score, 0 by default
    AIscore=0
    #countdown from 3 until the beginning of the game
    countdown=3
    timer=0
    #check if the ball travels into the area outside of the opponents line of sight
    blindspotA=None
    blindspotB=None
    timerSound.play() #plays the sound at the beginning of the countdown
    while countdown>0: #loop until the coundown is at 0
        DISPLAYSURF.fill(BLACK)
        for event in pygame.event.get():
            if event.type==QUIT:
                pygame.quit()
                sys.exit()
        timeSurf,timeText=get_text(WHITE,'%s'%countdown,40,(WINWIDTH/2,WINHEIGHT/2))
        DISPLAYSURF.blit(timeSurf,timeText)
        if timer<1:
            timer+=0.017
        else:
            countdown-=1
            if countdown>0: #only plays the sound if the number is 1,2 or 3
                timerSound.play() #plays the sound each time the countdown decreases
            timer=0
        pygame.display.update()
        FPSCLOCK.tick(FPS)
    while True:
        DISPLAYSURF.fill(BLACK) #clear everything off the screen so it can be redrawn
        for line in range(0,WINHEIGHT-20): #draw a stuttered line down the middle of the screen
            start=line*30
            end=start+20
           
            halfwayLine=pygame.draw.line(DISPLAYSURF,WHITE,(WINWIDTH/2,start),(WINWIDTH/2,end),2)
        #display the players score in the top left corner of the screen
        scoreSurf,scoreText=get_text(WHITE,'%s'%score,25,(WINWIDTH/2-40,20))
        DISPLAYSURF.blit(scoreSurf,scoreText)
        #display the opponents score in the top right corner of the screen
        AIscoreSurf,AIscoreText=get_text(WHITE,'%s'%AIscore,25,(WINWIDTH/2+40,20))
        DISPLAYSURF.blit(AIscoreSurf,AIscoreText)
       
        #balls rect object
        ballRect=(ballX, ballY, ballSize, ballSize)
       
        #draw the players paddle
        paddle=pygame.draw.line(DISPLAYSURF, WHITE, (padXStart,padYStart), (padXEnd,padYEnd), padWidth)
        #draw the opponents paddle
        AIpaddle=pygame.draw.line(DISPLAYSURF, WHITE, (AIpadXStart,AIpadYStart), (AIpadXEnd,AIpadYEnd), padWidth)
        for event in pygame.event.get():
            if event.type==QUIT:
                pygame.quit()
                sys.exit()
            elif event.type==KEYDOWN: #move the paddle up if the paddle presses the up key and down for the down key
                if event.key==K_UP:
                    direction='up'
                elif event.key==K_DOWN:
                    direction='down'
        padLength=[] #reset the list on each iteration of the game loop
        AIpadLength=[]
        for i in range(int(padYStart),int(padYEnd),1): #sequence containing the every X and Y value from the top of the paddle to the bottom
            addToList=i
            padLength.append(addToList)
        for j in range(int(AIpadYStart),int(AIpadYEnd),1):
            addToList=j
            AIpadLength.append(addToList)
        #draws the opponents line of sight
        sightLineA=pygame.Rect(AIpadXStart-210,AIpadYStart-150,210,188)
        sightLineB=pygame.Rect(AIpadXStart-210,AIpadYStart+42,210,190)
        #pygame.draw.rect(DISPLAYSURF,WHITE,sightLineA)
        #pygame.draw.rect(DISPLAYSURF,WHITE,sightLineB)
        #draw the ball
        ball=pygame.draw.rect(DISPLAYSURF,WHITE,ballRect)
                   
        if direction=='up': #move the paddle up
            padYStart-=10
            padYEnd-=10
        elif direction=='down': #move the paddle down
            padYStart+=10
            padYEnd+=10
        #test to see if the ball is in the opponents line of sight
        if sightLineA.colliderect(ballRect): #move the paddle up if the ball is in the top half of the opponents line of sight
            AIpadYStart-=10
            AIpadYEnd-=10
        elif sightLineB.colliderect(ballRect): #move the paddle down if the ball is in the bottom half of the opponents line of sight
            AIpadYStart+=10
            AIpadYEnd+=10
        try:
            if blindspotA.colliderect(ballRect): #check if the ball is in the opponents blindspot, if so move the paddle towards the blindspot
                AIpadYStart-=10
                AIpadYEnd-=10
            elif blindspotB.colliderect(ballRect):
                AIpadYStart+=10
                AIpadYEnd+=10
        except AttributeError:
            None
        if AIpadYEnd>=WINHEIGHT-3: #draw a rect covering the opponents blindspot at the top of the screen
            blindspotA=pygame.Rect(AIpadXStart-210,2,210,130)
            #pygame.draw.rect(DISPLAYSURF,WHITE,blindspotA)
        elif AIpadYStart<=3: #draw a rect covering the opponents blindspot at the bottom of the screen
            blindspotB=pygame.Rect(AIpadXStart-210,WINHEIGHT-132,210,130)
            #pygame.draw.rect(DISPLAYSURF,WHITE,blindspotB)
        if padYStart<=0: #stop the paddle from going off the screen
            padYStart=0
            padYEnd=padYStart+60
        elif padYEnd>=WINHEIGHT:
            padYEnd=WINHEIGHT
            padYStart=padYEnd-60
        if AIpadYStart<=0: #stop the opponents paddle from going off the screen
            AIpadYStart=0
            AIpadYEnd=AIpadYStart+60
        elif AIpadYEnd>=WINHEIGHT:
            AIpadYEnd=WINHEIGHT
            AIpadYStart=AIpadYEnd-60
        #move the ball back to the center of the screen if it goes off the screen
        if ballX>WINWIDTH:
            ballMoveX=random.choice(possDir) #reset the direction that the ball is moving in
            ballMoveY=random.choice(possDir)
            ballX=WINWIDTH/2
            score+=1
        elif ballX<0:
            ballMoveX=random.choice(possDir)
            ballMoveY=random.choice(possDir)
            ballX=WINWIDTH/2
            AIscore+=1
        if ballX==padXStart and ballY in padLength: #redirect the ball if it makes contact with the front of the players paddle
            ballMoveX=-ballMoveX
        elif ballX==AIpadXStart-5 and ballY in AIpadLength: #redirect the ball if it makes contact with the front of the opponents paddle
            ballMoveX=-ballMoveX
        if ballY<=5: #redirect the ball if it touches the top edge
            ballMoveY=-ballMoveY
        elif ballY>=WINHEIGHT-5: #redirect the ball if it touches the bottom edge
            ballMoveY=-ballMoveY
        #move the ball
        ballX+=ballMoveX
        ballY+=ballMoveY
        if score==10 or AIscore==10:
            end_game(score,AIscore)
            return #go back to the start screen
           
        pygame.display.update()
        FPSCLOCK.tick(FPS)
def end_game(player_score,opp_score):
    """Inform the player if they have won or lost. """
    ready=False
    while not ready:
        DISPLAYSURF.fill(BLACK)
       
        for event in pygame.event.get():
            if event.type==QUIT:
                pygame.quit()
                sys.exit()
            elif event.type==MOUSEBUTTONUP:
                return
        finalScoreSurf,finalScoreText=get_text(WHITE,'Final-Score:',40,(WINWIDTH/2,50),True)
        DISPLAYSURF.blit(finalScoreSurf,finalScoreText)
       
        youSurf,youText=get_text(WHITE,'%s'%player_score,100,(WINWIDTH/4,WINHEIGHT/2))
        DISPLAYSURF.blit(youSurf,youText)
        hyphenSurf,hyphenText=get_text(WHITE,'-',30,(WINWIDTH/2,WINHEIGHT/2))
        DISPLAYSURF.blit(hyphenSurf,hyphenText)
       
        oppSurf,oppText=get_text(WHITE,'%s'%opp_score,100,((WINWIDTH/2+WINWIDTH/4),WINHEIGHT/2))
        DISPLAYSURF.blit(oppSurf,oppText)
        continueSurf,continueText=get_text(WHITE,'Click to restart!',10,(WINWIDTH/2,WINHEIGHT-40))
        DISPLAYSURF.blit(continueSurf,continueText)
       
        pygame.display.update()
        FPSCLOCK.tick(FPS)
def main():
    """Main game loop. """
    global DISPLAYSURF,FPSCLOCK
   
    DISPLAYSURF=pygame.display.set_mode((WINWIDTH,WINHEIGHT))
    pygame.display.set_caption('Pong')
    FPSCLOCK=pygame.time.Clock()
   
    while True:
        start_screen()
        run_game()
#Play the game!
main()
       
Can anyone tell me why I keep getting this error: 'AttributeError: module object has no attribute 'init'. I'm running Python 3.3.0 and Pygame 1.9.1 on Windows.