Форум сайта python.su
76
Здравствуйте, форумчане! Так как я только начал изучать всемогущий Python, решил узнать у вас, правильно ли я пишу, да бы сразу искоренять несоответствующие ошибки.
Задался идеей написать игру морской бой, вот что получилось, пока с вариантом одного двупалобного корабля:
# -*- coding: utf-8 -*- """ Игра 'Морской бой'. Модель игры - компьютер-игрок с полем 10 на 10 и одним двупалобным короблем. Реализованная на Python 3. """ import random # модуль генератора случайных чисел # создание игрового поля 10 на 10 field = [] for col in range(1, 11): row = [] for x in range(1, 11): row.append('0') field.append(row) # функия отображения поля def print_field(field): num = 1 print(" 1 2 3 4 5 6 7 8 9 10") for column in field: if num < 10: print(num, end =" ") else: print(num, end =" ") print (' '.join(column)) num += 1 # функции определения координат корабля случайным образом def coordinate_string(field): return random.randint(0, (len(field) - 1)) def coordinate_column(field): return random.randint(0, (len(field[0]) - 1)) # координаты корабля (с учетом того, что отсчет начинается с 0 в списках) c_string = coordinate_string(field) c_column = coordinate_column(field) # функция построения двухпалубного корабля def coordinate_ship2(x, y): coordinate_ship_2 = [] coordinate_ship_2.append((x, y)) disposition = random.choice(["vertical", "horizontal"]) dislocation = random.choice(["plus", "minus"]) if disposition == "vertical": if dislocation == "plus": coordinate_deck_2_x = x coordinate_deck_2_y = y + 1 if coordinate_deck_2_y > 10: coordinate_deck_2_y = y - 1 coordinate_ship_2.append((coordinate_deck_2_x, coordinate_deck_2_y)) else: coordinate_ship_2.append((coordinate_deck_2_x, coordinate_deck_2_y)) else: coordinate_deck_2_x = x coordinate_deck_2_y = y - 1 if coordinate_deck_2_y < 0: coordinate_deck_2_y = y + 1 coordinate_ship_2.append((coordinate_deck_2_x, coordinate_deck_2_y)) else: coordinate_ship_2.append((coordinate_deck_2_x, coordinate_deck_2_y)) else: if dislocation == "plus": coordinate_deck_2_x = x + 1 coordinate_deck_2_y = y if coordinate_deck_2_x > 10: coordinate_deck_2_x = x - 1 coordinate_ship_2.append((coordinate_deck_2_x, coordinate_deck_2_y)) else: coordinate_ship_2.append((coordinate_deck_2_x, coordinate_deck_2_y)) else: coordinate_deck_2_x = x - 1 coordinate_deck_2_y = y if coordinate_deck_2_x < 0: coordinate_deck_2_x = x + 1 coordinate_ship_2.append((coordinate_deck_2_x, coordinate_deck_2_y)) else: coordinate_ship_2.append((coordinate_deck_2_x, coordinate_deck_2_y)) return coordinate_ship_2 #print(c_string + 1, c_column + 1) # вывод реальных координат (для отладки) #field[c_string][c_column] = 'X' # обозначение корабля на "поле" боя (для отладки) # функция обозначения выстрела игрока def shot(x, y): if field[x - 1][y - 1] == "X": print ("Ты стреляешь в одно и то же место! Будь внимателен!") else: field[x - 1][y - 1] = "X" print_field(field) # функция обозначения подбитого корабля def shot_ship(x, y, z): if field[x - 1][y - 1] == "H": print ("Будь внимателен! Ты сюда уже стрелял!") return ("подбить", z) else: field[x - 1][y - 1] = "H" print_field(field) if z < 1: z = z + 1 return ("подбить", z) else: return ("уничтожить", z) print("Игра началась!") print("Вам дается 50 попыток, чтобы найти корабль.") print("Введите предпологаемые вами координаты корабля!") ship_2 = coordinate_ship2(c_string, c_column) #создание двухпалубного корабля #for (x, y) in ship_2: # отображение реальных координат корабля (для отладки) # print((x+1), (y+1)) shot_ship_deck = 0 for value in range(1, 51): # координаты вводимые пользователем с проверкой ввода типа данных try: player_string = int(input("Пожалуйста, введите номер строки:")) player_column = int(input("Пожалуйста, введите номер столбца:")) except ValueError: print("Вы должны вводить цифры!!!") continue if value < 50: # количество попыток if ((player_string - 1), (player_column - 1)) in ship_2: shotting = shot_ship((player_string), (player_column), shot_ship_deck) shot_ship_deck += shotting[1] print("Поздравляем! Вам удалось %s корабль!" % (shotting[0])) if shotting[0] == "уничтожить": print("Вы выиграли!!!Поздравляем!!!") break elif player_column not in range(1, (len(field) + 1)) or player_string not in range(1, (len(field[0]) + 1)): print("Эй, таких координат нет!!!") print("У вас осталось - %s попыток" % (50 - value)) else: shot(player_string, player_column) print("У вас осталось - %s попыток" % (50 - value)) else: try: shot(player_string, player_column) print("Вы проиграли, исчерпав свои попытки...") s = "" for x, y in ship_2: s = s + "%s:%s " % (x, y) print("Корабль находился на координатах: %s" %(s)) except IndexError: print("Нет таких координат! Вы проиграли, исчерпав свои попытки...") break
Отредактировано Romissevd (Март 13, 2015 18:17:22)
Офлайн
568
Офлайн
7
Не надо писать “морской бой” . Напишите генератор кроссвордов.
Офлайн
186
Не надо игры делать функциями. Используйте ООП.
Офлайн
857
>>> field = [] >>> for col in range(1, 11): ... row = [] ... for x in range(1, 11): ... row.append('0') ... field.append(row) ... >>> >>> def print_field(field): ... num = 1 ... print(" 1 2 3 4 5 6 7 8 9 10") ... for column in field: ... if num < 10: ... print(num, end =" ") ... else: ... print(num, end =" ") ... print (' '.join(column)) ... num += 1 ... >>> print_field(field) 1 2 3 4 5 6 7 8 9 10 1 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 >>>
Офлайн
103
я бы вот это
field = [] for col in range(1, 11): row = [] for x in range(1, 11): row.append('0') field.append(row) # функия отображения поля def print_field(field): num = 1 print(" 1 2 3 4 5 6 7 8 9 10") for column in field: if num < 10: print(num, end =" ") else: print(num, end =" ") print (' '.join(column)) num += 1
field = [[0] * 10 for _ in range(10)] def print_field(f_field): print(" 1 2 3 4 5 6 7 8 9 10") for num, column in enumerate(f_field, 1): print("%-2d" % num, *column)
Отредактировано terabayt (Март 14, 2015 12:12:50)
Офлайн
103
ну как-то так
эт прост чтобы показать вам как можно улучшить
# -*- coding: utf-8 -*- import random field = [[0] * 10 for _ in range(10)] def print_field(): print(" 1 2 3 4 5 6 7 8 9 10") for num, column in enumerate(field, 1): print("%-2d" % num, *column) def coordinate(field): return random.randint(1, (len(field) - 2)) def coordinate_ship2(x, y): return [(x, y), random.choice([(x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1)])] def shot_ship(x, y, z): field[x][y] = "H" if not z: return "подбить" return "уничтожить" ship_2 = coordinate_ship2(coordinate(field), coordinate(field[0])) print("Игра началась!") print("Вам дается 50 попыток, чтобы найти корабль.") print("Введите предпологаемые вами координаты корабля!") shot_ship_deck = 0 i = 50 while i: try: x = int(input("Пожалуйста, введите номер строки:")) - 1 y = int(input("Пожалуйста, введите номер столбца:")) - 1 except ValueError: print("Вы должны вводить цифры!!!") continue if x >= len(field) or y >= len(field[0]) or x < 0 or y < 0: print("Эй, таких координат нет!!!") elif field[x][y] != 0: print ("Будь внимателен! Ты сюда уже стрелял!") elif (x, y) in ship_2: shotting = shot_ship((x), (y), shot_ship_deck) shot_ship_deck = 1 print_field() print("Поздравляем! Вам удалось %s корабль!" % shotting[0]) if shotting == "уничтожить": print("Вы выиграли!!! Поздравляем!!!") break else: field[x][y] = "X" print_field() i -= 1 print("У вас осталось - %d попыток" % i) else: print("Вы проиграли, исчерпав свои попытки...") print("Корабль находился на координатах: ", *ship_2)
Офлайн