2012-02-13 26 views
6

से सूची सूचकांक मुझे लगता है कि मेरा प्रोग्राम पूरा हो गया है, लेकिन ... यह काम नहीं करता है। मैं एक प्रोग्राम लिखने की कोशिश कर रहा हूं जो लॉटरी गेम को अनुकरण करता है, लेकिन जब मैं टिकट पर अनुमानों की संख्या के खिलाफ उपयोगकर्ता के अनुमानों की जांच करने का प्रयास करता हूं, तो मुझे एक त्रुटि मिलती है जो मुझे बताती है कि "सूची अनुक्रमणिका सीमा से बाहर है"। मुझे लगता है कि कोड के उस हिस्से के साथ कुछ करना है जहां मैं यादृच्छिक अंक "ए," "बी", "सी", आदि को असाइन करता हूं लेकिन मुझे यकीन नहीं है।पायथन: इंडेक्स एरर: श्रेणी

import random 

def main(): 
random.seed() 

#Prompts the user to enter the number of tickets they wish to play. 
tickets = int(input("How many lottery tickets do you want?\n")) 

#Creates the dictionaries "winning_numbers" and "guess." Also creates the variable "winnings" for total amount of money won. 
winning_numbers = [] 
guess = [] 
winnings = 0 

#Generates the winning lotto numbers. 
for i in range(tickets): 
    del winning_numbers[:] 

    a = random.randint(1,30) 
    while not (a in winning_numbers): 
     winning_numbers.append(a) 

    b = random.randint(1,30) 
    while not (b in winning_numbers): 
     winning_numbers.append(b) 

    c = random.randint(1,30) 
    while not (c in winning_numbers): 
     winning_numbers.append(c) 

    d = random.randint(1,30) 
    while not (d in winning_numbers): 
     winning_numbers.append(d) 

    e = random.randint(1,30) 
    while not (e in winning_numbers): 
     winning_numbers.append(e) 

    print(winning_numbers) 
    getguess(guess, tickets) 
    nummatches = checkmatch(winning_numbers, guess) 

    print("Ticket #"+str(i+1)+": The winning combination was",winning_numbers,".You matched",nummatches,"number(s).\n") 

    if nummatches == 0 or nummatches == 1: 
     winnings = winnings + 0 
    elif nummatches == 2: 
     winnings = winnings + 10 
    elif nummatches == 3: 
     winnings = winnings + 500 
    elif nummatches == 4: 
     winnings = winnings + 20000 
    elif nummatches == 5: 
     winnings = winnings + 1000000 

print("You won a total of",winnings,"with",tickets,"tickets.\n") 

#Gets the guess from the user. 
def getguess(guess, tickets): 
del guess[:] 

for i in range(tickets): 
    bubble = input("What numbers do you want to choose for ticket #"+str(i+1)+"?\n").split(" ") 
    guess.append(bubble) 
print(bubble) 

#Checks the user's guesses with the winning numbers. 
def checkmatch(winning_numbers, guess): 
match = 0 
for i in range(5): 

    if guess[i] == winning_numbers[i]: 
     match = match+1 

return match 

main() 

और यहाँ है त्रुटि मैं: यह संपूर्णता में

यहाँ कोड है

Traceback (most recent call last): 
    File "C:\Users\Ryan\Downloads\Program # 2\Program # 2\lottery.py", line 85, in <module> 
    main() 
    File "C:\Users\Ryan\Downloads\Program # 2\Program # 2\lottery.py", line 45, in main 
    nummatches = checkmatch(winning_numbers, guess) 
File "C:\Users\Ryan\Downloads\Program # 2\Program # 2\lottery.py", line 79, in checkmatch 
    if guess[i] == winning_numbers[i]: 
IndexError: list index out of range 
+0

ट्रैस बैक पढ़ा, ज्यादातर मामलों में यह सहायक हो सकता है। – monkut

+0

win_numbers कितनी देर तक है? मुझे लगता है कि आप पाएंगे कि यह <= 5 है। आपका विजेता संख्या जनरेटर त्रुटिपूर्ण है। आपको लूप के दौरान 'ए = रैंडिंट (1,30) '_inside_ रखना होगा। अन्यथा, यह सिर्फ एक बार चलाता है। –

+1

भी, लाइन 'डेल myList [:]' फ़ंक्शन 'getguess'' का उपयोग करने का बिल्कुल कोई कारण नहीं है, 'अनुमान' को फ़ंक्शन के दायरे में परिभाषित किया गया है। 'अनुमान = [] 'के साथ अनुमान आरंभ करें। –

उत्तर

7

त्रुटि नोटों के रूप में, समस्या कतार में है:

if guess[i] == winning_numbers[i] 

त्रुटि यह है कि आपकी सूची सूचकांक सीमा से बाहर हैं - यानी, आप कुछ इंडेक्स को संदर्भित करने का प्रयास कर रहे हैं जो मौजूद नहीं हैं। पूरी तरह से अपने कोड डिबगिंग के बिना, मैं लाइन की जाँच करेगा जहां इनपुट के आधार पर अनुमान जोड़ रहे हैं:

for i in range(tickets): 
    bubble = input("What numbers do you want to choose for ticket #"+str(i+1)+"?\n").split(" ") 
    guess.append(bubble) 
print(bubble) 

कितने अनुमान आप अपने उपयोगकर्ता दे रहे हैं के आकार

# Prompts the user to enter the number of tickets they wish to play. 
tickets = int(input("How many lottery tickets do you want?\n")) 

तो अगर पर आधारित है टिकट वे चाहते हैं की संख्या कम से कम 5 यहाँ अपने कोड है, तो क्योंकि वहाँ बस guess सूची में है कि कई तत्वों नहीं हैं

for i in range(5): 

if guess[i] == winning_numbers[i]: 
    match = match+1 

return match 

एक त्रुटि फेंक देते हैं।

+0

आपको बहुत धन्यवाद।अब जब आप इसे इंगित करते हैं, तो त्रुटि लगभग शर्मनाक रूप से स्पष्ट होती है। –

+2

दरअसल, उसकी त्रुटियों को लाइन के नीचे थोड़ा सा कारण बन रहा है। उनके इनपुट कथन के आधार पर, 'बबल' तारों की एक सूची है। तब यह सूची 'अनुमान' में संलग्न हो जाती है। तो 'अनुमान' कुछ ऐसा दिखाई देगा: '[[' 12 ',' 30 ',' 12 ',' 23 '। '3'], ['4', '5', '7', '8', '16']] '। उचित सूची विधि 'अनुमान .extend()' है। साथ ही, मान तार हैं, इसलिए जब वे तुलना करते हैं, तो तुलना _never_ सच हो जाएगी। –

0

मुझे लगता है कि आप भीतर पाश आदि यादृच्छिक एक, ख, ग के रोलिंग, डाल करने के लिए मतलब है:

a = None # initialise 
while not (a in winning_numbers): 
    # keep rolling an a until you get one not in winning_numbers 
    a = random.randint(1,30) 
    winning_numbers.append(a) 

अन्यथा, a बस उत्पन्न हो जाएगा एक बार, और अगर यह है winning_numbers में पहले से ही, इसे जोड़ा नहीं जाएगा। चूंकि a की while (आपके कोड में) के बाहर है, a पहले से ही winning_numbers में बहुत खराब है, तो इसे फिर से घुमाया नहीं जाएगा, और आपके पास एक कम जीतने वाला नंबर होगा।

if guess[i] == winning_numbers[i] में आपकी त्रुटि का कारण बन सकता है। (आपका winning_numbers हमेशा लंबाई 5 नहीं है)।

+0

यह कोड केवल _if_ चलाएगा win_numbers में नहीं है। दूसरे शब्दों में, यदि दोहराना है, तो कोई संख्या संलग्न नहीं की जाएगी। याद रखें, चलने से पहले रन की स्थिति की जांच करते समय। –

0

यहां आपका कोड है। मैं तुम्हें print() और input() के आपके उपयोग के आधार पर अजगर 3 का उपयोग कर रहे संभालने हूँ:

import random 

def main(): 
    #random.seed() --> don't need random.seed() 

    #Prompts the user to enter the number of tickets they wish to play. 

    #python 3 version: 
    tickets = int(input("How many lottery tickets do you want?\n")) 

    #Creates the dictionaries "winning_numbers" and "guess." Also creates the variable "winnings" for total amount of money won. 
    winning_numbers = [] 
    winnings = 0 

    #Generates the winning lotto numbers. 
    for i in range(tickets * 5): 
     #del winning_numbers[:] what is this line for? 
     randNum = random.randint(1,30) 
     while randNum in winning_numbers:  
      randNum = random.randint(1,30) 
     winning_numbers.append(randNum) 

    print(winning_numbers) 
    guess = getguess(tickets) 
    nummatches = checkmatch(winning_numbers, guess) 

    print("Ticket #"+str(i+1)+": The winning combination was",winning_numbers,".You matched",nummatches,"number(s).\n") 

    winningRanks = [0, 0, 10, 500, 20000, 1000000] 

    winnings = sum(winningRanks[:nummatches + 1]) 

    print("You won a total of",winnings,"with",tickets,"tickets.\n") 


#Gets the guess from the user. 
def getguess(tickets): 
    guess = [] 
    for i in range(tickets): 
     bubble = [int(i) for i in input("What numbers do you want to choose for ticket #"+str(i+1)+"?\n").split()] 
     guess.extend(bubble) 
     print(bubble) 
    return guess 

#Checks the user's guesses with the winning numbers. 
def checkmatch(winning_numbers, guess): 
    match = 0 
    for i in range(5): 
     if guess[i] == winning_numbers[i]: 
      match += 1 
    return match 

main() 
संबंधित मुद्दे