如何将一个列表的元素放在另一个列表的中间?一维战舰游戏。(Python)

2024-05-14 14:22:56 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我创建了一个简单的战舰程序。我对一个玩家放置他们的船感到有点沮丧。我想要的是函数ship\u place()将船作为参数,请求玩家想要放置船的数组的索引,然后从指定的索引开始将船放置在海洋中。我希望船上的内容(这是一个列表)被“导出”到海洋(这也是一个列表)。你知道吗

我创建了这个函数,它给了我两个错误。首先,出于某种原因,它将整个boat数组放入指定的索引中。第二个问题是,列表中的拍摄点1并没有接收到它应该接收的所有拍摄点。你知道吗

另外,我最初在函数中有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)

Tags: 函数列表for错误玩家place数组taken
2条回答

你的程序几乎是正确的!问题是在一些船后面有多余的逗号。你知道吗

例如:

boat1 = ['<','>'],

去掉逗号。你知道吗

这有点令人惊讶,但在Python中,当您添加逗号时,会得到一个“tuple”。通常我们看到元组是这样写的:

t = (1, 3)

这将是一个长度为2的元组,值为13。但您可以声明一个长度为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}

相关问题 更多 >

    热门问题