Найти - Пользователи
Полная версия: Переделать Морской бой
Начало » Python для новичков » Переделать Морской бой
1 2
MagentaIceberg
Игра МБ выглядит так:
 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)
Но смущает то, что при перезаходе в игру те попытки выстрелов на поле с предыдущей игры остаются сохранёнными. А по логике всё-таки надо, чтобы с нуля игра начиналась.
Как правильно сделать?
PEHDOM
Учительница спрашивает Вовочку:
- Если я дам тебе два яблока, еще два яблока, а потом еще два, сколько всего яблок у тебя будет?
- Семь.
- Вовочка, посчитай внимательнее. Если я дам тебе два яблока, еще два яблока, а потом еще два, сколько всего яблок у тебя будет?
- Семь.
- Хорошо, смотри. Если я дам тебе две груши, еще две груши, а потом еще две, сколько всего груш у тебя будет?
- Шесть.
- Ну, вот видишь! А если тоже самое, но с яблоками???
- Семь.
- Да почему семь-то?
- Потому что одно яблоко у меня уже есть.

Мораль: не забывайте обнулять переменные
найдите переменную где храяться “попытки выстрелов на поле с предыдущей игры” и обнулите ее.
спойлер: это board, вам нужно “обнулять” его каждый раз при новой игре.
MagentaIceberg
PEHDOM
Учительница спрашивает Вовочку:- Если я дам тебе два яблока, еще два яблока, а потом еще два, сколько всего яблок у тебя будет?- Семь.- Вовочка, посчитай внимательнее. Если я дам тебе два яблока, еще два яблока, а потом еще два, сколько всего яблок у тебя будет?- Семь.- Хорошо, смотри. Если я дам тебе две груши, еще две груши, а потом еще две, сколько всего груш у тебя будет?- Шесть.- Ну, вот видишь! А если тоже самое, но с яблоками???- Семь.- Да почему семь-то?- Потому что одно яблоко у меня уже есть.Мораль: не забывайте обнулять переменныенайдите переменную где храяться “попытки выстрелов на поле с предыдущей игры” и обнулите ее.спойлер: это board, вам нужно “обнулять” его каждый раз при новой игре.
да, верно) Спасибо!)
MagentaIceberg
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:")) #как они становятся координатами поля и строки - непонятно?..
Могли бы объяснить как реализуются координаты по итогу?
FishHook
MagentaIceberg
 board = []
for x in range(6):
    board.append(["O"] * 6)

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

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

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


Был бы признателен помощи)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB