小游戏系列:键盘钢琴——python

前文

疫情在家没事干?不如上网看一看!平时闲的没事的我最近沉浸在逛美食制作的视频当中,试图用为数不多的材料做出属于自己的那份美味。突然,我被其中一个视频的bgm钢琴曲迷住了,突然有了一种想弹钢琴的想法,可是又没有钢琴,那咋办呢。。。然后一个朋友就说了:“你个憨憨,按键盘不就好咯”,想了想,好像有这么几分道理,于是就想到了用pygame模块播放音频的方法制作这个钢琴小玩具。

PS:

首先呢,这肯定是会有一些小瑕疵的,充其量自己拿着玩,跟真的钢琴比手感肯定是差很多的。

正文:

一开始没有头绪是吧,我们就想想钢琴是怎样的一个东西——按键,然后出一个声音。那么我们是不是只需要写一个程序,将输入的按键与播放的声音绑定起来就可以了呢。

啊那么有的同学就会问了:老师,我们没有键盘怎么办呢,我想弄一个手机那样的虚拟按键行不行啊!
对于这个问题呢,我的回答是:自己优化去吧(一边玩蛋去)

那么我们有什么可以用的工具或者模块吗?有的,就是pygame这个模块。那么有的杠精同学可能又要问了:”这不是写游戏的吗?“ “诶对,我就把它当游戏来写”

#首先我们会用到三个模块:pygame、sys、time,
#pygame用作游戏运行的窗口创建和按键绑定、文件的读取,是主要部分
#sys用于窗口的正常退出,也就是只用一句sys.quit()而已
#time用于给两次按键输入一点间隔时间
import pygame
import sys
import time
from pygame.locals import *
#其中呢,locals存的就是pygame里按键的映射,就是按键的识别

简简单单的头文件,接下来我们先创建一些所需要的变量,比如创建的窗口大小啦,按键对应钢琴键盘的哪个音啦之类的,如下我就创建了一个宽300px,高200px的一个框作为游戏框,不然在桌面按键盘可能会不小心按到一些不太好的东西(指游戏),然后创了一个字典来存按键对应的音调

#不清楚按键有什么的话可以自行搜一下
keyDict={
	K_1:"c",
	K_2:"d",
	K_3:"e",
	K_4:"f",
	K_5:"g",
	K_6:"a",
	K_7:"b",
	K_8:"c1",
	K_9:"d1",
	K_0:"e1",
	K_MINUS:"f1",
	K_EQUALS:'g1',
	K_q:'a1',
	K_w:'b1',
	K_e:'c2',
	K_r:'d2',
	K_t:'e2',
	K_y:'f2',
	K_u:'g2',
	K_i:'a2',
	K_o:'b2',
	K_p:'c3',
	K_a:'d3',
	K_s:'e3',
	K_d:'f3',
	K_f:'g3',
	K_g:'a3',
	K_h:'b3',
	K_j:'c4',
	K_k:'d4',
	K_l:'e4',
	K_z:'f4',
	K_x:'g4',
	K_c:'a4',
	K_v:'b4',
	K_b:'c5'
}

bg_size = width, height = 300,200

那么剩下的就是很简单的创建窗口和逻辑循环

#窗口创建部分

pygame.init()
pygame.mixer.init()
#上面两句是创建pygame对象

screen = pygame.display.set_mode(bg_size)
#这句是设置窗口大小

pygame.display.set_caption("Music")
#设置窗口标题

pygame.mixer.set_num_channels(32)
#设置音道数,因为播放一个音频是需要一条音道的,如果音道数量不够就会出现按键声音不出来的情况,也就是阻塞了
#pygame逻辑部分
while True:
#while大循环用于每次的按键输入,当for循环得到输入是右上角的X时就关闭程序,否则就输出音频
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type == KEYDOWN:
            key = event.key
            #下面这句就是找对应按键的音频
            if key in keyDict.keys():
                pygame.mixer.Sound("audios/" + keyDict[key] + ".wav").play(maxtime = 1500)
                #Sound里拼接起来是文件的路径
                #maxtime是设置每个音频播放的最长时间,以免音乐一直占着一个音道阻塞
    #sleep使每次输入之间存在间隔,其实好像可以不要            
    time.sleep(0.01)

懒得敲可以直接按顺序拼接代码即可

源代码带音频文件:https://gitee.com/dkchaos/mypiano1st.git
(说实话很想用github的链接的但是真的打不开于是转用码云的链接,一样的)

你可能感兴趣的:(小游戏)