Day013作业

2018-09-06  本文已影响0人  Autumn_Hy7

"""
游戏功能: 点击屏幕在点击的地方产生一个球,球可以自由的移动,撞到边界会弹回,撞到其他的球会吃掉

第一步:搭建游戏窗口
第二步:点击屏幕产生球
第三步:让球动起来(需要用列表来保存所有的球, 需要使用字典来保存每个球的信息)
第四步:
"""

全局变量

  WINDOW_WIDTH = 1000  # 屏幕宽度
  WINDOW_HIGHT = 800  # 屏幕高度

   key_ball_color = 'ball_color'
  key_ball_center = 'ball_center'
  key_ball_radius = 'ball_radius'
  key_ball_xspeed = 'ball_xspeed'
  key_ball_yspeed = 'ball_yspeed'
  key_ball_alive = 'ball_alive'


  all_balls = []  # 保存所有的球

  def ball_crash():
       """
       检测碰撞
      :return:
      """
      # 看屏幕上每个球是否和其他的球的圆心距小于等于半径和
      # 拿第一个球
      for ball in all_balls:
          # 拿另外一个球
          for other in all_balls:
              # 是同一个球或者是已经消失的球都不需要再判断
              if ball == other or ball[key_ball_alive] == False or             other[key_ball_alive] == False:
            continue
                # 判断两次拿到的球是否相撞
              x1,y1 = ball[key_ball_center]
              x2,y2 = other[key_ball_center]
              # 计算两个球的圆心距
              distance = ((x1 - x2)**2 + (y1 - y2)**2)**0.5
              if distance <= ball[key_ball_radius] + other[skey_ball_radius]:
                  # 相撞后:
                  if randint(0,1):
                      ball[key_ball_radius] += int(other[key_ball_radius]*0.4)  # 一个球变大  
                        other[key_ball_alive] = False
                  else:
                      other[key_ball_radius] += int(ball[key_ball_radius] * 0.4)  # 一个球变大
                      ball[key_ball_alive] = False



  def draw_all_ball(window):
        """
      画所有的球
      :return:
      """
      window.fill(yt_color.white)
      for ball in all_balls[:]:
          # 如果是活着的就画出来,如果已经死掉了就移除
          if ball[key_ball_alive]:
              pygame.draw.circle(window, ball[key_ball_color],       ball[key_ball_center], ball[key_ball_radius])
          else:
              all_balls.remove(ball)

        pygame.display.update()



    def ball_move():
    """
      球动起来
        """
      for ball in all_balls:
          # 1.获取新的原点
          ball_x, ball_y = ball[key_ball_center]
           new_x = ball_x + ball[key_ball_xspeed]
           new_y = ball_y + ball[key_ball_yspeed]

          # 2.做边界检测
          # x 方向的边界
          if new_x < ball[key_ball_radius]:
              new_x = ball[key_ball_radius]
              ball[key_ball_xspeed] *= -1
          elif new_x > WINDOW_WIDTH - ball[key_ball_radius]:
                new_x = WINDOW_WIDTH - ball[key_ball_radius]
                ball[key_ball_xspeed] *= -1

            # y 方向的边界
          if new_y < ball[key_ball_radius]:
              new_y = ball[key_ball_radius]
                ball[key_ball_yspeed] *= -1
            elif new_y > WINDOW_HIGHT - ball[key_ball_radius]:
                 new_y = WINDOW_HIGHT - ball[key_ball_radius]
                ball[key_ball_yspeed] *= -1

              # 3.修改圆心坐标
            ball[key_ball_center] = new_x, new_y




  def creat_ball(window, pos):
      """
      在指定的位置产生一个随机颜色的球
      :param window:
        :param pos:
      :return:
          """
      ball_color = yt_color.rand_color()
      ball_center = pos
      ball_radius = randint(10, 30)

      # 创建球对应的字典
        ball = {
          key_ball_color: ball_color,
          key_ball_center: ball_center,
          key_ball_radius: ball_radius,
          key_ball_xspeed: randint(-1, 1),
          key_ball_yspeed: randint(-1, 1),
          ky_ball_alive: True
      }

      # 保存球的信息
        all_balls.append(ball)

      # 画球
      pygame.draw.circle(window, ball_color, ball_center, ball_radius)
      pygame.display.update()


  def main_game():
      """
      游戏主系统
    """
      # 初始化游戏
      pygame.init()
      window = pygame.display.set_mode((WINDOW_WIDTH,         WINDOW_HIGHT))
        window.fill(yt_color.white)

        # 进入游戏界面默认显示的内容和要执行操作写到这儿....


        pygame.display.flip()
      # 游戏循环
      while True:

          # 游戏循环执行的代码写在这儿.....
          ball_move()  # 修改球的位置
          ball_crash() # 检测球的碰撞
          draw_all_ball(window)  # 重新画所有的球


          # 事件检测
          for event in pygame.event.get():
              if event.type == pygame.QUIT:
                  exit()
              # 事件发生要执行的操作写到这个下面.....
                # 1.鼠标按下
                elif event.type == pygame.MOUSEBUTTONDOWN:
                    creat_ball(window, event.pos)



  if __name__ == '__main__':
      main_game()
上一篇下一篇

猜你喜欢

热点阅读