外で遊べなくて暇だから一人イントロクイズ作った


音ゲーマーです。普段ゲーセンでCHUNITHMとか遊んでます。
でも緊急事態宣言出たので遊べません。暇です。
だから、とりあえず買い集めたサウンドトラックでイントロクイズをしようと思いました。
でもイントロクイズって出題者がいないと出来ないんですよね。
出題者役を親に頼むのもアレなので、とりあえずPythonにやってもらうことにしました。

Gistはこちら

環境

Python: 3.8.2
python-vlc: 3.0.7110
VLC Media Player: 3.0.8 Vetinari

使い方

手順1・2に関してはこちらの記事が詳しい。
(0. Python 3.8.2をインストールする。)
1. VLC Media Playerをインストールする。
2. pip install python-vlcをする。(詳しい人へ: グローバル環境を汚したくない場合はvenvなりを手順3で示したディレクトリで設定してください。)
3. intro_quiz.pyをGistからコピペするなりなんなりして保存し、音楽が置かれたフォルダー(ディレクトリ)に入れる。
4. ダブルクリックすれば多分起動するので楽しむ。

仕様

  • 曲が最初から10秒間再生されます。
  • 曲名が3文字未満の場合を除いて、3文字未満では反応しません。1-2文字だけ入れて誤魔化そうとしても無駄です。
  • giveupと入力するとギブアップできます。
  • 部分一致だと「正解」、完全一致だと「パーフェクト」の判定になります。
  • たまにビットレート関連のエラーが起きてる気がしますがプレイできるので問題ないです

プレイ画像


フォルダにArcaeaとかの曲も混ざってます。

注意

適当に作ったのでバグっても知りません。でも教えてくれたら直すかもしれないし直さないかもしれません。


ここからは中身に興味のある人向けです。

コード

夜中に眠い目を擦って適当に書いたので汚いです。

intro_quiz.py

# VLC media playerをインストールした後、pip install python-vlcしてください。

import glob
import os
import random
import time

import vlc

player = vlc.MediaPlayer()

print("イントロクイズ!")
print("曲名の一部を入力してね!部分一致で判定するよ!")
print("曲が流れる時間は10秒だよ!")
print("どうしてもわからなかったら「giveup」と入力してね!")
print("曲名が2文字以下の場合を除いて、入力された文字数が2文字以下の場合は反応しないよ!")

music_count = 1

musics = glob.glob("*")

while True:
    # ファイル選択・再生
    if musics == []:
        break
    else:
        while True:
            filename = random.choice(musics)
            if filename.endswith(".py") or filename.endswith(".txt") or filename.startswith("AlbumArt_") or "Folder" in filename:
                musics.pop(musics.index(filename))
            else:
                musics.pop(musics.index(filename))
                break
        music_name = os.path.splitext(os.path.basename(filename))[0]
        player.set_mrl(filename)
        player.play()
        print(f"{music_count}曲目を再生中…")
        time.sleep(10)
        player.stop()
        print("さあ、曲名を入力してね!")
        while True:
            answer = input(">> ")
            if len(answer) >= min(3, len(filename)):
                if answer == music_name:
                    print("パーフェクト!すごいね!")
                    break
                elif answer in music_name:
                    print("正解!おめでとう!")
                    break
                elif answer == "giveup":
                    print("ナイストライ!")
                    break
                else:
                    print("残念!不正解!")
            else:
                print(f"{min(3, len(filename))}文字以上入力しようね!")
        print(f"正解は「{music_name}」でした!")
        music_count += 1
print("全曲が終了したよ!おつかれさま!")

説明とか

globで同階層にあるファイルを全部掻き集めてます。ただ、その際表示されていないだけでアルバムアートも大量に同ディレクトリにあったので、それらは適当に弾いてます。他にもPythonのファイルだとか何かで紛れ込んだtxtファイルだとかを適当に弾いてます。orで弾く条件付け足せるので、一応print(glob.glob("*"))とかを実行して変なファイルがないか確かめておくといいと思います。ぶっちゃけ.jpgとか.pngとかの拡張子を弾いたほうがいいような気もする。

宣伝

みんなCHUNITHMやろう!と言おうとしたけど今遊べないから代わりにArcaeaやろう。