小凯2013 发表于 2022-5-22 07:48:25

为啥抛出了异常?设置捕获了呀!

本帖最后由 小凯2013 于 2022-5-22 07:52 编辑

前方高能预警!!!代码如下(250行左右):
#p3_85.py/摩擦摩擦(main).py
import pygame
import sys
import traceback
from pygame.locals import *
from random import *

try:
    class Ball(pygame.sprite.Sprite):
      def __init__(self,grayball_image,greenball_image,position,speed,bg_size,target):
            pygame.sprite.Sprite.__init__(self)
            self.grayball_image = pygame.image.load(grayball_image).convert_alpha()
            self.greenball_image = pygame.image.load(greenball_image).convert_alpha()
            self.rect = self.grayball_image.get_rect()
            self.rect.left = position
            self.rect.top = position
            self.side = ),choice([-1,1])]
            self.speed = speed
            self.collide = False
            self.target = target
            self.control = False
            self.width = bg_size
            self.height = bg_size
            self.radius = self.rect.width / 2

      def move(self):
            if self.control:
                self.rect = self.rect.move(self.speed)
            else:
                self.rect = self.rect.move((self.side * self.speed,self.side * self.speed))

            if self.rect.right <= 0:
                self.rect.left = self.width

            elif self.rect.left >= self.width:
                self.rect.right = 0

            elif self.rect.bottom <= 0:
                self.rect.top = self.height

            elif self.rect.top >= self.height:
                self.rect.bottom = 0

      def check(self,motion):
            if self.target < motion < self.target + 5:
                return True
            else:
                return False

    class Glass(pygame.sprite.Sprite):
      def __init__(self,glass_image,mouse_image,bg_size):
            pygame.sprite.Sprite.__init__(self)

            self.glass_image = pygame.image.load(glass_image).convert_alpha()
            self.glass_rect = self.glass_imagr.get_rect()
            self.glass_rect.left = (bg_size - self.glass_rect.width) // 2
            self.glass_rect.top = bg_size - self.glass_rect.height

            self.mouse_image = pygame.image.load(mouse_image).convert_alpha()
            self.mouse_rect = self.mouse_image.get_rect()
            self.mouse_rect.left = self.glass_rect.left
            self.mouse_rect.top = self.glass_rect.top
            pygame.mouse.set_visible(False)

    def main():
      pygame.init()

      grayball_image = "gray_ball.png"
      greenball_image = "green_ball.png"
      glass_image = "glass.png"
      mouse_image = "hand.png"
      bg_image = "background.png"

      running = True

      pygame.mixer.music.load("bg_music.ogg")
      pygame.mixer.music.play()

      loser_sound = pygame.mixer.Sound("loser.wav")
      laugh_sound = pygame.mixer.Sound("laugh.wav")
      winner_sound = pygame.mixer.Sound("winner.wav")
      hole_sound = pygame.mixer.Sound("hole.wav")

      GAMEOVER = USEREVENT
      pygame.mixer.muxic.set_endevent(GAMEOVER)

      bg_size = =
      screen = pygame.display.set_mode(bg_size)
      pygame.display.set_caption("摩擦摩擦 - Play The Ball")

      background = pygame.image.load(bg_image).convert_alpha()

      hole = [(117,119,199,201),(255,227,390,392),(503,505,320,322),(698,700,192,194),(906,908,419,421)]
      msgs = []
      balls = []
      group = pygame.sprite.Group()
      for i in range(5):
            position =
            speed =
            ball = Ball(grayball_image,greenball_image,position,speed,bg_size,5 * (i + 1))

            while pygame.sprite.spritecollide(ball,group,False,pygame.sprite.collide_circle):
                ball.rect.left = randint(0,width - 100)
                ball.rect.top = randint(0,height - 100)

            balls.append(ball)
            group.add(ball)

      glass = Glass(glass_image,mouse_image,bg_size)
      motion = 0
      MYTIMER = USEREVENT + 1
      pygame.time.set_timer(MYTIMER,1000)
      pygame.key.set_repeat(100,100)
      clock = pygame.time.Clock()

      while running:
            for event in pygame.event.get():
                if event.type == QUIT:
                  pygame.quit()
                  sys.exit()

                elif event.type == GAMEOVER:
                  loser_sound.play()
                  pygame.time.delay(2000)
                  laugh_sound.play()
                  running = False

                elif event.type == MYTIMER:
                  if motion:
                        for each in group:
                            if each.check(motion):
                              each.speed =
                              each.control = True
                        motion = 0

                elif event.type == MOUSEMOTION:
                  motion += 1

                elif event.type == KEYDOWN:
                  if event.key == Up:
                        for each in group:
                            if each.control:
                              each.speed -= 1

                  elif event.key == Down:
                        for each in group:
                            if each.control:
                              each.speed += 1

                  elif event.key == Left:
                        for each in group:
                            if each.control:
                              each.speed -= 1

                  elif event.key == Right:
                        for each in group:
                            if each.control:
                              each.speed += 1

                  elif event.key == K_SPACE:
                        for each in group:
                            if each.control:
                              for i in hole:
                                    if i <= each.rect.left <= i and i <= each.rect.top <= i:
                                        hole_sound.play()
                                        each.speed =
                                        group.remove(each)
                                        temp = balls.pop(balls.index(each))
                                        balls.insert(0,temp)
                                        hole.remove(i)

                              if not hole:
                                    pygame.mixer.muisc.stop()
                                    winner_sound.play()
                                    pygame.time.delay(3000)
                                    msg = pygame.image.load("win.png").convert_alpha()
                                    msg_pos = [(width - msg.get_width()) // 2,(height - msg.get_height())]
                                    msgs.append((msg,msg_pos))
                                    laugh_sound.play()

                screen.blit(background,(0,0))
                screen.blit(glass.glass_image,glass.glass_rect)

                glass.mouse_rect.left = pygame.mouse.get_pos()
                glass.mouse_rect.top = pygame.mouse.get_pos()

                if glass.mouse_rect.left < glass.glass_rect.left:
                  glass.mouse_rect.left = glass.glass_rect.left

                if glass.mouse_rect.left > glass.glass_rect.right - glass.mouse_rect.width:
                  glass.mouse_rect.left = glass.glass_rect.right - glass.mouse_rect.width

                if glass.mouse_rect.top < glass.glass_rect.top:
                  glass.mouse_rect.top = glass.glass_rect.top

                if glass.mouse_rect.top > glass.glass_rect.bottom - glass.mouse_rect.height:
                  glass.mouse_rect.top = glass.glass_rect.bottom - glass.mouse_rect.height

                screen.blit(glass.mouse_image,glass.mouse_rect)

                for each in balls:
                  each.move()
                  if each.collide:
                        each.speed =
                        each.collide = False

                  if each.control:
                        screen.blit(each.greenball_image,each.rect)
                  else:
                        screen.blit(each.grayball_image,each.rect)

                for each in group:
                  group.remove(each)

                  if pygame.sprite.spritecollide(each,group,False,pygame.sprirte.collide_circle):
                        each.side = -each.side
                        each.side = -each.side
                        each.collide = True

                        if each.control:
                            each.side = -1
                            each.side = -1
                            each.control = False

                  group.add(each)

                for msg in msgs:
                  screen.blit(msg,msg)

                pygame.display.flip()
                clock.tick(30)

    if __name__ == "__main__":
      try:
            main()
      except SystemExit:
            pass
      except:
            traceback.print_exc()
            pygame.quit()
            input()

except:
    pygame.quit()
    sys.exit()运行后代码如下:Python 3.8.5 (tags/v3.8.5:580fbb0, Jul 20 2020, 15:43:08) on win32
Type "help", "copyright", "credits" or "license()" for more information.
>>>
================ RESTART: C:\Users\Administrator\Desktop\摩擦摩擦.py ===============
pygame 2.1.2 (SDL 2.0.18, Python 3.8.5)
Hello from the pygame community. https://www.pygame.org/contribute.html
Traceback (most recent call last):
File "C:\Users\Administrator\Desktop\摩擦摩擦.py", line 235, in <module>
    main()
File "C:\Users\Administrator\Desktop\摩擦摩擦.py", line 76, in main
    pygame.mixer.music.load("bg_music.ogg")
pygame.error: No file 'bg_music.ogg' found in working directory 'C:\Users\Administrator\Desktop'.你们说为啥抛异常?还有,什么是pygame.error???
页: [1]
查看完整版本: 为啥抛出了异常?设置捕获了呀!