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

【作品介绍】
喵把原本分散在多个文件中的代码整合进了一个,且只能玩春节序曲
为了符合代码字数限制,删掉了所有不必要的空格,且缩进改为两个空格
暑假时要新做一个游戏,有意合作者+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