Уведомления

Группа в Telegram: @pythonsu

#1 Май 7, 2021 15:26:50

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Переделать Морской бой

MagentaIceberg
не понимаю всё равно) как программа ищет именно по вертикали, а не по горизонтали, например..
так она ничего не ищет, она делает только то что вы ей прописали.
У вас всего две переменные, координата_по_вертикали и координата_по_горизонтали котороым в начале игры присвиваються случайные значения(это координаты корабля). Программа спрашивает у пользователя: “введи координаты по горизонтали” , а теперь “по вертикали” и сравнивает введенные значения с хранящимися в переменных.
if guess_row == ship_row and guess_col == ship_col:
если вы напишете не так как надо , например if guess_row == ship_col and guess_col == ship_row:
то и “искать” оно будет неправильно.


MagentaIceberg
Переделайте игру так, чтобы для загадывания строки и столбца нужна была только одна функция.
наверно както так в самом простом случае:
 guess_row, guess_col  = map(int, input("Введите координаты через пробел в виде:Строка Столбец").split())
хотя в идеале введенные данные нужно валидировать, чтобы было введено ровно два числа, а не одно или не 3 или не буквы, и если валидация не прошла, еще раз просить ввести координаты.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Май 7, 2021 15:55:46)

Офлайн

#2 Май 8, 2021 16:16:32

MagentaIceberg
Зарегистрирован: 2021-03-18
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

Переделать Морской бой

PEHDOM
да, я в итогу решил задачу, но не валидировал, тк уже просто по-быстрее сдать всё хочу))
Спасибо за ответы!)

Офлайн

#3 Май 9, 2021 17:32:12

MagentaIceberg
Зарегистрирован: 2021-03-18
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

Переделать Морской бой

PEHDOM
Я вот ещё бы обратился, с финальной задачей (финальный босс), тот же код:
 from random import randint
board = []
for x in range(6):
    board.append(["O"] * 6)
def print_board(board):
    for row in board:
        print((" ").join(row)) #создаётся игровое поле
def random_row(board):
    return randint(0, len(board) - 1) #фунцкия загадывания корабля по строке
def random_col(board):
    return randint(0, len(board[0]) - 1) #фунцкия загадывания корабля по столбцу
print("Начнем игру в Морской бой!")
print_board(board)
ship_row = random_row(board) #загадываем корабль по строке
ship_col = random_col(board) #загадываем корабль по столбцу
for turn in range(10): #10 попыток
    print ("Ход: ", turn)
    guess_row = int(input("Строка 0-5:")) #ввод строки
    guess_col = int(input("Столбец 0-5:")) #ввод столбца
    if guess_row == ship_row and guess_col == ship_col: #если попал
        print("Поздравляю, ты потопил мой корабль!")
        break
    else:
        if (guess_row < 0 or guess_row > 5) or (guess_col < 0 or guess_col > 5): #если мимо игрового поля
            print("Oops, эти координаты не в нашем океане.")
        elif(board[guess_row][guess_col] == "X"): #если назвал повторно координаты
            print("Эти координаты вы уже называли.")
        else:
            print("Мимо!")
            board[guess_row][guess_col] = "X" #если не попал по кораблю ствлю Х
    if turn == 9:
        print("Игра окончена! Я уплываю в закат!") # конец игры
    #turn =+ 1
    print_board(board)
Задача: Попробуйте переделать программу так, чтобы она могла загадывать не только однопалубные корабли.

Тут я просто поплыл. Я понимаю, что надо пришпилить к рандомным координатам(12 и 14 стр) палубу, но как.. Просто не понимаю.. И как проверку сделать..
Могли бы помочь)

Офлайн

#4 Май 10, 2021 08:26:15

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Переделать Морской бой

MagentaIceberg
Я понимаю, что надо пришпилить к рандомным координатам(12 и 14 стр) палубу, но как.. Просто не понимаю.. И как проверку сделать..
1. ну для начала нам нужно определиться с палубностью, пускай их будет 2. можно конечно завести отдельные переменные для каждой палубы, но в перспективе это превратится в китайский код. Поэтому нужно хранить кординаты в спике в виде:
 ship=[[x1, y1],[x2,y2]...]
Соотвевенно длинна списка это количество палуб.
2. Теперь генерация:
нам уже нужно три оператора случайных чисел, первые два генерируют координаты первой палубы, а третий направление. допустим выпало нам ship_row и ship_col 2 и 2 мы делаем.
 ship[0]=[ship_row, ship_col]
А потом смотрим что выдал генератор,
Генератор направлений делаеться очень просто random.chiose из ((1,0),(-1,0),(0,1),(0,-1))
соответвует (вниз, вверх, вправо, влево)
если например “вверх”, то
 ship[1]=[ship_row-1, ship_col]
Ну и нужно еще проверку устроить чтобы корабль не выходил за пределы поля. Если уперлись в край то нужно крабль в противоположную сторону “удлиннять”. Это только если у нас один корабль, если их будет несколько нужно будет проверять чтобы они не не пересеклись, или не находились в соседний клеточках, там алгоритм уже посложнее выходит.
Опять же, в общем виде чтобы не плодить кучу ифов(иф вверх, иф вниз…..), это все можно записать в одном цикле.

3. проверка на попадания ровно такаяже. Только теперь мы смотрим есть ли такие координаты в списке.
 if [guess_row, guess_col] in ship:
    ship.remove([guess_row, guess_col])
4. проверка на конец игры. Корабль считаеться потоплен когда длинна ship равна нулю.





==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Май 10, 2021 08:30:02)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version