簡體   English   中英

如何將一個列表的元素放在另一個列表的中間? 一維戰艦游戲。 (蟒蛇)

[英]How do I place the elements of a list into the middle of another list? A one dimensional battleship game. (Python)

所以我正在創建這個簡單的小型戰艦程序。 我對球員放船的方式感到沮喪。 我想要的是功能ship_place()將一條船作為參數,要求玩家想放置該船的數組的索引,然后將船從指定的索引處放置在海洋中。 我希望將船上的內容(這是一個列表)“導出”到海洋(這也是一個列表)。

我創建了這個函數,它給了我兩個錯誤。 首先是由於某種原因,它會將整個船數組放置到指定的索引中。 第二個是,列表taked_spots1並未收到應有的所有已拍攝地點。

PS我本來在函數內有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的元組,其值為13 但是您可以聲明一個長度為1的元組,這是合法的:

t = (1,)

事實證明,不需要括號:

t = 1,

這就是你所做的。 您聲明了一個長度為1的元組,其內容為列表。 然后,當您的函數接收到它的參數boat ,它接收到一個長度為1的元組,並且在為該元組建立索引時得到一個列表。

PS您可以使用“切片”來做您想做的事情。 對列表進行切片時,可以指定列表的某些部分。 如果您分配給該部分,則替換該部分。

您通過以下循環將一艘船放進大海:

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

PPS如果我正在編寫此程序,那么我將不會維護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中最喜歡的功能之一,所以我只想與您分享它們!

PPPS在調試時,添加對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}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM