猫史档案馆


【Python作品分享】律动键盘——春节版【作品秀】

用户:ZCM张宸铭小作坊ZCM张宸铭小作坊查看:1 回复:4 评论:1 创建时间:2023-01-20T21:30:22


【作品展示】

center_image

 

【作品介绍】

把原本分散在多个文件中的代码整合进了一个,且只能玩春节序曲

为了符合代码字数限制,删掉了所有不必要的空格,且缩进改为两个空格

暑假时要新做一个游戏,有意合作者+Q198516090

 

【作品源代码】

# 选关没有用,全是春节序曲,其他的为了节省体积砍掉了
# 删掉了一堆为了好看的空格
# 缩进本来是4个空格,因为这个上传机制被迫改成了2个
# !!!!!!!!麻烦改一下行不!!!!!!!!

# 声明:网络上绝对找不到任何一个和此程序相似的程序
# 主界面背景图片也绝对无法在网上搜到,这是我买的同学画的一张画
import pygame
import sys
import threading
import webbrowser

autoPlay=False

pygame.init()

screen=pygame.display.set_mode((1000,600))

# 绑定一下音效
press=pygame.mixer.Sound('sound/click.wav')
on=pygame.mixer.Sound('sound/on.wav')
# hit音效是从phigros里抠下来的
hit=pygame.mixer.Sound('sound/hit.wav')

pygame.display.set_icon(pygame.image.load('images/icon.png'))
pygame.display.set_caption('律动键盘')

WHITE=(255,255,255)
BLACK=(0,0,0)

# 下面的是本来装在单独文件里面的关卡内容
# 本来有整齐的缩进,为了减少字符数全删了,发现居然还能运行
class level:
  def __init__(self):
    self.name='春节序曲'
    self.music='music/level1.mp3'
    self.speed=1055
    self.delaytoPlay=900
    self.theLevel=[[0],[0],[0],[0],[0],[0],[0],[0],[6],[0],[0],[0],[6],[0],[5],[0],[14,11],[24,21],[24,21],[24,21],[24,21],[34,31],[0],[0],[6],[0],[0],[0],[6],[0],[5],[0],[14,11],[24,21],[24,21],[24,21],[24,21],[34,31],[0],[0],[6],[0],[0],[0],[6],[0],[5],[0],[12,15],[22,25],[22,25],[32,35],[13,14],[23,24],[23,24],[23,24],[1,23,24,6],[23,24],[23,24],[23,24],[2,23,24,5],[23,24],[23,24],[33,34],[16],[26],[26],[36],[0],[0],[5],[0],[6],[0],[0],[0],[5],[0],[0],[0],[15],[25],[25],[35],[0],[0],[4],[0],[5],[0],[0],[0],[4],[0],[0],[0],[13],[23],[23],[33],[0],[0],[2],[0],[3],[0],[0],[0],[2],[0],[0],[0],[1,6],[0],[0],[0],[2,5],[0],[0],[0],[1,6],[0],[0],[0],[2,5],[0],[0],[0],[1,6],[0],[0],[0],[2,5],[0],[0],[0],[1,6],[0],[0],[0],[3,4],[0],[0],[0],[2,5],[0],[0],[0],[3,4],[0],[0],[0],[2,5],[0],[0],[0],[3,4],[0],[0],[0],[2,5],[0],[0],[0],[3,4],[0],[0],[0],[2,5],[0],[0],[0],[3,4],[0],[0],[0],[11,16],[21,26],[21,26],[21,26],[21,26],[21,26],[21,26],[31,36],[12,15],[22,25],[22,25],[22,25],[22,25],[22,25],[22,25],[22,25],[22,25],[22,25],[22,25],[32,35],[13,14],[23,24],[23,24],[23,24],[23,24],[23,24],[23,24],[23,24],[23,24],[23,24],[23,24],[23,24],[23,24],[23,24],[23,24],[23,24],[23,24],[23,24],[23,24],[23,24],[23,24],[23,24],[23,24],[23,24],[23,24],[23,24],[23,24],[33,34],[0],[0],[0],[0],[0],[0],[0],[0],[1],[0],[0],[0],[1],[0],[3],[0],[1],[0],[0],[0],[1],[0],[3],[0],[3],[0],[0],[0],[2],[0],[1],[0],[3],[0],[0],[0],[0],[0],[0],[0],[3,6],[0],[0],[0],[1,4],[0],[0],[0],[3,6],[0],[0],[0],[1,4],[0],[0],[0],[3,6],[0],[0],[0],[2,5],[0],[0],[0],[3,6],[0],[0],[0],[0],[0],[0],[0],[4],[0],[0],[0],[4],[0],[6],[0],[4],[0],[0],[0],[4],[0],[6],[0],[6],[0],[0],[0],[5],[0],[4],[0],[6],[0],[0],[0],[0],[0],[0],[0],[3,6],[0],[0],[0],[1,4],[0],[0],[0],[3,6],[0],[0],[0],[1,4],[0],[0],[0],[3,6],[0],[0],[0],[2,5],[0],[0],[0],[3,6],[0],[0],[0],[0],[0],[0],[0],[1],[0],[0],[0],[1],[0],[2],[0],[3],[0],[0],[0],[0],[0],[0],[0],[3,6],[0],[0],[0],[2,5],[0],[0],[0],[3,6],[0],[0],[0],[0],[0],[0],[0],[1],[0],[0],[0],[1],[0],[2],[0],[3],[0],[0],[0],[0],[0],[0],[0],[3,6],[0],[0],[0],[2,5],[0],[0],[0],[3,6],[0],[0],[0],[0],[0],[0],[0],[14],[24],[24],[24],[24],[24],[24],[34],[11],[21],[21],[21],[21],[21],[21],[31],[15],[25],[25],[25],[25],[25],[25],[35],[11],[21],[21],[21],[21],[21],[21],[31],[6],[0],[0],[0],[0],[0],[5],[0],[6],[0],[0],[0],[4],[0],[0],[0],[4],[0],[0],[0],[3],[0],[0],[0],[2],[0],[0],[0],[1],[0],[0],[0],[1],[0],[0],[0],[6],[0],[0],[0],[2],[0],[0],[0],[5],[0],[0],[0],[3],[0],[0],[0],[4],[0],[0],[0],[2,5],[0],[3,4],[0],[1,6],[0],[0],[0],[0],[0],[0],[0],[3,6],[0],[0],[0],[2,5],[0],[2,5],[0],[1,4],[0],[0],[0],]
  def outPut(self):
    return self.theLevel

# 以上

# 游戏中的键盘按键
class keyButton:
  def __init__(self,pos,width,hight,text):
    self.pos=pos
    self.width=width
    self.hight=hight
    self.text=text
    self.state='up'
    self.theRect=pygame.Rect(pos[0],pos[1],width,hight)

  # 更新自己
  def update(self):
    if self.state == 'up':
      theText=pygame.font.Font("font/font2.ttf",30).render(self.text,True,BLACK,None)
    else:
      theText=pygame.font.Font("font/font2.ttf",24).render(self.text,True,(255,255,0),None)
    screen.blit(theText,(self.pos[0]+((self.width/2)-theText.get_width()/2),self.pos[1]+((self.hight/2)-theText.get_height()/2)))



# 游戏中共有6列能看见的轨道,每一列都是一个Line
# (还有一列隐形的用来定位,self.special是用来激活它的)
# 所有note作为一个整体下落
# 下落速度在各关卡文件里
class Line:
  def __init__(self,pos,width,hight,special=False):
    self.pos=pos
    self.width=width
    self.hight=hight
    self.image0=pygame.transform.scale(pygame.image.load(
      'images/blocks/block.png'),(self.width,self.hight))
    self.image1=pygame.transform.scale(pygame.image.load(
      'images/blocks/blockHoldStart.png'),(self.width,self.hight))
    self.image2=pygame.transform.scale(pygame.image.load(
      'images/blocks/blockHoldMid.png'),(self.width,self.hight+5))
    self.image3=pygame.transform.scale(pygame.image.load(
      'images/blocks/blockHoldOver.png'),(self.width,self.hight+5))
    self.state='up'
    self.blockLst=[]
    self.Round=0
    self.star=pygame.transform.scale(pygame.image.load('images/star.png'),(100,100))
    self.special=special

  # 添加一个note,包括它的类型、开始位置、和毫无用处的宽高
  def New(self,height,state):
    self.blockLst.append([state,pygame.Rect(self.pos[0],height,self.width,self.hight)])

  def update(self,key,num):
    global score,blockKilled,blockHit,times
    Del=0
    global realFPS,loopDelay
    # 防止开始帧数为0崩溃的
    if not realFPS:
      TheFPS=loopDelay
    else:
      TheFPS=realFPS
    
    # 遍历note列表
    for i in range(len(self.blockLst)):
      # 如果自己是特殊模式的(隐形的第七列专用)
      if self.special:
        # 直接下移
        self.blockLst[i-Del][1][1] += round(loopDelay/TheFPS,1)
        times += 1
      else:
        # 普通模式
        # 如果过了地下的线
        if self.blockLst[i-Del][1][1] >= 650:
          # 让miss图标亮起来
          miss.set_alpha(255)
          # 删除这个note
          self.blockLst.pop(i-Del)
          blockKilled += 1
          # 删除修正值 +1
          Del+=1
          continue
        # 如果接近了判定线再进行下面的判断
        if self.blockLst[i-Del][1][1] >= 400:
          # 如果note的rect和key的rect重合了
          if self.blockLst[i-Del][1].colliderect(key.theRect):
            #并且不是自动模式,自动模式直接完美判定
            if not autoPlay and key.state == 'down':
              if not (self.blockLst[i-Del][0] == 2 or self.blockLst[i-Del][0] == 3):
                # 如果说重合的大于20,就是完美,反之就是普通击中
                if self.blockLst[i-Del][1].clip(key.theRect)[3] >= 20:
                  perfect.set_alpha(255)
                  score += 8
                else:
                  nice.set_alpha(255)
                  score += 5
                hit.play()
                blockKilled += 1
                blockHit += 1
                self.star.set_alpha(255)
                self.blockLst.pop(i-Del)
                Del += 1
                continue
              else:
                # 如果是按住的note,直接完美
                perfect.set_alpha(255)
                self.star.set_alpha(255)
                self.blockLst.pop(i-Del)
                score += 8
                blockKilled += 1
                blockHit += 1
                Del += 1
                continue
            elif autoPlay:
              # 自动模式直接完美
              if self.blockLst[i-Del][0] == 0 or self.blockLst[i-Del][0] == 1:
                hit.play()
              perfect.set_alpha(255)
              self.star.set_alpha(255)
              self.blockLst.pop(i-Del)
              score += 8
              blockKilled += 1
              blockHit += 1
              Del += 1
              continue
        # 如果通过了上述检查,就将它下移几像素,根据关卡设置的速度和当前帧数动态计算
        self.blockLst[i-Del][1][1] += round(loopDelay/TheFPS,1)
        # 显示note
        if self.blockLst[i-Del][1][1] > -60 and not self.special:
          if self.blockLst[i-Del][0] == 0:
            screen.blit(self.image0,self.blockLst[i-Del][1])
          elif self.blockLst[i-Del][0] == 1:
            screen.blit(self.image1,self.blockLst[i-Del][1])
          elif self.blockLst[i-Del][0] == 2:
            screen.blit(self.image2,self.blockLst[i-Del][1])
          elif self.blockLst[i-Del][0] == 3:
            screen.blit(self.image3,self.blockLst[i-Del][1])

line1=Line([216,-50],80,50)
line2=Line([314,-50],80,50)
line3=Line([410,-50],80,50)
line4=Line([531,-50],80,50)
line5=Line([631,-50],80,50)
line6=Line([731,-50],80,50)
counterLine=Line([1200,-50],80,50,special=True)#诺,这不就隐形的第七列

#按键
a=keyButton([233,500],50,50,'A')
s=keyButton([331,500],50,50,'S')
d=keyButton([430,500],50,50,'D')
j=keyButton([545,500],50,50,'J')
k=keyButton([喵5,500],50,50,'K')
l=keyButton([745,500],50,50,'L')

# 按钮类
class button:
  def __init__(self,pos,width,hight):
    self.pos=pos
    self.width=width
    self.hight=hight
    self.text=''
    self.image=pygame.transform.scale(pygame.image.load(
      'images/buttonbg.png'),(width,hight))
    self.theRect=pygame.Rect(pos[0],pos[1],width,hight)
    self.state='else'

  def update(self,active=False):
    # 跟前面的大多数一样,显示自己
    if not active:
      if self.theRect.collidepoint(pygame.mouse.get_pos()):
        self.image=pygame.transform.scale(pygame.image.load(
          'images/buttonbgON.png'),(self.width,self.hight))
        if self.state == 'else':
          on.play()
        self.state='on'
      else:
        self.image=pygame.transform.scale(pygame.image.load(
          'images/buttonbg.png'),(self.width,self.hight))
        self.state='else'
    else:
      self.image=pygame.transform.scale(pygame.image.load(
        'images/buttonbgPRESS.png'),(self.width,self.hight))
      self.state='on'
    screen.blit(self.image,(self.pos[0],self.pos[1]))
    
    text=pygame.font.Font(
    "font/font2.ttf",24).render(self.text,True,WHITE,None)
    screen.blit(text,(self.pos[0]+((self.width/2)-text.get_width()/2),
                self.pos[1]+((self.hight/2)-text.get_height()/2)))

  def check(self):
    # 检查是否按下
    x,y=event.pos
    if self.state == 'on':
      self.update(active=True)
      press.play()
      pygame.display.update()
      timer.tick(10)
      return True
    else:
      return False


class MenuButton:
  # 转为主菜单那个神奇的开始键定制的类,除背景图片以外没有不同
  # (应该没有,我印象里好像没改其他的)
  def __init__(self,pos,width,hight):
    self.pos=pos
    self.width=width
    self.hight=hight
    self.text=''
    self.image=pygame.transform.scale(pygame.image.load(
      'images/menu/star.png'),(width,hight))
    self.theRect=pygame.Rect(pos[0],pos[1],width,hight)
    self.state='else'


  def update(self,active=False):
    if not active:
      if self.theRect.collidepoint(pygame.mouse.get_pos()):
        self.image=pygame.transform.scale(pygame.image.load(
          'images/menu/starON.png'),(self.width,self.hight))
        if self.state == 'else':
          on.play()
        self.state='on'
      else:
        self.image=pygame.transform.scale(pygame.image.load(
          'images/menu/star.png'),(self.width,self.hight))
        self.state='else'
    else:
      self.image=pygame.transform.scale(pygame.image.load(
        'images/menu/starPRESS.png'),(self.width,self.hight))
      self.state='on'
    screen.blit(self.image,(self.pos[0],self.pos[1]))
    text=pygame.font.Font(
      "font/font2.ttf",18).render(self.text,True,BLACK,None)
    screen.blit(text,(self.pos[0]+((self.width/2)-text.get_width()/2+1),
               self.pos[1]+((self.hight/2)-text.get_height()/2)+8))

  def check(self):
    # 去掉了按钮处于未激活状态的判断
    if self.state == 'on':
      self.update(active=True)
      press.play()
      pygame.display.update()
      timer.tick(10)
      return True
    else:
      return False

# 底下这俩函数是我从之前做的小游戏里搬过来的,具体咋用的真忘了,但是自己写的
def printText_singel(textInput,size,color,pos):
  text=pygame.font.Font("font/font2.ttf",size).render(textInput,True,color,None)
  screen.blit(text,(pos[0],pos[1]))

def printText(lst,size,color,pos):
  index=0
  for i in lst:
    text=pygame.font.Font("font/font2.ttf",size).render(i,True,color,None)
    screen.blit(text,(pos[0],pos[1]+text.get_height()*index))
    index += 1

# 保存当前界面的变量
state='MainMenu'

# 用来掐表的
timer=pygame.time.Clock()

# 一堆按钮的绑定
start=MenuButton((400,100),200,200)
start.text='开始'
exit=button((400,330),200,60)
exit.text='退出'
back2MainMenu=button((407,15),180,40)
back2MainMenu.text='返回主菜单'
left=button((200,480),180,60)
left.text='上一个'
play=button((400,480),180,60)
play.text='开始'
right=button((600,480),180,60)
right.text='下一个'
back2chooseMenu=button((880,30),80,40)
back2chooseMenu.text='返回菜单'
followMe=button((10,550),120,40)
followMe.text='在b站关注我'
donateMe=button((870,550),120,40)
donateMe.text='关于'

# 计数器,用来给动画效果记帧数的
counter=0

# 回到主菜单的时候是否需要重播音乐
back2menu=True

# 主循环
while 1:
  counter=0
  # 本来打算做捐助,后来发现好像不合法就改成了关于
  if state == 'donate':
    while state == 'donate':
      surface1=pygame.image.load('images/menu/MainBG.jpg')
      screen.blit(pygame.transform.scale(surface1,(4000,2667)),(-1800,-50))
      screen.blit(pygame.image.load('images/donatecover.png'),(0,0))
      screen.blit(pygame.image.load('images/donate.png'),(0,0))
      back2MainMenu.update()
      for event in pygame.event.get():
        if event.type == pygame.QUIT:
          sys.exit()
        if event.type == pygame.MOUSEBUTTONDOWN:
          if back2MainMenu.check():
            state='MainMenu'
            surface1=pygame.image.load('images/menu/MainBG.jpg')
            theSurface2=pygame.image.load('images/MenuCover2.png')
            counter=0
            while counter < 10:
              counter=0
              while counter < 10:
                counter += 1
                for event in pygame.event.get():
                  if event.type == pygame.QUIT:
                    sys.exit()
                screen.blit(pygame.transform.scale(MainBG,(4000-300*counter,2667-200*counter)),((-1800+counter*180),-50))
                pygame.display.update()
                timer.tick(60)
      pygame.display.update()
      timer.tick(60)
  # 主菜单
  elif state == 'MainMenu':
    MainBG=pygame.transform.scale(pygame.image.load('images/menu/MainBG.jpg'),(1000,667))
    if back2menu:
      pygame.mixer.music.fadeout(1000)
    back2menu=False
    while state == 'MainMenu':
      # 让主菜单动起来,动态的加上鼠标相对于中点的坐标
      screen.blit(MainBG,(0+(500-pygame.mouse.get_pos()[0])*0.01,-50+(290-pygame.mouse.get_pos()[1])*0.01))
      screen.blit(pygame.image.load('images/MenuCover2.png'),(0-(500-pygame.mouse.get_pos()[0])*0.01,-20-(290-pygame.mouse.get_pos()[1])*0.01))
      start.pos=[400-(500-pygame.mouse.get_pos()[0])*0.02,100-(500-pygame.mouse.get_pos()[1])*0.02]
      start.theRect[0],start.theRect[1]=(400-(500-pygame.mouse.get_pos()[0])*0.02,100-(500-pygame.mouse.get_pos()[1])*0.02)
      followMe.pos=[820-(500-pygame.mouse.get_pos()[0])*0.01,470-(500-pygame.mouse.get_pos()[1])*0.01]
      followMe.theRect[0],followMe.theRect[1]=(820-(500-pygame.mouse.get_pos()[0])*0.01,470-(500-pygame.mouse.get_pos()[1])*0.01)
      donateMe.pos=[820-(500-pygame.mouse.get_pos()[0])*0.01,520-(500-pygame.mouse.get_pos()[1])*0.01]
      donateMe.theRect[0],donateMe.theRect[1]=(820-(500-pygame.mouse.get_pos()[0])*0.01,520-(500-pygame.mouse.get_pos()[1])*0.01)
      start.update()
      followMe.update()
      donateMe.update()
      for event in pygame.event.get():
        if event.type == pygame.QUIT:
          sys.exit()
        if event.type == pygame.MOUSEBUTTONDOWN:
          if start.check():
            timer.tick(60)
            pygame.display.update()
            state='MainMenu2ChooseMenu'
          if followMe.check():
            webbrowser.ope喵500677215')
          if donateMe.check():
            MainBG=pygame.transform.scale(pygame.image.load('images/menu/MainBG.jpg'),(1000,667))
            theSurface2=pygame.image.load('images/MenuCover2.png')
            counter=0
            while counter < 10:
              counter += 1
              for event in pygame.event.get():
                if event.type == pygame.QUIT:
                  sys.exit()
              screen.blit(pygame.transform.scale(MainBG,(1000+300*counter,667+200*counter)),((0-counter*180),-50))
              screen.blit(theSurface2,((500-theSurface2.get_rect()[2] // 2),(290-theSurface2.get_rect()[3] // 2-counter*60)))
              start.pos=[400-(500-pygame.mouse.get_pos()[0])*0.01,100-(500-pygame.mouse.get_pos()[1])*0.01-counter*50]
              start.update()
              pygame.display.update()
              timer.tick(60)
            state='donate'
      pygame.display.update()
      timer.tick(60)
  # 这种名字很长的基本都是从一个界面切到另一个界面的过渡界面(也就是动画)
  elif state == 'MainMenu2ChooseMenu':
    MainBG=pygame.transform.scale(pygame.image.load('images/menu/MainBG.jpg'),(1000,667))
    theSurface2=pygame.image.load('images/MenuCover2.png')
    counter=0
    while counter < 10:
      counter += 1
      for event in pygame.event.get():
        if event.type == pygame.QUIT:
          sys.exit()
      screen.blit(pygame.transform.scale(MainBG,(1000+150*counter,667+100*counter)),((0-counter*90),-50))
      screen.blit(theSurface2,((500-theSurface2.get_rect()[2] // 2),(290-theSurface2.get_rect()[3] // 2-counter*60)))
      start.pos=[400-(500-pygame.mouse.get_pos()[0])*0.01,100-(500-pygame.mouse.get_pos()[1])*0.01-counter*50]
      start.update()
      pygame.display.update()
      timer.tick(60)
    counter=0
    while counter < 10:
      counter += 1
      for event in pygame.event.get():
        if event.type == pygame.QUIT:
          sys.exit()
      screen.blit(pygame.transform.scale(MainBG,(1000+150*(counter+10),667+100*(counter+10))),((0-(counter+10)*90),-50))
      textChooseLevel=pygame.font.Font("font/font2.ttf",48).render('关卡选择',True,WHITE,None)
      screen.blit(textChooseLevel,(500-textChooseLevel.get_width()+textChooseLevel.get_width()/2,counter*20-100-textChooseLevel.get_height()+textChooseLevel.get_height()/2))
      screen.blit(pygame.image.load('images/levels/levels.png'),(1000-counter*71,150))
      screen.blit(pygame.image.load('images/choosecover.png'),(1000-counter*100,150))
      right.pos=[right.pos[0],600-counter*12]
      left.pos=[left.pos[0],600-counter*12]
      play.pos=[play.pos[0],600-counter*12]
      right.update()
      left.update()
      play.update()
      pygame.display.update()
      timer.tick(60)
    MainBG=pygame.transform.scale(pygame.image.load('images/menu/MainBG.jpg'),(1000+150*(counter+10),667+100*(counter+10)))
    state='ChooseMenu'
    print((0-(counter+10)*90))
  # 选关的
  elif state == 'ChooseMenu':
    play.theRect[0],play.theRect[1]=(play.pos[0],play.pos[1])
    chooseLevel=0
    back2MainMenu.text='返回主菜单'
    while state == 'ChooseMenu':
      for event in pygame.event.get():
        if event.type == pygame.QUIT:
          sys.exit()
        if event.type == pygame.MOUSEBUTTONDOWN:
          if left.check():
            if chooseLevel > 0:
              chooseLevel -= 1
              counter=0
              while counter < 10:
                counter += 1
                screen.blit(MainBG,(-1800,-50))
                screen.blit(textChooseLevel,(500-textChooseLevel.get_width()+textChooseLevel.get_width()/2,100-textChooseLevel.get_height()+textChooseLevel.get_height()/2))
                screen.blit(pygame.image.load('images/levels/levels.png'),(290-(chooseLevel+1)*400+counter*40,150))
                screen.blit(pygame.image.load('images/choosecover.png'),(0,150))
                right.update()
                left.update()
                play.update()
                back2MainMenu.update()
                pygame.display.update()
                timer.tick(60)
          elif right.check():
            if chooseLevel < 4:
              chooseLevel += 1
              counter=0
              while counter < 10:
                counter += 1
                screen.blit(MainBG,(-1800,-50))
                screen.blit(textChooseLevel,(500-textChooseLevel.get_width()+textChooseLevel.get_width()/2,100-textChooseLevel.get_height()+textChooseLevel.get_height()/2))
                screen.blit(pygame.image.load('images/levels/levels.png'),(290-(chooseLevel-1)*400-counter*40,150))
                screen.blit(pygame.image.load('images/choosecover.png'),(0,150))
                right.update()
                left.update()
                play.update()
                back2MainMenu.update()
                pygame.display.update()
                timer.tick(60)
          elif play.check():
            state='Choose2gaming'
          elif back2MainMenu.check():
            state='ChooseMenu2MainMenu'
      screen.blit(MainBG,(-1800,-50))
      screen.blit(textChooseLevel,(500-textChooseLevel.get_width()+textChooseLevel.get_width()/2,100-textChooseLevel.get_height()+textChooseLevel.get_height()/2))
      screen.blit(pygame.image.load('images/levels/levels.png'),(290-chooseLevel*400,150))
      screen.blit(pygame.image.load('images/choosecover.png'),(0,150))
      back2MainMenu.update()
      right.update()
      left.update()
      play.update()
      pygame.display.update()
      timer.tick(60)

  # 动画
  elif state == 'ChooseMenu2MainMenu':
    counter=0
    while counter < 10:
      counter += 1
      for event in pygame.event.get():
        if event.type == pygame.QUIT:
          sys.exit()
      screen.blit(pygame.transform.scale(MainBG,(4000-150*counter,2667-100*counter)),((-1800+counter*90),-50))
      textChooseLevel=pygame.font.Font("font/font2.ttf",48).render('关卡选择',True,WHITE,None)
      screen.blit(textChooseLevel,(500-textChooseLevel.get_width()+textChooseLevel.get_width()/2,100-counter*20-textChooseLevel.get_height()+textChooseLevel.get_height()/2))
      screen.blit(pygame.image.load('images/levels/levels.png'),((290-chooseLeve喵-chooseLevel*400)) // 10)*counter,150))
      screen.blit(pygame.image.load('images/choosecover.png'),(0+counter*100,150))
      right.pos=[right.pos[0],600+counter*12]
      left.pos=[left.pos[0],600+counter*12]
      play.pos=[play.pos[0],600+counter*12]
      right.update()
      left.update()
      play.update()
      pygame.display.update()
      timer.tick(60)

    theSurface2=pygame.image.load('images/MenuCover2.png')
    counter=0
    while counter < 10:
      counter += 1
      # print(counter)
      for event in pygame.event.get():
        if event.type == pygame.QUIT:
          sys.exit()
      screen.blit(pygame.transform.scale(MainBG,(4000-150*(counter+10),2667-100*(counter+10))),((-1800+(counter+10)*90),-50))
      screen.blit(theSurface2,((0-(500-pygame.mouse.get_pos()[0])*0.02,-600-(290-pygame.mouse.get_pos()[1])*0.02+counter*60)))
      start.pos=[400-(500-pygame.mouse.get_pos()[0])*0.01,-400-(500-pygame.mouse.get_pos()[1])*0.01+counter*50]
      start.update()
      pygame.display.update()
      timer.tick(60)
    state='MainMenu'

  # 还是动画
  elif state == 'Choose2gaming':
    choose2detailSurface1=pygame.image.load('images/menu/MainBG.jpg')
    counter=0
    while counter < 10:
      counter += 1
      for event in pygame.event.get():
        if event.type == pygame.QUIT:
          sys.exit()
      screen.blit(pygame.transform.scale(choose2detailSurface1,(4000,2667)),(-1800,-50))
      textChooseLevel=pygame.font.Font("font/font2.ttf",48).render('关卡选择',True,WHITE,None)
      screen.blit(textChooseLevel,(500-textChooseLevel.get_width()+textChooseLevel.get_width()/2,100-counter*20-textChooseLevel.get_height()+textChooseLevel.get_height()/2))
      screen.blit(pygame.image.load('images/levels/levels.png'),((290-chooseLeve喵-chooseLevel*400)) // 10)*counter,150))
      screen.blit(pygame.image.load('images/choosecover.png'),(0+counter*100,150))
      right.pos=[right.pos[0],600+counter*12]
      left.pos=[left.pos[0],600+counter*12]
      play.pos=[play.pos[0],600+counter*12]
      right.update()
      left.update()
      play.update()
      pygame.display.update()
      timer.tick(60)
    state='choose2detail'

  # 依然是动画,但是要装载关卡信息,方便后面用
  elif state == 'choose2detail':
    if chooseLevel == 0:
      Self=level()
    elif chooseLevel == 1:
      Self=level()
    elif chooseLevel == 2:
      Self=level()
    elif chooseLevel == 3:
      Self=level()
    else:
      back2menu=True
      state='MainMenu'
      continue
    if len(Self.theLevel)<400 and Self.speed<500:
      difficulty='简单'
    elif 400800 and Self.speed>1000:
      difficulty='困难'
    elif len(Self.theLevel)<400 and Self.speed>1000:
      difficulty='短而较快'
    elif len(Self.theLevel)>800 and Self.speed<600:
      difficulty='长而较慢'
    else:
      difficulty='未分类'
    totalNote=0
    line1.blockLst=[]
    line2.blockLst=[]
    line3.blockLst=[]
    line4.blockLst=[]
    line5.blockLst=[]
    line6.blockLst=[]
    counterLine.blockLst=[]
    for i in range(len(Self.theLevel)):
      if 1 in Self.theLevel[i]:
        line1.New(-i*55-50,0)
        totalNote += 1
      if 2 in Self.theLevel[i]:
        line2.New(-i*55-50,0)
        totalNote += 1
      if 3 in Self.theLevel[i]:
        line3.New(-i*55-50,0)
        totalNote += 1
      if 4 in Self.theLevel[i]:
        line4.New(-i*55-50,0)
        totalNote += 1
      if 5 in Self.theLevel[i]:
        line5.New(-i*55-50,0)
        totalNote += 1
      if 6 in Self.theLevel[i]:
        line6.New(-i*55-50,0)
        totalNote += 1
      #----------
      if 11 in Self.theLevel[i]:
        line1.New(-i*55-50,1)
        totalNote += 1
      if 12 in Self.theLevel[i]:
        line2.New(-i*55-50,1)
        totalNote += 1
      if 13 in Self.theLevel[i]:
        line3.New(-i*55-50,1)
        totalNote += 1
      if 14 in Self.theLevel[i]:
        line4.New(-i*55-50,1)
        totalNote += 1
      if 15 in Self.theLevel[i]:
        line5.New(-i*55-50,1)
        totalNote += 1
      if 16 in Self.theLevel[i]:
        line6.New(-i*55-50,1)
        totalNote += 1
      #----------
      if 21 in Self.theLevel[i]:
        line1.New(-i*55-50,2)
        totalNote += 1
      if 22 in Self.theLevel[i]:
        line2.New(-i*55-50,2)
        totalNote += 1
      if 23 in Self.theLevel[i]:
        line3.New(-i*55-50,2)
        totalNote += 1
      if 24 in Self.theLevel[i]:
        line4.New(-i*55-50,2)
        totalNote += 1
      if 25 in Self.theLevel[i]:
        line5.New(-i*55-50,2)
        totalNote += 1
      if 26 in Self.theLevel[i]:
        line6.New(-i*55-50,2)
        totalNote += 1
        # ----------
      if 31 in Self.theLevel[i]:
        line1.New(-i*55-50,3)
        totalNote += 1
      if 32 in Self.theLevel[i]:
        line2.New(-i*55-50,3)
        totalNote += 1
      if 33 in Self.theLevel[i]:
        line3.New(-i*55-50,3)
        totalNote += 1
      if 34 in Self.theLevel[i]:
        line4.New(-i*55-50,3)
        totalNote += 1
      if 35 in Self.theLevel[i]:
        line5.New(-i*55-50,3)
        totalNote += 1
      if 36 in Self.theLevel[i]:
        line6.New(-i*55-50,3)
        totalNote += 1
      counterLine.New(-i*55-50,0)
      if Self.theLevel[i][0] == 'speedChange':
        speedChangeDict[i]=Self.theLevel[i][1]
      else:
        continue
    totalScore=totalNote*8
    details=['难度:'+difficulty,'总分:'+str(totalNote*8),'合格命中率 > 70%','(需要命中'+str(int(totalNote*0.7))+'次)']
    printText(details,36,WHITE,[710,-460])
    printText_singel(Self.name,48,WHITE,[120,-410])
    choose2detailSurface1=pygame.image.load('images/menu/MainBG.jpg')
    screen.blit(pygame.transform.scale(choose2detailSurface1,(4000,2667)),(-1800,-50))
    try:
      choose2detailSurface2=pygame.image.load('images/level'+str(chooseLevel+1)+'.png')
    except:
      choose2detailSurface2=pygame.image.load('images/levels/level.png')
    counter=0
    while counter < 10:
      for event in pygame.event.get():
        if event.type == pygame.QUIT:
          sys.exit()
      counter += 1
      screen.blit(pygame.transform.scale(choose2detailSurface1,(4000,2667)),(-1800,-50))
      screen.blit(choose2detailSurface2,(305,-170+counter*30))
      printText(details,36,WHITE,[710,-430+counter*60])
      printText_singel(Self.name,48,WHITE,[120,-380+counter*60])
      pygame.display.update()
      timer.tick(60)
    print(counter)
    screen.blit(choose2detailSurface2,(305,130))
    pygame.display.update()
    state='detail'
  elif state == 'detail':
    back2MainMenu.text='返回选关'
    play.pos=[play.pos[0],420]
    play.theRect[0],play.theRect[1]=(play.pos[0],420)
    while state == 'detail':
      for event in pygame.event.get():
        if event.type == pygame.QUIT:
          sys.exit()
        if event.type == pygame.MOUSEBUTTONDOWN:
          if back2MainMenu.check():
            state='detail2choose'
          if play.check():
            state='detail2gaming'
      screen.blit(pygame.transform.scale(choose2detailSurface1,(4000,2667)),(-1800,-50))
      screen.blit(choose2detailSurface2,(305,130))
      printText(details,36,WHITE,[710,170])
      printText_singel(Self.name,48,WHITE,[120,220])
      back2MainMenu.update()
      play.update()
      pygame.display.update()
      timer.tick(60)

  elif state == 'detail2choose':
    choose2detailSurface1=pygame.image.load('images/menu/MainBG.jpg')
    screen.blit(pygame.transform.scale(choose2detailSurface1,(4000,2667)),(-1800,-50))
    try:
      choose2detailSurface2=pygame.image.load('images/level'+str(chooseLevel+1)+'.png')
    except:
      choose2detailSurface2=pygame.image.load('images/levels/level.png')
    counter=0
    while counter < 10:
      for event in pygame.event.get():
        if event.type == pygame.QUIT:
          sys.exit()
      counter += 1
      screen.blit(pygame.transform.scale(choose2detailSurface1,(4000,2667)),(-1800,-50))
      screen.blit(choose2detailSurface2,(305,100-counter*30))
      pygame.display.update()
      timer.tick(60)
    counter=0
    while counter < 10:
      counter += 1
      for event in pygame.event.get():
        if event.type == pygame.QUIT:
          sys.exit()
      screen.blit(pygame.transform.scale(choose2detailSurface1,(4000,2667)),(-1800,-50))
      textChooseLevel=pygame.font.Font("font/font2.ttf",48).render('关卡选择',True,WHITE,None)
      screen.blit(textChooseLevel,(500-textChooseLevel.get_width()+textChooseLevel.get_width()/2,counter*20-100-textChooseLevel.get_height()+textChooseLevel.get_height()/2))
      screen.blit(pygame.image.load('images/levels/levels.png'),(1000-counter*71,150))
      screen.blit(pygame.image.load('images/choosecover.png'),(1000-counter*100,150))
      right.pos=[right.pos[0],600-counter*12]
      left.pos=[left.pos[0],600-counter*12]
      play.pos=[play.pos[0],600-counter*12]
      right.update()
      left.update()
      play.update()
      pygame.display.update()
      timer.tick(60)
    state='ChooseMenu'

  elif state == 'detail2gaming':
    surface1=pygame.image.load('images/normalBG.png')
    surface2=pygame.image.load('images/BLACK.png')
    counter=0
    while counter < 25:
      counter += 1
      screen.blit(surface1,(0,0))
      surface2.set_alpha(5+counter*10)
      screen.blit(surface2,(0,0))
      pygame.display.update()
      timer.tick(60)
    pygame.mixer.music.fadeout(500)
    counter=0
    while counter < 25:
      counter += 1
      screen.blit(surface1,(0,0))
      screen.blit(pygame.image.load('images/road.png'),(0,0))
      surface2.set_alpha(250-counter*10)
      screen.blit(surface2,(0,0))
      pygame.display.update()
      timer.tick(60)
    state='gaming'

  # 游戏界面
  elif state == 'gaming':
    times=0
    score=0
    blockKilled=0
    blockHit=0
    realFPS=0

    delaytoPlay=Self.delaytoPlay
    loopDelay=Self.speed
    # print(loopDelay)
    played=False
    pygame.mixer.music.load(Self.music)
    pygame.mixer.music.set_volume(0.8)
    miss=pygame.transform.scale(pygame.image.load('images/tooSlow.png'),(100,130))
    nice=pygame.transform.scale(pygame.image.load('images/good.png'),(100,130))
    perfect=pygame.transform.scale(pygame.image.load('images/perfect.png'),(100,130))
    try:
      bg=pygame.transform.scale(pygame.image.load(Self.bg),(1000,600))
    except:
      bg=pygame.image.load('images/normalBG.png')
    road=pygame.image.load('images/road.png')
    autoPlayOrNot=pygame.font.Font("font/font2.ttf",52).render('自动播放',True,WHITE,None)
    autoPlayOrNot.set_alpha(100)
    speedChangeDict={}
    Len=len(Self.theLevel)
    realLen=len(Self.theLevel)

    # 内嵌小主循环
    while state == 'gaming':
      screen.blit(bg,(0,0))
      screen.blit(road,(0,0))
      back2chooseMenu.update()
      # 延迟播放音乐用的
      if counterLine.blockLst[0][1][1] >= delaytoPlay and not played:
        pygame.mixer.music.play()
        played=True
      # 乱加的多线程
      threading.Thread(target=line1.update(a,1)).start()
      threading.Thread(target=line2.update(s,2)).start()
      threading.Thread(target=line3.update(d,3)).start()
      threading.Thread(target=line4.update(j,4)).start()
      threading.Thread(target=line5.update(k,5)).start()
      threading.Thread(target=line6.update(l,6)).start()
      counterLine.update(s,7)
      key_list=pygame.key.get_pressed()
      if key_list[pygame.K_a]:
        a.state='down'
      else:
        a.state='up'
      if key_list[pygame.K_s]:
        s.state='down'
      else:
        s.state='up'
      if key_list[pygame.K_d]:
        d.state='down'
      else:
        d.state='up'
      if key_list[pygame.K_j]:
        j.state='down'
      else:
        j.state='up'
      if key_list[pygame.K_k]:
        k.state='down'
      else:
        k.state='up'
      if key_list[pygame.K_l]:
        l.state='down'
      else:
        l.state='up'
      threading.Thread(target=a.update()).start()
      threading.Thread(target=s.update()).start()
      threading.Thread(target=d.update()).start()
      threading.Thread(target=j.update()).start()
      threading.Thread(target=k.update()).start()
      threading.Thread(target=l.update()).start()
      screen.blit(miss,(460,130))
      screen.blit(perfect,(460,130))
      screen.blit(nice,(460,130))
      perfect.set_alpha(perfect.get_alpha()-51)
      nice.set_alpha(nice.get_alpha()-51)
      miss.set_alpha(miss.get_alpha()-51)
      line1.star.set_alpha(line1.star.get_alpha()-51)
      line2.star.set_alpha(line2.star.get_alpha()-51)
      line3.star.set_alpha(line3.star.get_alpha()-51)
      line4.star.set_alpha(line4.star.get_alpha()-51)
      line5.star.set_alpha(line5.star.get_alpha()-51)
      line6.star.set_alpha(line6.star.get_alpha()-51)
      screen.blit(line1.star,[line1.pos[0]-10,470])
      screen.blit(line2.star,[line2.pos[0]-10,470])
      screen.blit(line3.star,[line3.pos[0]-10,470])
      screen.blit(line4.star,[line4.pos[0]-10,470])
      screen.blit(line5.star,[line5.pos[0]-10,470])
      screen.blit(line6.star,[line6.pos[0]-10,470])
      # 显示界面上的文字
      screen.blit(pygame.font.Font("font/font2.ttf",48).render('得分',True,WHITE,None),(880,100))
      scoreBlit=pygame.font.Font("font/font2.ttf",36).render(str(score),True,WHITE,None)
      screen.blit(scoreBlit,(915-scoreBlit.get_width()//2,160))
      screen.blit(pygame.font.Font("font/font2.ttf",48).render('命中率',True,WHITE,None),(50,100))
      try:
        blockBlit=pygame.font.Font("font/font2.ttf",36).render(str(round((blockHit/blockKilled)*100,2))+' %',True,WHITE,None)
      except:
        blockBlit=pygame.font.Font("font/font2.ttf",36).render('0.00 %',True,WHITE,None)
      screen.blit(blockBlit,(110-blockBlit.get_width() // 2,160))
      screen.blit(pygame.font.Font("font/font2.ttf",40).render('进度',True,WHITE,None),(480,10))
      try:
        rate=pygame.font.Font("font/font2.ttf",30).render(str(round((blockKilled/totalNote)*100,2))+' %',True,WHITE,None)
      except:
        rate=pygame.font.Font("font/font2.ttf",36).render('0.00 %',True,WHITE,None)
      screen.blit(rate,(516-rate.get_width() // 2,60))
      if autoPlay:
        screen.blit(autoPlayOrNot,(510-autoPlayOrNot.get_width() // 2,300))
      pygame.display.update()
      for event in pygame.event.get():
        if event.type == pygame.QUIT:
          sys.exit()
        if event.type == pygame.MOUSEBUTTONDOWN:
          if back2chooseMenu.check():
            state='MainMenu'
            back2menu=True
            counter=0
            surface1=pygame.image.load('images/menu/MainBG.jpg')
            surface2=pygame.image.load('images/BLACK.png')
            while counter < 10:
              counter += 1
              screen.blit(pygame.transform.scale(surface1,(4000,2667)),(-1800,-50))
              surface2.set_alpha(5+counter*25)
              screen.blit(surface2,(0,0))
              pygame.display.update()
              timer.tick(60)
            counter=0
            while counter < 10:
              counter += 1
              screen.blit(pygame.transform.scale(surface1,(4000,2667)),(-1800,-50))
              surface2.set_alpha(250-counter*25)
              screen.blit(surface2,(0,0))
              pygame.display.update()
              timer.tick(60)
            surface1=pygame.image.load('images/menu/MainBG.jpg')
            theSurface2=pygame.image.load('images/MenuCover2.png')
            counter=0
            while counter < 10:
              counter=0
              while counter < 10:
                counter += 1
                for event in pygame.event.get():
                  if event.type == pygame.QUIT:
                    sys.exit()
                screen.blit(pygame.transform.scale(MainBG,(4000-300*counter,2667-200*counter)),((-1800+counter*180),-50))
                pygame.display.update()
                timer.tick(60)
            theSurface2=pygame.image.load('images/MenuCover2.png')
            counter=0
            break
      timer.tick(40)
      realFPS=timer.get_fps()
      if not line1.blockLst and not line2.blockLst and not line3.blockLst and not line4.blockLst and not line5.blockLst and not line6.blockLst:
        if not pygame.mixer.music.get_busy():
          state='gaming2end'


  elif state == 'gaming2end':
    state='end'
    back2menu=True
    counter=0
    surface1=pygame.transform.scale(pygame.image.load('images/menu/MainBG.jpg'),(4000,2667))
    surface2=pygame.image.load('images/BLACK.png')
    while counter < 25:
      counter += 1
      screen.blit(surface1,(-1800,-50))
      surface2.set_alpha(5+counter*10)
      screen.blit(surface2,(0,0))
      pygame.display.update()
      timer.tick(60)
    counter=0
    while counter < 25:
      counter += 1
      screen.blit(surface1,(-1800,-50))
      surface2.set_alpha(250-counter*10)
      screen.blit(surface2,(0,0))
      pygame.display.update()
      timer.tick(60)

  # 没做完的结束统计
  elif state == 'end':
    state='end2MainMenu'

  # 返回主菜单
  elif state == 'end2MainMenu':
    state='MainMenu'
    surface1=pygame.image.load('images/menu/MainBG.jpg')
    theSurface2=pygame.image.load('images/MenuCover2.png')
    counter=0
    while counter < 10:
      counter=0
      while counter < 10:
        counter += 1
        for event in pygame.event.get():
          if event.type == pygame.QUIT:
            sys.exit()
        screen.blit(pygame.transform.scale(MainBG,(4000-300*counter,2667-200*counter)),((-1800+counter*180),-50))
        pygame.display.update()
        timer.tick(60)


 

【提示】

部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:

https://python.codemao.cn


回复

上一页1 页 / 共 1下一页
yh12i31yh12i31

精帖无人?

点赞0


评论


尬聊boy尬聊boy

虽然没有图片,但是我还是大受震惊

点赞0


评论


AokenAoken

喵d

点赞0


评论


技术喵的真传子弟技术喵的真传子弟

怎么运行不了emotion_雷电猴_疑问

点赞0


评论