2016-12-23 2 views
0

У меня есть школьное задание, в котором цель состоит в том, чтобы имитировать движение рыцаря на шахматной доске. Первая часть, где рыцарь перемещается случайным образом, хороша, но вторая часть, где пользователь выбирает движение, дает мне головную боль. Поскольку у нас есть перерыв в праздники, я не могу получить помощь в школе.Как дать пользователю возможность переместить Рыцаря в шахматную игру?

from random import choice 
#From the module random imports the random choice option 

class Point: #Class for a point on the board 

    def __init__(self, xCoord, yCoord):#Coordinates of a position on the board 
     self.xCoord = xCoord #x-coordinate, i.e. row 
     self.yCoord = yCoord #y-coordinate, i.e. column 

    def getCoordinates(self): 
     return (self.xCoord, self.yCoord) #Returns coordinates for point on board 

    def getOffsetCoordinates(self, i = 65): 
     return (chr(self.xCoord + i), self.yCoord + 1) 

    def __str__(self): 
     return str(self.getCoordinates()) #Returns the coordinates in a string 
     return str(self.getLegalPoints()) 

class Board: #Class for the board 

    def __init__(self): #Creates the board using matrices 
     self.rows = [] #A list which will be used as a base for the rows 
     for x in range(8): #Adds 8 columns in which every 
      column = [] 
      for y in range(8): 
       column.append(0) 
      self.rows.append(column) 

    def getBoard(self): 
     return self.rows #Returns rows, aka the board 

    def setPointTaken(self, point, stepnumber): 
     x,y = point.getCoordinates() 
     self.rows[x][y] = stepnumber 


    def __str__(self): 
     boardString = "" 
     boardString += "  1 2 3 4 5 6 7 8\n" 
     for i in range(len(self.rows)): 
      currentRow = self.rows[i] 
      boardString += " |" + chr(65 + i) + "| " 
      for j in range(len(currentRow)): 
       elementString = str(currentRow[j]) 
       elementStringAdjusted = elementString.ljust(2) 
       boardString += elementStringAdjusted + " " 
      boardString += "\n"   
     return boardString 

def getLegalPoints(currentPosition, board): 

    possiblePoints = [] 
    legalPoints = [] 
    stringlegalPoints = str(legalPoints) 
    originX, originY = currentPosition.getCoordinates() 
    possiblePoints.append(Point(originX + 1, originY + 2)) 
    possiblePoints.append(Point(originX + 1, originY - 2)) 
    possiblePoints.append(Point(originX - 1, originY - 2)) 
    possiblePoints.append(Point(originX - 1, originY + 2)) 
    possiblePoints.append(Point(originX + 2, originY + 1)) 
    possiblePoints.append(Point(originX + 2, originY - 1)) 
    possiblePoints.append(Point(originX - 2, originY - 1)) 
    possiblePoints.append(Point(originX - 2, originY + 1)) 

    for point in possiblePoints: 
     x, y = point.getCoordinates() 
     if 0 <= x <= 7 and 0 <= y <= 7 and not board.rows[x][y]: 
      legalPoints.append(point) 

    return legalPoints 
    return strlegalPoints 


def main(): 
    playType = None 
    while playType != 1 or playType != 2: 
     playType = int(input("\n""This program shows the path of a knight on a chessboard." "\n" + "[1] - Random path" "\n" + "[2] - Make your own path" + "\n" + "Choose option 1 for a random path or option 2 to create your own!" "\n")) 
     if playType == 1: 
      board = Board() 
      startLetter = input("Choose a row (A-H): ").upper() 
      startNumber = input("Choose a number (1-8): ") 
      xCoord = ord(startLetter)-65 
      yCoord = (int(startNumber) - 1) 
      startPoint = Point(xCoord, yCoord) 
      stepnumber = 1 
      board.setPointTaken(startPoint, stepnumber) 
      legalPoints = getLegalPoints(startPoint, board) 
      while legalPoints != None: 
       stepnumber += 1 
       nextPosition = choice(legalPoints) 
       board.setPointTaken(nextPosition, stepnumber) 
       legalPoints = getLegalPoints(nextPosition, board) 
       if len(legalPoints) <= 0: 
        break 
      print(board) 
      print("Last visited square: ",nextPosition.getOffsetCoordinates(),"\n" "Number of steps: ",stepnumber,"\n") 

      break 
     elif playType == 2: 
      board = Board() 
      startLetter = input("Choose a row (A-H): ").upper() 
      startNumber = input("Choose a number (1-8): ") 
      xCoord = ord(startLetter)-65 
      yCoord = (int(startNumber) - 1) 
      startPoint = Point(xCoord, yCoord) 
      stepnumber = 1 
      board.setPointTaken(startPoint, stepnumber) 
      legalPoints = getLegalPoints(startPoint, board) 
      while legalPoints != None: 
       print(str(legalPoints)) 
       stepnumber += 1 
       nextPosition = input("Choose your next square among those presented: ") 
       board.setPointTaken(nextPosition, stepnumber) 
       legalPoints = getLegalPoints(nextPosition, board) 
       print(board) 
       print(nextPosition.getOffsetcoordinates(), "\n" "Number of steps: ",stepnumber,"\n") 
       if len(legalPoints) <= 0: 
        break 
      break 


main() 

Вот что у меня есть. Я попытался повторно использовать движение для случайного пути для создания персонализированного пути, но я не могу понять, как распечатать разрешенные движения без него появляется так:

[<__main__.Point object at 0x03915030>, <__main__.Point object at 0x03915090>, <__main__.Point object at 0x039150B0>, <__main__.Point object at 0x039150D0>, <__main__.Point object at 0x039150F0>, <__main__.Point object at 0x03915110>, <__main__.Point object at 0x03915130>, <__main__.Point object at 0x03915150>] 
Choose your next square among those presented: 

Из того, что я понял, что я должен иметь функцию legalpoints в классе, чтобы получить ее как строку. Любые идеи по устранению этой проблемы? Я полный новичок, и если я нарушаю любые правила, удалите этот пост.

ответ

0

Один из способов распечатать список объектов Point - это изменить способ Point.__str__ на __repr__. Таким образом, будут напечатаны [(1, 4), (1, 0), (2, 3), (2, 1)] вместо чего-то вроде [<__main__.Point object at 0x03915030>, ...]. Быть осторожен! Это представление выглядит как кортеж из двух целых чисел. Я лично изменил бы это на что-то другое. (Если вы не хотите, чтобы изменить __str__ к __repr__, вы могли бы использовать цикл как for i in legalPoints: print(i))

Метод board.setPointTaken ожидает точечного объекта в качестве первого аргумента, но вы передаете строку к нему, так как input возвращает строка.

Предполагая, что пользователь будет вводить новый квадрат в формате, как (1, 4), вы можете это исправить, заменив строку nextPosition = input("Choose your next square among those presented: ") со следующими двумя строками:

nextPosition_str = input("Choose your next square among those presented: ") 
nextPosition = Point(*(int(k) for k in nextPosition_str[1:-1].split(','))) 

Вы должны будете редактировать, что в случае вы ожидаете, что пользователь войдет в квадрат в формате B6 или около того.

У вас также есть овальная черта в строке print(nextPosition.getOffsetcoordinates(), "\n" "Number of steps: ",stepnumber,"\n"). Название метода имеет капитал C, поэтому оно должно быть getOffsetCoordinates().

Смежные вопросы