Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 27, 2021 12:43:20

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

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

Игра МБ выглядит так:

 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)
Задание такое:
Переделайте игру так, чтобы появилась возможность как в виселице, после окончания одной игры, сыграть еще раз
Я написал так:
 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)
while True: #просто сделал бесконечный цикл
    for turn in range(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"
        print_board(board)
        if turn == 9:
            print("Игра окончена! Я уплываю в закат!")
    ga = input('Вы хотите сыграть ещё раз? Если да - нажмите "Enter", если нет - введите "нет" ')
    if ga == 'нет':
        break
    #turn =+ 1
    #print_board(board)
Но смущает то, что при перезаходе в игру те попытки выстрелов на поле с предыдущей игры остаются сохранёнными. А по логике всё-таки надо, чтобы с нуля игра начиналась.
Как правильно сделать?

Отредактировано MagentaIceberg (Апрель 27, 2021 12:43:38)

Офлайн

#2 Апрель 27, 2021 12:51:43

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

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

Учительница спрашивает Вовочку:
- Если я дам тебе два яблока, еще два яблока, а потом еще два, сколько всего яблок у тебя будет?
- Семь.
- Вовочка, посчитай внимательнее. Если я дам тебе два яблока, еще два яблока, а потом еще два, сколько всего яблок у тебя будет?
- Семь.
- Хорошо, смотри. Если я дам тебе две груши, еще две груши, а потом еще две, сколько всего груш у тебя будет?
- Шесть.
- Ну, вот видишь! А если тоже самое, но с яблоками???
- Семь.
- Да почему семь-то?
- Потому что одно яблоко у меня уже есть.

Мораль: не забывайте обнулять переменные
найдите переменную где храяться “попытки выстрелов на поле с предыдущей игры” и обнулите ее.
спойлер: это board, вам нужно “обнулять” его каждый раз при новой игре.



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

Отредактировано PEHDOM (Апрель 27, 2021 12:52:11)

Офлайн

#3 Апрель 27, 2021 14:37:14

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

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

PEHDOM
Учительница спрашивает Вовочку:- Если я дам тебе два яблока, еще два яблока, а потом еще два, сколько всего яблок у тебя будет?- Семь.- Вовочка, посчитай внимательнее. Если я дам тебе два яблока, еще два яблока, а потом еще два, сколько всего яблок у тебя будет?- Семь.- Хорошо, смотри. Если я дам тебе две груши, еще две груши, а потом еще две, сколько всего груш у тебя будет?- Шесть.- Ну, вот видишь! А если тоже самое, но с яблоками???- Семь.- Да почему семь-то?- Потому что одно яблоко у меня уже есть.Мораль: не забывайте обнулять переменныенайдите переменную где храяться “попытки выстрелов на поле с предыдущей игры” и обнулите ее.спойлер: это board, вам нужно “обнулять” его каждый раз при новой игре.
да, верно) Спасибо!)

Офлайн

#4 Апрель 27, 2021 15:08:11

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

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

PEHDOM
а вот у меня, есс честно конкретный затуп на реализацию загадывания строк и полей в этом коде. Написал в комментах:

 def random_row(board):
    return randint(0, len(board) - 1) #здесь по-идее длина общего списка 6
def random_col(board):
    return randint(0, len(board[0]) - 1) #здесь длина первого списка в списке тоже 6
'''то есть в этих функциях мы передаём тупо 2 числа (например 1 и 1). Не понятно, как
они по итогу становятся координатой строки и столбца,если это просто 2 цифры'''
print("Начнем игру в Морской бой!")
print_board(board)
ship_row = random_row(board) #цифра один
ship_col = random_col(board) #и ещё цифра один
for turn in range(10):
    print ("Ход: ", turn)
    guess_row = int(input("Строка 0-5:")) #опять же просто вводим 2 цифры
    guess_col = int(input("Столбец 0-5:")) #как они становятся координатами поля и строки - непонятно?..
Могли бы объяснить как реализуются координаты по итогу?

Отредактировано MagentaIceberg (Апрель 27, 2021 15:08:35)

Офлайн

#5 Апрель 27, 2021 15:49:15

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

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

MagentaIceberg

 board = []
for x in range(6):
    board.append(["O"] * 6)

то есть размер board у вас константный, зачем вам в таком случае пляски с len(board)?



Офлайн

#6 Апрель 27, 2021 16:30:56

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

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

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

 board[guess_row][guess_col] == "X"



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

Отредактировано PEHDOM (Апрель 27, 2021 16:31:04)

Офлайн

#7 Апрель 28, 2021 16:48:57

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

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

PEHDOM
MagentaIceberg ну координаты это и есть два числа, одно положение “корабля” по горизонтали, другое - по вертикали. они хранятся в соответвующих переменных ship_row и ship_colпользователь вводи свои координаты(две цифры) и потом проверяется if guess_row == ship_row and guess_col == ship_col:тоесть если координаты(цифры) введенные пользователем совпали с координатами выданими генератором случайных чисел, значит попал, а если не равно тогда мы в соответвующую позицию помещаем “Х”
да, эти моменты я понимаю. Я не понимаю, как программа отбирает то, чо нужно искать по горизонтали, а, что по вертикали. Мы имеем просто два рандомных числа и всё. Мы же не говорим программе ищи по вертикали/горизонтали. вот это не понятно)

Офлайн

#8 Апрель 28, 2021 16:49:19

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

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

FishHook
MagentaIceberg
код придуман курсом. Тоже не вижу в этом смысла)

Отредактировано MagentaIceberg (Апрель 28, 2021 16:49:32)

Офлайн

#9 Апрель 28, 2021 17:37:09

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

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

MagentaIceberg
Мы же не говорим программе ищи по вертикали/горизонтали. вот это не понятно)
как не говорим? мы же говорим вот эта переменная это координаты по горизонтали, а эта - по вертикали, а потом спрашиваем у пользвателя , а введи ка нам координаты по горизонтали. а теперь по вертикали.А потом их сравниваем.



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

Офлайн

#10 Май 6, 2021 12:16:39

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

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

PEHDOM
не понимаю всё равно) как программа ищет именно по вертикали, а не по горизонтали, например..

У меня с этм кодом ещё задачи есть. И затуп в частности с:

Переделайте игру так, чтобы для загадывания строки и столбца нужна была только одна функция.


Был бы признателен помощи)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version