Почему мой код для игры в battleship запускается снова и снова?

#python #class

#python #класс

Вопрос:

Итак, я пытаюсь создать очень простую игру в battleship для 1 игрока на python. Где компьютер случайным образом размещает свои корабли в строках и столбцах, а игрок угадывает, в какой строке и столбце находится корабль. Моя текущая проблема в том, что мой код делает это, однако он каждый раз выводит доску, а также, похоже, делает выбор за игрока.

 import random
#Make board
board = [
    [' ', ' ', ' ', ' ', ' '],
    [' ', ' ', ' ', ' ', ' '],
    [' ', ' ', ' ', ' ', ' '],
    [' ', ' ', ' ', ' ', ' '],
    [' ', ' ', ' ', ' ', ' '],
]

# List to refer to columns by letter, since that is how a typical battleship game is
#initiated
letters2Numbers = {
    'A': 0,
    'B': 1,
    'C': 2,
    'D': 3,
    'E': 4,
}


#Function to ask the user for their board position
def generateShips():
    for a in range (0,55):
        row = random.randrange(1,6)
        column = random.choice(['A','B','C','D','E'])
        rowNumber = row
        columnNumber = column

        return int(row) - 1, letters2Numbers[column]

def askUser():
    column = input("column (A to E):")
    while column not in "ABCDE":
        print("That column is wrong! It should be A, B, C, D or E")
        column = input("column (A to E):")

    row = input("row (1 to 5):")
    while row not in "12345":
        print("That row is wrong! it should be 1, 2, 3, 4 or 5")
        row = input("row (1 to 5):")
    return int(row) - 1, letters2Numbers[column]

def printBoard(board):
    # Shows the board, one row at a time, labelled
    print("  A B C D E")
    print("  - - - - - ")
    rowNumber = 1
    for row in board:
        print("%d|%s|" % (rowNumber, "|".join(row)))
        print("  - - - - - ")
        rowNumber = rowNumber   1




# Now clear the screen, and the other player starts guessing
print("n"*50)

guessesBoard = [
    [' ', ' ', ' ', ' ', ' '],
    [' ', ' ', ' ', ' ', ' '],
    [' ', ' ', ' ', ' ', ' '],
    [' ', ' ', ' ', ' ', ' '],
    [' ', ' ', ' ', ' ', ' '],
]


# Keep playing until we have 5 right guesses
guesses = 0
while guesses < 5:
    print("Guess a battleship location")
    rowNumber, columnNumber = askUser()

    if guessesBoard[rowNumber][columnNumber] != ' ':
        print("You have already guessed that place!")
        continue

    # Check that there are no repeats
    if board[rowNumber][columnNumber] == 'X':
        print("HIT!")
        guessesBoard[rowNumber][columnNumber] = 'X'
        guesses = guesses   1
    else:
        guessesBoard[rowNumber][columnNumber] = '.'
        print("MISS!")

    printBoard(guessesBoard)
print("GAME OVER!")
 

Пока это мой код. Если вы запустите его, вы увидите ошибку, о которой я говорю.

Комментарии:

1. Вы никогда не запрашивали никаких пользовательских данных. Программа просто воспроизводит его сама по себе (используя random).

Ответ №1:

Вы никогда не спрашиваете игрока о выборе; вы печатаете сообщение, предполагающее, что вы собираетесь это сделать, но затем ваш код продвигается вперед и использует строку и столбец из генерации корабля. Нигде в вашей программе вы не принимаете пользовательский ввод.

Ответ №2:

Вы хотите использовать функцию ввода (), а не случайную.ЧТО-ТО. Тогда ваш ввод не будет выбираться ПК.

Затем, чтобы преобразовать пользовательский ввод (который всегда возвращает строку) в число, вы можете использовать что-то вроде:

 a = input("perhaps a number: ")
if not a.isdigit():
    raise ValueError("I said number :(")
a = int(a)
 

Вы, вероятно, не хотите вызывать ошибку, я просто демонстрирую, на чем вы можете основываться.

Я жду дальнейшего развития этого вопроса. 🙂

Комментарии:

1. Привет! Я отредактировал его так, что теперь он запрашивает у пользователя ввод. Это, казалось, устранило большую часть проблемы, за исключением того, что теперь в оболочке он занимает огромное пространство из 20 пустых строк?

2. Я думаю, это будут те самые print("n"*50) 😉

3. Кстати, я прогнал ваш код и заметил, что вы никогда не устанавливаете корабли, поэтому игровое поле пусто.