Strona główna Polish Python Coders Group
   Strona główna   Pomoc Zaloguj się Rejestracja  
Witamy, Gość. Zaloguj się lub zarejestruj.
Czy dotarł do Ciebie email aktywacyjny?

Zaloguj się podając nazwę użytkownika, hasło i długość sesji

Aktualności: Django od podstaw - darmowe webinaria po polsku
Szukaj Szukaj
Strony: [1]   Do dołu
Drukuj
Wątek: Problem z programem.  (Przeczytany 1118 razy)
« : 00:03 27/04/12 »
Feniks Offline
Hello World!

Zobacz profil
*

Reputacja: 1
Wiadomości: 11


W dalszym ciągu przebijam się przez Python  programing for absolute beginner.

Mam tam za zadanie stworzyć program, który zada graczom kilka pytań i potem zliczy punkty za prawidłowe odpowiedzi każde z pytań ma być warte inną ilość punktów.

kod programu:
Kod
# Trivia game that reads a plain text file
 
import sys
 
def open_file(file_name, mode):
   """Open a file."""
   try:
       the_file = open(file_name, mode)
   except IOError as e:
       print("Unable to open the file", file_name, "Ending program.\n", e)
       input("\n\nPress the enter key to exit.")
       sys.exit()
   else:
       return the_file
 
def next_line(the_file):
   """Return next line from the trivia file, formatted."""
   line = the_file.readline()
   line = line.replace("/", "\n")
   return line
 
def next_block(the_file):
   """Return the next block of data from the trivia file."""
   category = next_line(the_file)
 
   question = next_line(the_file)
 
   answers = []
   for i in range(4):
       answers.append(next_line(the_file))
 
   correct = next_line(the_file)
   if correct:
       correct = correct[0]
 
   explanation = next_line(the_file)
   points = int(next_line(the_file))
 
   return category, question, answers, correct, explanation, points
 
def welcome(title):
   """Welcome the player and get his/her name."""
   print("\t\tWelcome to Trivia Challenge!\n")
   print("\t\t", title, "\n")
 
def main():
   trivia_file = open_file("trivia.txt", "r")
   title = next_line(trivia_file)
   welcome(title)
   score = 0
 
   # get first block
   category, question, answers, correct, explanation, points = next_block(trivia_file)
   while category:
       # ask a question
       print(category)
       print(question)
       for i in range(4):
           print("\t", i + 1, "-", answers[i])
 
       # get answer
       answer = input("What's your answer?: ")
 
       # check answer
       if answer == correct:
           print("\nRight!", end=" ")
           score = score + points
       else:
           print("\nWrong.", end=" ")
       print(explanation)
       print("Score:", score, "\n\n")
 
       # get next block
       category, question, answers, correct, explanation, points = next_block(trivia_file)
 
   trivia_file.close()
 
   print("That was the last question!")
   print("You're final score is", score)
 
main()  
input("\n\nPress the enter key to exit.")
 
 

kod pliku z pytaniami:

Kod
An Episode You Can't Refuse
On the Run With a Mammal
Let'
s say you turn state's evidence and need to "get on the lamb." If you wait /too long, what will happen?
You'
ll end up on the sheep
You'll end up on the cow
You'
ll end up on the goat
You'll end up on the emu
1
A lamb is just a young sheep.
100
The Godfather Will Get Down With You Now
Let'
s say you have an audience with the Godfather of Soul. How would it be /smart to address him?
Mr. Richard
Mr. Domino
Mr. Brown
Mr. Checker
3
James Brown is the Godfather of Soul.
10
That's Gonna Cost Ya
If you paid the Mob protection money in rupees, what business would you most /likely be insuring?
Your tulip farm in Holland
Your curry powder factory in India
Your vodka distillery in Russian
Your army knife warehouse in Switzerland
2
The Rupee is the standard monetary unit of India.
5
Keeping It the Family
If your mother'
s father's sister's son was in "The Family," how are you /related to the mob?
By your first cousin once removed
By your first cousin twice removed
By your second cousin once removed
By your second cousin twice removed
1
Your mother's father's sister is her aunt -- and her son is your /mother's first cousin. Since you and your mother are exactly one generation /apart, her first cousin is your first cousin once removed.
100
A Maid Man
If you were to literally launder your money, but didn'
t want the green in your /bills to run, what temperature should you use?
Hot
Warm
Tepid
Cold  
4
According to my detergent bottle, cold is best for colors that might run.
5
 

Wszystko działa płynnie aż do ostaniego pytania, gdzie wyskakuje mi

Cytuj
Traceback (most recent call last):
  File "C:\Users\Maciej\Desktop\trivia_challenge.py", line 82, in <module>
    main()
  File "C:\Users\Maciej\Desktop\trivia_challenge.py", line 75, in main
    category, question, answers, correct, explanation, points = next_block(trivia_file)
  File "C:\Users\Maciej\Desktop\trivia_challenge.py", line 38, in next_block
    points = int(next_line(the_file))
ValueError: invalid literal for int() with base 10: ''

Może mi ktoś zasugerować czemu akurat ten błąd przy ostatnim pytaniu i czemu wygląda to tak jakby program dostawał pustą linijkę tekstu w miejscu gdzie powinna liczba "5". czy błąd jest w samym programie czy też może coś nie tak z plikiem z pytaniami? Dzięki za pomoc.

Zapisane
« Odpowiedz #1 : 22:50 27/04/12 »
ldk Offline
Hello World!

Zobacz profil
*

Reputacja: 4
Płeć: Mężczyzna
Wiadomości: 88


Wydaje mi się, że Twój program nie wie, kiedy ma skończyć. Kiedy kończy się dokument tekstowy, on dalej chciałby go czytać w poszukiwaniu dla Ciebie zmiennych, tyle że ich już tam nie ma więc wyrzuca błąd. Trochę zmodyfikowałem Twój kod, u mnie działa, zobacz sobie:
Kod
# Trivia game that reads a plain text file
 
import sys
 
def open_file(file_name, mode):
   """Open a file."""
   try:
       the_file = open(file_name, mode)
   except IOError as e:
       print("Unable to open the file", file_name, "Ending program.\n", e)
       input("\n\nPress the enter key to exit.")
       sys.exit()
   else:
       return the_file
 
def next_line(the_file):
   """Return next line from the trivia file, formatted."""
   line = the_file.readline()
   line = line.replace("/", "\n")
   return line
 
def next_block(the_file):
   """Return the next block of data from the trivia file."""
   category = next_line(the_file)
 
   question = next_line(the_file)
 
   answers = []
   for i in range(4):
       answers.append(next_line(the_file))
 
   correct = next_line(the_file)
   if correct:
       correct = correct[0]
 
   explanation = next_line(the_file)
   points = int(next_line(the_file))
 
   return category, question, answers, correct, explanation, points
 
def welcome(title):
   """Welcome the player and get his/her name."""
   print("\t\tWelcome to Trivia Challenge!\n")
   print("\t\t", title, "\n")
 
def main():
   trivia_file = open_file("trivia.txt", "r")
   title = next_line(trivia_file)
   welcome(title)
   score = 0
 
   # get first block
   warunek = True
   while warunek == True:
       try:
           category, question, answers, correct, explanation, points = next_block(trivia_file)
       except ValueError:
           break
       # ask a question
       print(category)
       print(question)
       for i in range(4):
           print("\t", i + 1, "-", answers[i])
 
       # get answer
       answer = input("What's your answer?: ")
 
       # check answer
       if answer == correct:
           print("\nRight!", end=" ")
           score = score + points
       else:
           print("\nWrong.", end=" ")
       print(explanation)
       print("Score:", score, "\n\n")
 
       # get next block
 
   trivia_file.close()
 
   print("That was the last question!")
   print("You're final score is", score)
 
main()  
input("\n\nPress the enter key to exit.")
 

Nie jest to najlepsze rozwiązanie, ale działa.

@Edit:
Może nie tyle nie ma zmiennych ile program sam dobiera wartość dla zmiennej którą chce utworzyć. I tak np. po ostatniej cyfrze 5 nie ma nic, ale program tworzy pustą zmienną np. zmienna == ''. W przypadku zmiennej point's nie da się stworzyć obiektu int() z pustego stringa.
Zapisane
« Odpowiedz #2 : 23:05 29/04/12 »
Feniks Offline
Hello World!

Zobacz profil
*

Reputacja: 1
Wiadomości: 11


Idk dzięki wielkie, zrobiłem wzorując się na tym co napisałeś i teraz rzeczywiście działa.
Zapisane
Strony: [1]   Do góry
Drukuj
Skocz do:  

© 2007 - 2014 Polish Python Coders Group
Powered by SMF 1.1.20 | SMF © 2006-2009, Simple Machines | Theme by PixelSlot