Уведомления

Группа в Telegram: @pythonsu

#1 Март 13, 2015 18:09:27

Romissevd
От: Счастье
Зарегистрирован: 2015-03-01
Сообщения: 533
Репутация: +  76  -
Профиль   Отправить e-mail  

А не "говнокод" ли я пишу???

Здравствуйте, форумчане! Так как я только начал изучать всемогущий 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)

Офлайн

#2 Март 13, 2015 18:14:17

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

Офлайн

#3 Март 13, 2015 19:10:20

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

А не "говнокод" ли я пишу???

Не надо писать “морской бой” . Напишите генератор кроссвордов.



Офлайн

#4 Март 14, 2015 00:00:07

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2843
Репутация: +  186  -
Профиль   Отправить e-mail  

А не "говнокод" ли я пишу???

Не надо игры делать функциями. Используйте ООП.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#5 Март 14, 2015 00:11:35

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

А не "говнокод" ли я пишу???

>>> 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
>>>

По вертикали должны идти буквы.



Офлайн

#6 Март 14, 2015 12:10:30

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

А не "говнокод" ли я пишу???

я бы вот это

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)
дальше не смотрел, как-то там оч много и запутано



————————————————
-*- Simple is better than complex -*-

Отредактировано terabayt (Март 14, 2015 12:12:50)

Офлайн

#7 Март 14, 2015 13:38:29

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

А не "говнокод" ли я пишу???

ну как-то так
эт прост чтобы показать вам как можно улучшить

# -*- 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)



————————————————
-*- Simple is better than complex -*-

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version