所以我正在创建这个简单的小战舰程序。 我对玩家放置船只的方面感到有点沮丧。 我想要的是让函数 ship_place() 将一艘船作为参数,询问玩家想要放置船的数组的索引,然后从指定的索引开始将船放入海洋中。 我希望船的内容(这是一个列表)被"出口"到海洋(这也是一个列表)。
我创建了这个函数,它给了我两个错误。 首先,由于某种原因,它将整个船数组放入指定的索引中。 第二个是列表taken_spots1没有收到它应该收到的所有拍摄点。
附言我最初在函数中有 for 循环,但遇到了同样的错误,所以我尝试了 while 循环以查看是否有任何更改。 什么都没有。
ocean = ['O']*100
taken_spots1 = []
boat1 = ['<','>'],
boat2 = ['<','=','>'],
boat3 = ['<','::','>'],
boat4 = ['<','@','@','>'], #cannons
boat5 = ['<','G','U','N','>']
ship_yard = [boat1,boat2,boat3,boat4,boat5]
def ship_place(boat):
spot = ""
while spot == "":
spot = input("Place a boat: ")
spot = eval(spot)
if spot in taken_spots1:
spot = ""
print("That spot's already taken, dummy")
else:
j=0
while j < len(boat):
taken_spots1.append(spot + j)
j += 1
i = 0
while i < len(boat):
ocean[spot - 1 + i] = boat[i]
i += 1
for i in range(5):
ship_place(ship_yard[i])
print(ocean)
print(taken_spots1)
你的程序几乎是正确的! 问题是你在某些船之后有一些额外的逗号。
例如:
boat1 = ['<','>'],
删除逗号。
这有点令人惊讶,但是在Python中,当您添加逗号时,您会得到一个"元组"。 通常我们看到元组是这样写的:
t = (1, 3)
这将是一个长度为 2 的元组,其值为 1
和 3
。 但是你可以声明一个长度为 1 的元组,这是合法的:
t = (1,)
事实证明,括号不是必需的:
t = 1,
这就是你所做的。 您声明了一个长度为 1 的元组,其内容是一个列表。 然后,当你的函数收到它的参数时,boat
,它收到一个长度为 1 的元组,当它索引元组时,它得到了一个列表。
附言您可以使用"切片"做您想做的事。 对列表进行切片时,可以指定列表的某些部分;如果分配给该部分,则替换该部分。
你用这个循环把一艘船放进海里:
i = 0
while i < len(boat):
ocean[spot - 1 + i] = boat[i]
i += 1
您可以将循环替换为以下代码:
start = spot - 1
end = start + len(boat)
ocean[start:end] = boat
你甚至可以做一行,但我认为这太难阅读和理解了。
ocean[spot-1:spot-1+len(boat)] = boat
附言 如果我正在编写这个程序,我不会维护taken_spots
列表以及ocean
。 我只是在海里看看那里是否已经有一艘船。 现在,您可能会遇到taken_spots
不准确的问题;海洋总是这样,所以看着它就会消除潜在的虫子来源。
这是您可以观察海洋的一种方式,看看一艘船是否适合某个地方。
def spot_taken(i, ship):
start = i
end = i + len(ship)
for ch in ocean[start:end]:
if ch != 'O':
return True
return False
如果你刚刚开始使用 Python,你可能还没有了解any()
和all()
函数......但它们提供了一种非常方便的方法来编写spot_taken()
。 喜欢这个:
def spot_taken(i, ship):
start = i
end = i + len(ship)
return any(ch != 'O' for ch in ocean[start:end])
你甚至可以把它变成一行,但也许它太丑了:
def spot_taken(i, ship):
return any(ch != 'O' for ch in ocean[i:i+len(ship)])
如果这看起来太奇怪或棘手,请暂时忽略它。 你最终会学到它。 但是any()
和all()
是我最喜欢的 Python 功能之一,所以我只想与你分享它们!
P.P.P.S.调试时,添加对print()
的调用并确保值符合预期值通常很有用。 当我打印boat
的值时,它打印为元组:(['<', '>'],)
这就是我的想法。
调试器可让您检查变量、检查其类型等,而无需编写 print()
语句。 我使用过WingWare IDE,它有一个免费使用的版本,你可能想看看。 http://wingware.com/
好的,我们开始了,这应该可以工作:
#!/usr/bin python
ocean = ['O']*100
taken_spots1 = set()
boat1 = ['[<','>]']
boat2 = ['[<','=','>]']
boat3 = ['[<','::','>]']
boat4 = ['[<','@','@','>]'] #cannons
boat5 = ['[<','G','U','N','>]']
ship_yard = [boat1,boat2,boat3,boat4,boat5]
def foundboatpart(start, boatlen):
for t in range(start, start + boatlen):
if t in taken_spots1 or t > len(ocean) or t <= 0: return 1
return 0
def ship_place(boat):
spot = ""
while spot == "":
spot = int(input("Place a boat: "))
if foundboatpart(spot, len(boat)):
spot = ""
print("That spot's already taken, dummy")
else:
taken_spots1.update(range(spot, spot + len(boat)))
ocean[spot - 1 : spot + len(boat) - 1] = boat
for i in range(5):
ship_place(ship_yard[i])
print(ocean)
print(taken_spots1)
示例运行:
Place a boat: 1
['[<', '>]', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O']
{1, 2}
Place a boat: 2
That spot's already taken, dummy
Place a boat: 3
['[<', '>]', '[<', '=', '>]', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O']
{1, 2, 3, 4, 5}
Place a boat: 6
['[<', '>]', '[<', '=', '>]', '[<', '::', '>]', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O']
{1, 2, 3, 4, 5, 6, 7, 8}
Place a boat: 8
That spot's already taken, dummy
Place a boat: 9
['[<', '>]', '[<', '=', '>]', '[<', '::', '>]', '[<', '@', '@', '>]', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O']
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}
Place a boat: 12
That spot's already taken, dummy
Place a boat: 13
['[<', '>]', '[<', '=', '>]', '[<', '::', '>]', '[<', '@', '@', '>]', '[<', 'G', 'U', 'N', '>]', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O']
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17}