0

I'm trying to add a def main to the end of my pong game to make it easier to read, but i've ran into problems trying to do that. When I add the def main, I just get a black screen, but without it I get the whole game.

    import pygame


    SCR_WID, SCR_HEI = 640, 480
    class Player():
    def __init__(self):
            self.x, self.y = 16, SCR_HEI/2
            self.speed = 3
            self.padWid, self.padHei = 8, 64
            self.score = 0
            self.scoreFont = pygame.font.Font("imagine_font.ttf", 64)

    def scoring(self):
            scoreBlit = self.scoreFont.render(str(self.score), 1, (255, 255, 255))
            screen.blit(scoreBlit, (32, 16))
            if self.score == 10:
                    print ("player 1 wins!")
                    exit()

    def movement(self):
            keys = pygame.key.get_pressed()
            if keys[pygame.K_w]:
                    self.y -= self.speed
            elif keys[pygame.K_s]:
                    self.y += self.speed

            if self.y <= 0:
                    self.y = 0
            elif self.y >= SCR_HEI-64:
                    self.y = SCR_HEI-64

    def draw(self):
            pygame.draw.rect(screen, (255, 255, 255), (self.x, self.y, self.padWid, self.padHei))

    class Enemy(Player):
    def __init__(self):
            self.x, self.y = SCR_WID-16, SCR_HEI/2
            self.speed = 3
            self.padWid, self.padHei = 8, 64
            self.score = 0
            self.scoreFont = pygame.font.Font("imagine_font.ttf", 64)

    def scoring(self):
            scoreBlit = self.scoreFont.render(str(self.score), 1, (255, 255, 255))
            screen.blit(scoreBlit, (SCR_HEI+92, 16))
            if self.score == 10:
                    print ("Player 2 wins!")
                    exit()

    def movement(self):
            keys = pygame.key.get_pressed()
            if keys[pygame.K_UP]:
                    self.y -= self.speed
            elif keys[pygame.K_DOWN]:
                    self.y += self.speed

            if self.y <= 0:
                    self.y = 0
            elif self.y >= SCR_HEI-64:
                    self.y = SCR_HEI-64

    def draw(self):
            pygame.draw.rect(screen, (255, 255, 255), (self.x, self.y, self.padWid, self.padHei))

    class Ball():
    def __init__(self):
            self.x, self.y = SCR_WID/2, SCR_HEI/2
            self.speed_x = -3
            self.speed_y = 3
            self.size = 8

    def movement(self):
            self.x += self.speed_x
            self.y += self.speed_y

            #wall col
            if self.y <= 0:
                    self.speed_y *= -1
            elif self.y >= SCR_HEI-self.size:
                    self.speed_y *= -1

            if self.x <= 0:
                    self.__init__()
                    enemy.score += 1
            elif self.x >= SCR_WID-self.size:
                    self.__init__()
                    self.speed_x = 3
                    player.score += 1
            ##wall col
            #paddle col
            #player
            for n in range(-self.size, player.padHei):
                    if self.y == player.y + n:
                            if self.x <= player.x + player.padWid:
                                    self.speed_x *= -1
                                    break
                    n += 1
            #enemy
            for n in range(-self.size, enemy.padHei):
                    if self.y == enemy.y + n:
                            if self.x >= enemy.x - enemy.padWid:
                                    self.speed_x *= -1
                                    break
                    n += 1
            ##paddle col

    def draw(self):
            pygame.draw.rect(screen, (255, 255, 255), (self.x, self.y, 8, 8))

    SCR_WID, SCR_HEI = 640, 480
   screen = pygame.display.set_mode((SCR_WID, SCR_HEI))
   pygame.display.set_caption("Pong")
   pygame.font.init()
   clock = pygame.time.Clock()
   FPS = 60



  def main():  
      ball = Ball()
      player = Player()
      enemy = Enemy()

      while True:
      #process
      for event in pygame.event.get():
                    if event.type == pygame.QUIT:
                            print ("Game exited by user")
                            exit()



    ##process
    #logic
    ball.movement()
    player.movement()
    enemy.movement()
    ##logic
    #draw
    screen.fill((0, 0, 0))
    ball.draw()
    player.draw()
    player.scoring()
    enemy.draw()
    enemy.scoring()
    ##draw
    #_______
    pygame.display.flip()
    clock.tick(FPS)
   main()

2 Answers2

2

The call for main() on the end should be

if __name__ == "__main__":
    main()

So that you can run your code and get the function to run. Also your indentation seems a little off. Is your code structured correctly with regard to spaces?

FBidu
  • 972
  • 9
  • 21
  • 1
    the if statement might be a little off. Where should I add if __name__ == "__main__": in the code at the end? – ChampIsHere Nov 16 '15 at 03:47
0

As already answered, you should insert the following statement at the end of the script:

if __name__ == "__main__":
    main()

This answer will give you more info about the meaning of that statement.

What does if __name__ == "__main__": do?

In short, it tells the interpreter what it has to do with the function main(): 1) Run it automatically if the file has been executed as stand alone script. 2) Don't run if the file has been imported as module from another script. In your case, the wanted behaviour is the number one.

Community
  • 1
  • 1
Lornioiz
  • 405
  • 2
  • 7
  • 16