मुझे अपने युद्धपोतों के कार्यक्रम पर एक टपल सीमा से बाहर मिला। मेरे भ्रमित होने का कारण यह है कि मैं टपल का उपयोग नहीं कर रहा हूँ, जब तक कि मैं गलत नहीं हूँ और मैं सही होने के लिए तैयार हूँ। टुपल्स परिवर्तनशील नहीं हैं और जिस डिक्शनरी का यह जिक्र कर रहा है उसमें प्रोग्राम शुरू करने पर इसमें आइटम जोड़े गए हैं। मैं एक नौसिखिया हूँ इसलिए अगर मैंने कोई मूर्खतापूर्ण गलती की है तो कृपया न्याय न करें!

from random import randint
#empty list to generate the board.
board = []
messages = {
  "win" : "Nooo you won!",
  "lose" : "Not my ship haha",
  "out" : "Oops, that's not even in the ocean.",
  "repeat" : "You guessed that one already"

}

ships = {
  'shiprows' : [0]
  'shipcols' : [0]
}

#generate board and append to board[] As of now it is a 10*10 grid.
for x in range(0, 10):
  board.append(["O"] * 10)

#prints the board every turn.
def print_board(board):
  for row in board:
    print(" ".join(row))

print_board(board)

#computer chooses where to put battleships' rows
def random_row1(board):
  return randint(0, len(board) - 1)

def random_col1(board):
 return randint(0, len(board) - 1)
#calling above two functions and storing their values for 5 ships.
#creating variables for 5 ships.
vars = 0
for vars in range(0, 5):
  print(vars)
  if len(ships.keys()) >= 4:
    while ships["shiprow{}".format(vars - 2)] == ships["shiprow{}".format(vars - 1)] and ships["shipcol{}".format(vars - 2)] == ships["shipcol{}".format(vars - 1)]:
      ships["shiprow{}".format(vars)] = random_row1(board)
      ships["shipcol{}".format(vars)] = random_col1(board)
    ships["shiprow{}".format(vars)] = random_row1(board)
    ships["shipcol{}".format(vars)] = random_col1(board)
  else:
    ships["shiprow{}".format(vars)] = random_row1(board)
    ships["shipcol{}".format(vars)] = random_col1(board)


#program itself
turn = 0
#enforces four turns before game over. Will possibly extend to unlimited with multiple ships.
print(ships)
for turn in range(20):
  turn = turn + 1
  print ("Turn {}".format(turn))
  print ("Ships Left: {}".format(int(len(ships.keys()) / 2))) 
  guess_row = int(input("Guess Row: "))
  guess_col = int(input("Guess Col: "))

#checking stuff.
  i = 0
  if guess_row == ships["shiprow{}".format(i = range(0, 10))] and guess_col == ships["shipcol{}".format(i)]:
    print (messages["win"])
    board[guess_col][guess_row] = u"#"
    print_board(board)

  elif board[guess_col][guess_row] == "X":
    print ("You guessed that one already.")
  elif guess_row not in range(len(board)) and guess_col not in range(len(board[0])):
    print(messages["out"])
  else:
    print(messages["lose"])
    board[guess_col][guess_row] = "X"
    print_board(board)
  if turn >= 20:
    print ("Game Over")
    board[ships["ship_col{}".format(range(0, 10))]][ships["ship_row{}".format(range(0, 10))]] = u"#"
    print_board(board)
    break

संदेहास्पद रेखा ६२ की प्रतीत होती है - यह एक स्केची लगती है लेकिन मैं वास्तव में यह नहीं जानता कि यह कैसे करना है। कृपया सलाह दें कि क्या करना है: BTW यहाँ त्रुटि है:

Traceback (most recent call last):
  File "battleship3.py", line 62, in <module>
    if guess_row == ships["shiprow{}".format(i = range(0, 10))] and guess_col == ships["shipcol{}".format(i)]:
IndexError: tuple index out of range

धन्यवाद।

1
thatubuntuguy 7 सितंबर 2018, 21:12

2 जवाब

सबसे बढ़िया उत्तर

आपको यह त्रुटि संदेश तब मिलता है जब आप स्थिति प्रारूप विनिर्देशों (जैसे {} या {1}) के साथ प्रारूप स्ट्रिंग का उपयोग करते हैं, लेकिन केवल कीवर्ड तर्क पास करते हैं।

इसी तरह, आपको एक KeyError मिलता है, जब आप केवल कीवर्ड प्रारूप स्पेक्स (जैसे {v}) के साथ एक प्रारूप स्ट्रिंग का उपयोग करते हैं, लेकिन केवल स्थितीय तर्क पास करते हैं:

>>> '{}'.format(i=1)
IndexError: tuple index out of range
>>> '{i}'.format(1)
KeyError: 'i'

फिक्स सिर्फ आपके चश्मे को आपके तर्कों से मेल खाने के लिए है। किसी भी तरह से आपको पसंद है ठीक है, उन्हें बस सुसंगत होना है:

>>> '{i}'.format(i=1)
1
>>> '{}'.format(1)
1

यह सब कहा जा रहा है, मुझे यकीन नहीं है कि इसका क्या मतलब है:

"shiprow{}".format(i = range(0, 10))

आप इसे किसी भी तरह से ठीक कर सकते हैं, लेकिन क्या यह वास्तव में एक स्ट्रिंग है जिसे आप चाहते हैं?

>>> "shiprow{i}".format(i = range(0, 10))
'shiprowrange(0, 10)'
>>> "shiprow{}".format(range(0, 10))
'shiprowrange(0, 10)'

यदि आप उत्सुक हैं क्यों आपको यह त्रुटि मिलती है, format को थोड़ा अधिक सरल करते हुए, यह इस तरह काम करता है:

def format(self, *args, **kwargs):
    result = ''
    index = 0
    bits = self.parse_format_stuff()
    for bit in bits:
        if bit is a regular string:
            result += bit
        elif bit is empty braces:
            result = args[index]
            index += 1
        elif bit is a number in braces:
            result += args[number]
        elif bit is a valid identifier string in braces:
            result += kwargs[identifier]
        else:
            raise a ValueError
    return result

इसलिए, जब यह देखता है कि {} प्रारूप स्पेक, यह args[0] की तलाश करता है। चूंकि आपने कोई स्थितिगत तर्क पारित नहीं किया है, args खाली टपल () है, इसलिए args[0] एक IndexError है।

यकीनन यह बेहतर हो सकता है अगर format ने उन त्रुटियों को संभाला और उन्हें कुछ अच्छे में बदल दिया-लेकिन कभी-कभी यह KeyError प्रोग्रामेटिक रूप से संभालने में सक्षम होने के लिए उपयोगी होता है। (ऐसा अक्सर नहीं होता है IndexError, लेकिन जाहिर तौर पर दोनों को एक ही तरह से काम करना पड़ता है।)

2
abarnert 7 सितंबर 2018, 21:26

मिल रहा:

Traceback (most recent call last):
File "shiptest.py", line 51, in <module>
ships['shiprows'][vars] += random_row1(board)
IndexError: list index out of range

Var=0 के बाद सब कुछ बदलने से लेकर:

vars = 0
for vars in range(0, 5):
  print(vars)
  ships['shiprows'][vars] = random_row1(board)
  ships['shipcols'][vars] = random_col1(board)
  print(ships)

मुझे लगता है कि मैं शब्दकोश में सूची को गलत बना रहा हूं। क्या मुझे .append() का उपयोग करना चाहिए? संपादित करें: मैंने .append() का उपयोग किया मैं बेवकूफ था। यह अब काम कर रहा है आपकी मदद के लिए धन्यवाद!

0
thatubuntuguy 8 सितंबर 2018, 00:00