python代码实现练习吉他品格与唱名

小编喜欢音乐和编程,总是想一些奇怪的点子能够结合一下两个热爱的领域。背吉他唱名实在太枯燥了,于是就突发奇想写了一个python小程序,辅助自己记忆指板。

import time
import datetime
import json
import random

# 记录程序开始时间
start = time.time()

def calculate2(a, b):
    """根据1、2、4、6弦弦数和品数计算简谱"""
    c = float(a + 0.5 * b)
    if 3.5 <= c < 7:
        c += 0.5
    elif c == 7.5:
        c = 1
    elif c == 7 and b != 0:
        c = 1
    elif c > 7.5:
        c = float(c - 7) + 0.5
        if c >= 3.5:
            c += 0.5
    return c

def calculate3(a, b):
    """根据3、5弦弦数和品数计算简谱"""
    if 0 <= b <= 4:
        return calculate2(a, b)
    else:
        return calculate2(a, b)

def calculate1(a, b):
    """根据弦数调用不同的计算方法"""
    values = [3, 7, 5, 2, 6, 3]
    a = values[a - 1]
    if 1 < a < 4 or a == 7:
        return calculate2(a, b)
    else:
        return calculate3(a, b)

def main():
    count = 0
    res = 0
    wrong_questions = []

    while count < 20:
        count += 1
        print(f"这是你的第{count}次尝试,加油!")
        
        num1 = random.randint(1, 6)
        num2 = random.randint(0, 8)
        answer = calculate1(num1, num2)

        try:
            num = float(input(f"请问{num1}弦{num2}品的简谱是:"))
        except ValueError:
            num = float(input("输入格式有误!请重新输入一个数字:"))
        
        if num == answer:
            print("恭喜你答对啦,你真棒!距离吉他大师又近了一步!")
            res += 1
        else:
            print(f"很遗憾答错了,正确答案是{answer},熟能生巧,请再试一次吧!")
            wrong_questions.append((num1, num2, answer))

    show_results(count, res, start, wrong_questions)

def show_results(count, res, start, wrong_questions):
    """显示结果并记录数据"""
    a = float(res / count)
    end = time.time()
    duration = float(end - start)

    print("——————————")
    print("本轮练习已结束,辛苦啦!")
    print("你的战绩如下:")
    print(f"本轮用时{duration:.2f}秒,一共答对了{res}次,正确率为{a:.2%},坚持就是胜利,请继续加油!")

    file_path = "D:/Desktop/练琴数据.txt"
    save_results(file_path, a, duration)

    print("——————————")

    if wrong_questions:
        review_wrong_questions(wrong_questions)

def save_results(file_path, accuracy, duration):
    """保存结果到文件"""
    with open(file_path, "a") as f:
        now = datetime.datetime.now()
        eff = float((accuracy) / (duration) * 100)
        result = {
            "日期": now.strftime("%Y-%m-%d %H:%M:%S"),
            "正确率": f"{accuracy:.2%}",
            "花费时间": f"{duration:.2f}s",
            "比率": f"{eff:.2f}"
        }
        json.dump(result, f, ensure_ascii=False, indent=4)
        f.write("\n")

def review_wrong_questions(wrong_questions):
    """复习错误的问题"""
    print("以下是你回答错误的题目,请再做一遍以加深印象:")
    for num1, num2, answer in wrong_questions:
        print(f"{num1}弦{num2}品的简谱是:")
        try:
            num = float(input("请输入你的答案:"))
            if num == answer:
                print("恭喜你答对啦,你真棒!")
            else:
                print(f"很遗憾答错了,正确答案是{answer},请记住哦!")
        except ValueError:
            num = float(input("输入格式有误,请重新输入一个数字!"))
            if num == answer:
                print("恭喜你答对啦,你真棒!")
            else:
                print(f"很遗憾答错了,正确答案是{answer},熟能生巧,请再试一次吧!")

if __name__ == "__main__":
    main()

希望我可以做出更多好玩的东西来!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值