Python 难以控制的计划带来的困难

Python 难以控制的计划带来的困难,python,Python,我已经在这个代码上工作了几个小时了,我很不确定问题出在哪里 import random#imports random import os#Imports os print("Welcome to the maths quiz") # Welcomes user to quiz score = (0) def details(): plr_name = input ("Please Input Name:") # Asks user for name plr_class = i

我已经在这个代码上工作了几个小时了,我很不确定问题出在哪里

import random#imports random
import os#Imports os
print("Welcome to the maths quiz") # Welcomes user to quiz
score = (0)


def details():
    plr_name = input ("Please Input Name:") # Asks user for name
    plr_class = input("Input class number: ") # Asks the user for class numer
return (plr_name, plr_class)

def Q():
    while qno < 10: # loops while qno is under 10
        ran_num1 = random.randint(1,99) # Generates the first random number
        ran_num2 = random.randint(1,99) # Generates the second random number
        ran_fun = random.choice("X-+") # Picks a random function
        print(ran_num1,ran_fun,ran_num2,"=") # Prints the Sum for the user
        if ran_fun == "X":
            sum_ans = ran_num1 * ran_num2 # Does the sum if it is a multiplication
        if ran_fun == "+":
            sum_ans = ran_num1 + ran_num2 # Does the sum if it is a addition
        if ran_fun == "-":
            sum_ans = ran_num1 - ran_num2 # Does the sum if it is a subtraction
        plr_ans = int(input()) # Gets the user's answer
        if plr_ans == sum_ans:
            print("Correct!") # Prints correct
            score = score + 1 # Adds 1 to score
        else:
            print("Incorrect!")
        qno = qno + 1 # Adds 1 to qno


def plr_list_make(lines, listoreder):
    index = 0
    plr_names =[]
    plr_scores =[]

    for line in lines:
        if listorder == 1:
            column =0
            rev = False
    else:
       column = 1
       rev = True
    return sorted(zip(plr_names, plr_scores),key = lambda x:(x[column]),reverse = rev)


def fileUP(plr_name, score, line ):
    found = False
    index = 0
    for line in lines:
        if line.startswith(plr_name):
            line = line.strip("\n") + ","+str(score+"\n")
            lines[index] = line
            found = True
        index = index + 1
    if not found:
        lines.append(plr_name+"|" +str(score)+"\n")
    return lines


def save (plr_name, plr_class, score):
    filename = "QuizScore_"+plr_class+".txt"
    try:
        fileI = open(filename)
    except IOError:
        fileI = open(filename, "w+")
        fileI = open(filename)
    lines = fileI.readlines()
    fileI.close

    lines = FileUP(plr_name, score, lines)
    fileO = open(filename, "w")
    fileO.writelines(lines)
    fileO.close


def disp_list(): ## intialise_list
    student_list=[] 
    filename = "QuizScore_"+plr_class+".txt"
    try:
        ## open file read into list "lines"
        input_file = open(filename)
        lines = input_file.readlines()   ## read file into list "lines"
        input_file.close

        student_list = create_student_list(lines, listorder) ### update "lines" with student list as requested by user

        ## output sorted list
        for counter in range(len(student_list)):
            print ("Name and Score: ", student_list[counter][0], student_list[counter][1])    

    except IOError:
        print ("no class file!!!")



def menu():
    print ("1 Test")
    print ("2 Alphabetical")
    print ("3 Highscore")
    print ("4 Avg Score")

def Run():
    selection = 0
    while selection != 5:
        menu()
        option = int(input("Please select option: "))     
        if option == 1:
            name, plr_class = details()
            save(name, plr_class, Q())
        else:
            plr_class = input("input class ")
            disp_list(plr_class, option-1)
Run()
import random#导入random
导入操作系统#导入操作系统
打印(“欢迎参加数学测验”)#欢迎用户参加测验
分数=(0)
def details():
plr_name=input(“请输入名称:”)#要求用户输入名称
plr_class=input(“输入类号:”)#向用户询问类号
返回(plr_名称、plr_类)
def Q():
当qno<10时:#当qno小于10时循环
ran_num1=随机。randint(1,99)#生成第一个随机数
rand_num2=random.randint(1,99)#生成第二个随机数
ran_fun=random.choice(“X-+”)选择一个随机函数
打印(ran_num1、ran_fun、ran_num2,“=”)#为用户打印总和
如果run_fun==“X”:
sum_ans=ran_num1*ran_num2#如果是乘法,则求和
如果run_fun==“+”:
sum_ans=ran_num1+ran_num2#如果是加法,则求和
如果ran_fun==“-”:
sum_ans=ran_num1-ran_num2#如果是减法,则求和
plr_ans=int(input())#获取用户的答案
如果plr=总和:
打印(“正确!”)#打印正确
分数=分数+1#分数加1
其他:
打印(“不正确!”)
qno=qno+1#qno加1
def plr_列表制作(行、列表编辑器):
索引=0
plr_名称=[]
plr_得分=[]
对于行中的行:
如果listorder==1:
列=0
rev=假
其他:
列=1
rev=真
返回排序(zip(plr_名称,plr_分数),key=lambda x:(x[列]),reverse=rev)
def文件(plr_名称、分数、行):
发现=错误
索引=0
对于行中的行:
如果行开始(plr\U名称):
line=line.strip(“\n”)+”,“+str(分数+”\n”)
行[索引]=行
找到=真
索引=索引+1
如果未找到:
行。追加(plr_name+“|”+str(score)+“\n”)
回程线
def保存(plr_名称、plr_类别、分数):
filename=“QuizScore_u”+plr_class+”.txt”
尝试:
fileI=打开(文件名)
除IOError外:
fileI=open(文件名为“w+”)
fileI=打开(文件名)
lines=fileI.readlines()
文件I.关闭
行=文件(plr_名称、分数、行)
fileO=open(文件名为“w”)
文件写入线(行)
文件关闭
def disp_list():##初始化_list
学生名单=[]
filename=“QuizScore_u”+plr_class+”.txt”
尝试:
##打开文件读取到列表“行”
输入文件=打开(文件名)
lines=输入_file.readlines()##将文件读入列表“行”
input_file.close
学生列表=创建学生列表(行,列表顺序)####根据用户请求使用学生列表更新“行”
##输出排序列表
对于范围内的计数器(len(学生列表)):
打印(“姓名和分数:”,学生名单[计数器][0],学生名单[计数器][1])
除IOError外:
打印(“无类文件!!!”)
def菜单():
打印(“1次测试”)
打印(“按字母顺序2”)
打印(“3高分”)
打印(“4平均分数”)
def Run():
选择=0
选择时!=5:
菜单()
option=int(输入(“请选择选项:”)
如果选项==1:
名称,plr_class=details()
保存(名称,plr\u类,Q())
其他:
plr_类=输入(“输入类”)
显示列表(plr类,选项1)
运行()
错误:

回溯(最近一次呼叫最后一次):
文件“C:\Users\user\Documents\CharlieStockham\cgsca\ca2.py”,第117行,在 运行()
文件“C:\Users\user\Documents\CharlieStockham\cgsca\ca2.py”,第113行,正在运行 保存(名称,plr\u类,Q())
文件“C:\Users\user\Documents\CharlieStockham\cgsca\ca2.py”,第74行,保存 行=文件(plr_名称、分数、行) NameError:未定义全局名称“FileUP”

第110行:

        name, plr_class = details()
但是
details
函数不返回任何内容,因此Python尝试将默认返回值
None
分配给tuple
name,plr\u类
。它不能这样做,因为
None
不是一个iterable(您不能为它分配两件事)。要修复此问题,请将以下行添加到
details
函数:

    return (plr_name, plr_class)
(我还没有测试过。)

第110行:

        name, plr_class = details()
但是
details
函数不返回任何内容,因此Python尝试将默认返回值
None
分配给tuple
name,plr\u类
。它不能这样做,因为
None
不是一个iterable(您不能为它分配两件事)。要修复此问题,请将以下行添加到
details
函数:

    return (plr_name, plr_class)

(我还没有测试过这个。)

我喜欢你的游戏,但作为mofo:p

score
qno
未正确定义。在需要它们的函数中定义它们,全局定义它们或将它们作为参数传递给相关函数

details()
不返回任何内容,但您仍尝试使用其输出定义其他两个变量。将
return(plr\u名称,plr\u类)
添加到
details()

每次将用户输入转换为int而不检查其值时,如果无法转换int,程序将崩溃。这适用于以下情况:

option = int(input("Please select option: "))
这里

还有其他地方

由于您的程序输入量很大,您可以创建一个函数,将预期的数据类型和可选字符串传递给该函数,以便向用户显示。这样,您就不必编写try/except 10次,您的程序也不会因意外输入而崩溃

def文件中(plr\u名称、分数、行):
您有
行中的行:
,但未定义
行。因此,调用
FileUP()
save()
函数也会失败。而且,
FileUP
FileUP
不是一回事。Y
disp_list(plr_class, option-1)