Ivan Bliminse
Ivan Bliminse

Reputation: 11

Difficulties with an unruly program

I have been working on this code for a couple of hours now, and I am rather unsure what the problem is.

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()

Errors:

Traceback (most recent call last):
File "C:\Users\user\Documents\CharlieStockham\cgsca\ca2.py", line 117, in Run()
File "C:\Users\user\Documents\CharlieStockham\cgsca\ca2.py", line 113, in Run save(name, plr_class, Q())
File "C:\Users\user\Documents\CharlieStockham\cgsca\ca2.py", line 74, in save lines = FileUP(plr_name, score, lines) NameError: global name 'FileUP' is not defined

Upvotes: 0

Views: 83

Answers (2)

jDo
jDo

Reputation: 4010

I like your game but it's buggy as a mofo :P

score and qno aren't properly defined. Define them in the functions that need them, define them globally or pass them to the relevant functions as arguments.

details() doesn't return anything but you still attempt to use its output to define two other variables. Add return (plr_name, plr_class) to details()

Every time you cast user input to int without checking its value, your program will crash if an int can't be cast. This applies here:

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

here

plr_ans = int(input())#Gets the user's answer

and elsewhere.

Since your program is input-heavy you could make a a function to which you pass the expected datatype and an optional string to display to the user. This way you wouldn't have to write try/except 10 times and your program wouldn't crash on unexpected input.

In def fileUP(plr_name, score, line ): you have for line in lines: but lines isn't defined. Thus, the save() function that calls FileUP() also fails. Also, FileUP and fileUP are not the same thing. You call the function with a capital "f" but the defintion of the function calls it fileUP with a lower case "f".

While we're at it, the file handling in def save (plr_name, plr_class, score):looks weird. The standard way of opening files for simple reading and writing in Python is via with open().

disp_list() should take one or two arguments but it doesn't at the moment so this error is raised:

TypeError: disp_list() takes 0 positional arguments but 2 were given

These 2 positional arguments were given here:

disp_list(plr_class, option-1)

Upvotes: 1

benshepherd
benshepherd

Reputation: 725

Line 110:

        name, plr_class = details()

But the details function does not return anything - so Python tries to assign the default return value None to the tuple name, plr_class. It can't do this, because None is not an iterable (you can't assign two things to it). To fix it, add the following line to your details function:

    return (plr_name, plr_class)

(I haven't tested this.)

Upvotes: 2

Related Questions