2016-03-08 1 views
0

Je travaille sur ce code depuis quelques heures maintenant, et je ne sais pas très bien quel est le problème.Difficultés avec un programme indiscipliné

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

Erreurs:

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

+1

titre de la question est mignon , mais n'indique pas le problème. – KWeiss

+0

Lorsque j'exécute le programme, la fonction de menu fonctionne, mais lorsque vous entrez après le nom de l'étudiant et la classe des élèves, il se bloque. –

+0

Pouvez-vous s'il vous plaît nous donner ces erreurs? –

Répondre

2

Ligne 110:

 name, plr_class = details() 

Mais la fonction details ne retourne rien - si Python essaie d'affecter la valeur de retour par défaut None au tuple name, plr_class. Il ne peut pas faire cela, parce que None n'est pas une itérative (vous ne pouvez pas lui assigner deux choses). Pour résoudre ce problème, ajoutez la ligne suivante à votre fonction details:

return (plr_name, plr_class) 

(je n'ai pas testé.)

+1

99 bogues dans le code corrigent un bug exécutez-le à nouveau 137 bugs dans le code :) – walkingRed

1

J'aime ton jeu, mais elle est boguée comme Mofo: P

score et qno ne sont pas définis correctement. Définissez-les dans les fonctions qui en ont besoin, définissez-les globalement ou passez-les aux fonctions pertinentes en tant qu'arguments.

details() ne renvoie rien mais vous essayez toujours d'utiliser sa sortie pour définir deux autres variables. Ajouter return (plr_name, plr_class) à details()

Chaque fois que vous transtypez une entrée utilisateur en int sans vérifier sa valeur, votre programme se bloque si un int ne peut pas être converti. Ceci est valable ici:

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

ici

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

et ailleurs.

Étant donné que votre programme est lourd en entrée, vous pouvez créer une fonction à laquelle vous passez le type de données attendu et une chaîne facultative à afficher à l'utilisateur. De cette façon, vous ne devriez pas écrire try/excepté 10 fois et votre programme ne planterait pas sur une entrée inattendue.

def fileUP(plr_name, score, line):def fileUP(plr_name, score, line):def fileUP(plr_name, score, line): Ainsi, la fonction save() qui appelle FileUP() échoue également. En outre, FileUP et fileUP ne sont pas la même chose. Vous appelez la fonction avec une majuscule "f" mais la définition de la fonction l'appelle fileUP avec une minuscule "f".

Alors que nous y sommes, la gestion des fichiers dans def save (plr_name, plr_class, score): semble étrange. La façon standard d'ouvrir des fichiers pour la lecture et l'écriture simples en Python est via with open().

disp_list() devrait prendre un ou deux arguments, mais il n'a pas à l'heure actuelle si cette erreur est soulevée:

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

Ces 2 arguments de position ont été donnés ici:

disp_list(plr_class, option-1)