在python pygame中随机从列表中和无限期无需使用按钮手动更改歌曲运行歌曲列表

问题描述

我的游戏中有背景音乐。我有一个包含多首歌曲的列表,我希望它们以随机顺序不断播放(这就是我在那里导入 choice 的原因)但它只在我称为 play 的用户定义函数上运行一次.当我放 loops =-1 时,它只会运行一遍又一遍选择的随机歌曲。我想让它改变歌曲而不必手动改变它(不需要使用按钮或其他东西来改变歌曲)。我该怎么做?

这是代码(这是我现在在游戏中用来播放音乐的代码):

from tkinter import *
import pygame
from random import choice


pygame.mixer.init()

Music_list=["song1.mp3","song2.mp3","song3.mp3"]

#Play the backgound music
def play():
       Song=choice(Music_list)
       pygame.mixer.music.load(Song)
       pygame.mixer.music.play() # if i put a loops=-1 here,it will only run that one song forever. It wont change. And if I have nothing there,it only plays once 
play()

解决方法

因为您在选择歌曲后无限地迭代,所以您总是得到相同的歌曲。

你想移动你的循环来调用整个播放函数

from tkinter import *
import pygame
from random import choice


pygame.mixer.init()

MUSIC_LIST=["song1.mp3","song2.mp3","song3.mp3"]

#Play the backgound music
def play():
       Song=choice(MUSIC_LIST)
       pygame.mixer.music.load(Song)
       pygame.mixer.music.play()


while True:
    play()  
,

使用 mixer.music.get_busy() 测试是否有任何声音被混合。一首歌曲结束时播放下一首歌曲:

import pygame
from random import choice

pygame.mixer.init()

Music_list=["song1.mp3","song3.mp3"]
current_list = []

def play():
       song = choice(Music_list)
       pygame.mixer.music.load(song)
       pygame.mixer.music.play()

while True:

    if not pygame.mixer.music.get_busy():
        play()

    # [...]

改进播放方法,确保没有曲目重复播放:

Music_list=["song1.mp3","song3.mp3"]
current_list = []

def play():
       global current_list
       if not current_list:
           current_list = Music_list[:]
           random.shuffle(current_list)

       song = current_list[0]
       current_list.pop(0)
       pygame.mixer.music.load(song)
       pygame.mixer.music.play()

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...