用Python写一个天天酷跑

发表于:2021-2-25 09:27

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Gtieguo    来源:CSDN

  写出来的效果图就是这样了,下面就更新一下全部的代码吧!
  还是老样子先定义:
  import pygame,sys
  import random
  写一下游戏配置
  width = 1200            #窗口宽度
  height = 508            #窗口高度
  size = width, height   
  score=None              #分数
  myFont=myFont1=None     #字体
  surObject=None          #障碍物图片         
  surGameOver=None        #游戏结束图片
  bg=None                 #背景对象
  role=None               #人物对象
  object=None             #障碍物对象        
  objectList=[]           #障碍物对象数组
  clock=None              #时钟
  gameState=None          #游戏状态(0,1)表示(游戏中,游戏结束)
  写人物
  class Role: #人物
      def __init__(self,surface=None,y=None):
          self.surface=surface
          self.y=y
          self.w=(surface.get_width())/12
          self.h=surface.get_height()/2
          self.currentFrame=-1
          self.state=0        #0代表跑步状态,1代表跳跃状态,2代表连续跳跃
          self.g=1            #重力加速度
          self.vy=0           #y轴速度       
          self.vy_start=-20   #起跳开始速度
      def getRect(self):
          return (0,self.y+12,self.w,self.h)
  写障碍物
  class Object:  #障碍物
      def __init__(self,surface,x=0,y=0):
          self.surface=surface
          self.x=x
          self.y=y
          self.w=surface.get_width()
          self.h=surface.get_height()
          self.currentFrame=random.randint(0,6)
          self.w = 100
          self.h = 100
      def getRect(self):
          return (self.x,self.y,self.w,self.h)
      def collision(self,rect1,rect2):
          #碰撞检测
          if (rect2[0]>=rect1[2]-20) or (rect1[0]+40>=rect2[2])or (rect1[1]+rect1[3]<rect2[1]+20) or (rect2[1]+rect2[3]<rect1[1]+20):
              return False
          return True
  写背景
  class Bg:   #背景
      def __init__(self,surface):
          self.surface=surface
          self.dx=-10
          self.w=surface.get_width()
          self.rect=surface.get_rect()

  def initGame():
          
      global bg,role,clock,gameState,surObject,surGameOver,score,myFont,myFont1,objectList
      #分数初始化
      score=0
      #初始化
      objectList=[]
      #加载字体
      myFont=pygame.font.Font("./freesansbold.ttf",32)
      myFont1=pygame.font.Font("./freesansbold.ttf",64)   
      # 创建时钟对象 (可以控制游戏循环频率)
      clock = pygame.time.Clock()
      #初始化游戏状态
      gameState=0
      #游戏背景
      surBg=pygame.image.load("image/bg.bmp").convert_alpha()
      bg=Bg(surBg)
      #结束画面
      surGameOver=pygame.image.load("image/gameover.bmp").convert_alpha()
      #人物图片
      surRole=pygame.image.load("image/role.png").convert_alpha()  
      role=Role(surRole,508-85)
      #障碍物图片
      surObject=pygame.image.load("image/object.png").convert_alpha()  
  def addObject():
      global surObject,object,objectList,object
      rate=4
      #是否生成障碍物
      if not random.randint(0,300)<rate:
          return
      y=random.choice([height-100,height-200,height-300,height-400])
      object=Object(surObject,width+40,y)
      objectList.append(object)
  def updateLogic():
      global gameState,score
      #键盘事件处理
      for event in pygame.event.get():
          if event.type == pygame.QUIT:
               sys.exit()
          elif event.type==pygame.KEYDOWN:
              #空格键跳跃
              if gameState==0:
                  if event.key==pygame.K_SPACE:
                      if role.state==0:
                          role.state=1
                          role.vy=role.vy_start
                      elif role.state==1:
                          role.state=2
                          role.vy=role.vy_start
              elif gameState==1:
                  if event.key==pygame.K_SPACE:
                      #重新开始游戏
                      initGame()
                      
      if gameState==0:
          #背景的移动   
          bg.dx+=10
          if bg.dx==1200:
              bg.dx=0 
              
          #人物的移动  
          if role.state==0:    
              role.currentFrame+=1
              if role.currentFrame==12:
                  role.currentFrame=0  
          else:
              role.y+=role.vy
              role.vy+=role.g 
              if role.y>=508-85:
                  role.y=508-85
                  role.state=0
          #障碍物的移动
          addObject()
          
          for object in objectList:
              object.x-=10     #障碍物移动
              # 障碍物超出屏幕,移除障碍物
              if object.x+object.w<=0:
                  objectList.remove(object)
                  score+=10    #避开障碍物,加10分
                  print("移除了一个目标")   
              #碰撞检测
              if object.collision(role.getRect(),object.getRect()):
                  if(object.currentFrame==6):
                      objectList.remove(object)
                      score+=100  #吃金币加100分
                      print(score)
                      print("吃了一个金币")
                  else: 
                      gameState=1   #游戏失败
                      print("发生了碰撞!")
  ok啦,这就是这个天天酷跑的全部代码啦!

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号