2016-03-08 154 views
0

我創建了一個類似遊戲的戰艦,除了一個細節之外,它已經完成。Python輸入語句

我有以下輸入語句: x,y = input(「輸入兩個數字:」).split() 與輸入的2個數字相對應的玩家選擇的座標。我還需要能夠處理「q」或「h」的退出或幫助選項。然而,因爲我只從一個q或h輸入了這個語句中的兩個變量,所以我得到的錯誤是語句需要2個元素來解包,這是有道理的。任何關於如何解決這個問題的指針?

import random, math 

class oceanTreasure: 

    def __init__(self): 
     self.board = self.board() 
     self.found = 0 
     self.left = 3 
     self.sonarsLeft = 20 
     self.chests= [] 
     self.chest() 
    def board(self): 
     board = [] 
     for x in range(16): # the main list is a list of 60 lists 
      board.append([]) 
      for y in range(61): # each list in the main list has 15 single-character strings. 
       board[x].append('~') 
     return board 

    def chest(self): 
     chest1 = [random.randint(0,60), random.randint(0,15)] 
     chest2 = [random.randint(0,60), random.randint(0,15)] 
     chest3 = [random.randint(0,60), random.randint(0,15)] 
     self.chests = [chest1, chest2, chest3] 
    def getChestsLeft(self): 
     return self.found 
    def getChests(self): 
     return self.chests 
    def getTreasuresLeft(self): 
     return self.left 
    def getSonarsLeft(self): 
     return self.sonarsLeft 
    def dropSonar(self,x,y): 
     ySonar = ['a','b','c','d','e','f','g'] 

     whichAxis, axis = self.checkDistance(x,y) 
     if whichAxis == True: 
      sonar = axis 
     if whichAxis == 'xaxis': 
      sonar = axis 
     elif whichAxis == 'yaxis': 
      sonar = ySonar[axis-1] 
     elif whichAxis == None: 
      sonar = axis 
     self.board[int(y)][int(x)] = sonar 
     self.sonarsLeft -=1 
     return axis 
    def checkDistance(self,x,y): 
     closest = self.chests[0] 
     distance = 100 
     for chest in self.chests: 
      temp = math.sqrt(math.pow((chest[0]-int(x)),2) + math.pow((chest[1]-int(y)),2)) 
      if temp < distance: 
       closest = chest 
       distance = temp 
     xaxis =math.fabs((closest[0] - int(x))) 
     yaxis = math.fabs((closest[1]-int(y))) 
     if yaxis == 0 and xaxis == 0: 
      self.chests.remove(closest) 
      self.found +=1 
      self.left -=1 
      return True, 'X' 
     elif xaxis <= 9 and yaxis <=5 : 

      if yaxis == 0 : 
       return 'xaxis',int(math.fabs(xaxis)) 
      if xaxis == 0 : 
       return 'yaxis',int(math.fabs(yaxis))    
      if min(xaxis//2,yaxis) ==(xaxis//2) : 
       return 'xaxis', int(math.fabs(xaxis)) 
      elif min(xaxis//2,yaxis) == (yaxis) or xaxis == 0 : 
       return 'yaxis', int(math.fabs(yaxis)) 

     else: return None,0 
    def drawBoard(self): 
     firstLine = ' ' 
     for i in range(1,7): 
      firstLine += (' '*9) + str(i) 
     print(firstLine) 
     secondLine = ' ' 
     secondLine += ('' *6) 
     print(secondLine) 
     print() 

     i = 0 

     for i in range(0,16): 
      boardRow = '' 
      for x in range(0,61): 
       boardRow += str(self.board[i][x]) 

      if i < 10: 
       print(str(i) +' ' + str(boardRow) + str(i)) 
      if i >= 10: 
       print(str(i) +' ' + str(boardRow) + str(i)) 
     print() 
     print(secondLine) 
     print(firstLine) 
     device = 'devices' 
     if self.sonarsLeft ==1: 
      device = 'device' 
     print('You have %s sonar %s availabe. You have found %s treasures and have %s left' %(self.sonarsLeft, device, self.found, self.left)) 



ocean = oceanTreasure() 
ocean.drawBoard() 
gameOver = False 
instructionsList = ['This is a treasure hunting game.' , 'You begin the game with 20 sonar devices available (each device has a range of 9 units in the x axis and 5 in the y axis).','When you place a device, if an "O" is displayed that means there are no chests in range.', 'If a number from 1-9 is displayed, the closest chest is within n units away on the X axis.', 'If a letter from a-e is displayed, the closest chest is n units away on the Y axis (a =1, b =2 and so on...).', 'The game ends when you run out of sonar devices, all the treasure is found or you enter "q" to quit.', 'Thanks for playing and happy hunting!'] 
while ocean.getTreasuresLeft() != 0 and ocean.getSonarsLeft() >0 and gameOver == False: 
    response = False 
    coordinate = False 
    while response == False: 
     inputString = input("Enter two numbers seperated by a space (X Y): ") 
     if inputString == 'q': 
      gameOver = True 
      response = True 
     elif inputString == 'h': 
      for instruction in instructionsList: 
       print(instruction) 
      response = True 

     else: 
      try: 
       x,y = inputString.split() 
       assert int(x) <=60 and int(y) <=15 
       response = True 
       coordinate = True 

      except AssertionError: 
       print('Please enter a valid move') 
    if gameOver == True: 
     break 
    #whichAxis, axis =ocean.checkDistance(x,y) 
    #print(axis) 
    if coordinate == True: 
     axis = ocean.dropSonar(x,y) 
     ocean.drawBoard() 
     if axis == 'X': 
      print('Congratulations, you have found a treasure!') 


if ocean.getTreasuresLeft() == 0: 
    print('Congratulations, you found all the treasure') 
elif ocean.getSonarsLeft() == 0: 
    print('Sorry, you ran out of sonar devices, the remaining chests were: %s ' % str(ocean.getChests())) 

回答

4

如何分離測試,以更清楚一點:

input_string = input("Enter two numbers here: ") 
if input_string == 'q': 
    do_quit() 
elif input_string == 'h': 
    do_help() 
else: 
    x,y = input_string.split() 

這樣,你可以測試你的特殊情況,並處理x和y,如果他們沒有找到。

+0

那麼簡單。我被困在想我必須分開初始輸入,遊戲結束!謝謝您的幫助! – spaceinvaders101

+0

非常歡迎!簡單的解決方案總是最好的:)。聽起來就像你在旅途中有一個很好玩的項目!如果回答您的問題,請隨時將此(或其他)答案標記爲已接受。 – srowland

+0

會做!附上游戲的副本,如果任何人感到無聊:)會喜歡聽到一些想法! – spaceinvaders101

1

可能是這樣的,例如:

a = input("text") 
b = a.split() 
if len(b) == 1: 
    if b[0] == 'q': 
    return 
    elif b[0] == 'h': 
    print 'it is help ... ' 
elif len(b) == 2: 
    # process for two inputted numbers 
0

你可以只單獨輸入:

# get the input 
ipt = input("Enter two numbers here: ") 
# check if your option is entered 
if ipt == 'q' or ipt == 'h': 
    # do something 
else: 
    x,y = ipt.split()