สร้างและเริ่มต้นตาราง 5x5 สำหรับเรือประจัญบาน

ดังนั้นฉันจึงเพิ่งเสร็จสิ้นส่วนหนึ่งของปัญหา CodeAcademy Battleship และส่งคำตอบที่ถูกต้องแล้ว แต่ยังมีปัญหาในการทำความเข้าใจว่าเหตุใดจึงถูกต้อง

แนวคิดคือการสร้างตารางขนาด 5x5 เป็นกระดาน โดยเต็มไปด้วยตัว "O" รหัสที่ถูกต้องที่ฉันใช้คือ:

board = []
board_size=5

for i in range(board_size):

    board.append(["O"] *5)

อย่างไรก็ตาม ฉันสับสนว่าทำไมสิ่งนี้จึงไม่สร้าง "O's" 25 ตัวในแถวเดียว เนื่องจากฉันไม่เคยกำหนดให้วนซ้ำในแถวแยกกัน ฉันเหนื่อย

for i in range(board_size):

    board[i].append(["O"] *5)

แต่สิ่งนี้ทำให้ฉันมีข้อผิดพลาด: IndexError: list index out of range ใครช่วยอธิบายได้ไหมว่าทำไมอันแรกถึงถูกต้องและไม่ใช่อันที่สอง


person KRS-fun    schedule 29.01.2014    source แหล่งที่มา


คำตอบ (7)


["O"]*5

สิ่งนี้จะสร้างรายการขนาด 5 ซึ่งเต็มไปด้วย "O": ["O", "O", "O", "O", "O"]

board.append(["O"] *5)

สิ่งนี้จะผนวก (เพิ่มต่อท้ายรายการ) รายการด้านบนเข้ากับบอร์ด[] การทำเช่นนี้ 5 ครั้งติดต่อกันจะสร้างรายการที่เต็มไปด้วย 5 รายการข้างต้น

[["O", "O", "O", "O", "O"],
["O", "O", "O", "O", "O"],
["O", "O", "O", "O", "O"],
["O", "O", "O", "O", "O"],
["O", "O", "O", "O", "O"]]

รหัสของคุณใช้งานไม่ได้ เนื่องจากรายการไม่ได้เตรียมใช้งานด้วยขนาดใน python แต่เพิ่งเริ่มต้นเป็นคอนเทนเนอร์ว่าง [] เพื่อให้งานของคุณสำเร็จ คุณสามารถทำสิ่งต่อไปนี้:

board = [[],[],[],[],[]]

และในวงของคุณ:

board[i] = ["O"]*5
person turbo    schedule 29.01.2014

รายการ Python เริ่มต้นว่างเปล่า:

board = [] # empty list

ไม่เหมือนกับภาษาโปรแกรมบางภาษา คุณไม่ได้ระบุหรือเริ่มต้นขอบเขตของอาร์เรย์ ดังนั้นหากคุณพยายามเข้าถึงด้วยดัชนี:

board[0]

คุณจะได้รับ IndexError; ยังไม่มีดัชนีใดๆ 0

ในเวอร์ชันแรก ในแต่ละการเดินทางผ่านลูป for คุณจะ append (เพิ่มที่ส่วนท้ายของรายการ) รายการใหม่ ที่มี "O"s ห้ารายการ หากคุณต้องการให้รายการ board มี 25 "O"s คุณควรใช้ extend แทน:

for i in range(board_size):
    board.extend(["O"] *5)
person jonrsharpe    schedule 29.01.2014

รหัสควรมีลักษณะเช่นนี้ board = [] for i in range(0, 5): board.append(["O"]*5) print(board)

person SanchelliosProg    schedule 14.05.2015

ฉันคิดว่าปัญหานั้นง่าย: เมื่อคุณเรียกใช้โค้ด อาร์เรย์ของคุณจะว่างเปล่า!

คุณสามารถออกก

board = [[], [], [], [], []]

เพื่อเริ่มต้นเป็นอาร์เรย์ห้าตำแหน่งที่ซ้อนกัน

คุณยังสามารถใช้ dict เพื่อจำลองอาเรย์ที่ซ้อนกันอย่างไม่มีกำหนด:

board=defaultdict(lambda:defaultdict(lambda:[]))
person Vincenzo Maggio    schedule 29.01.2014

board = []
board_size=5

for i in range(board_size):

    board.append(["O"] *5)

ในโค้ดนี้ board เริ่มต้นเป็นรายการว่าง ["O"] * 5 จะสร้างรายการที่เท่ากับ ["O", "O", "O", "O", "O"] จากนั้นจะถูกผนวกเข้ากับรายการ board สิ่งนี้จะเกิดขึ้น 5 ครั้งในตัวอย่างนี้ตั้งแต่ board_size == 5

for i in range(board_size):

    board[i].append(["O"] *5)

สิ่งนี้จะไม่ทำงานเว้นแต่รายการที่ดัชนี i จะเป็นรายการเนื่องจาก append() เป็นวิธีการของคลาส list หากคุณต้องการแทรกบางสิ่งที่ i คุณจะต้องใช้เมธอดรายการ insert()

person kylieCatt    schedule 29.01.2014

เนื่องจากแต่ละครั้งที่คุณรัน board.append(["O"] *5) คุณจะสร้างรายการใหม่ (เนื่องจากวงเล็บเหลี่ยมที่ใช้ในคำสั่งผนวก)

หากคุณใช้ board.append("O" *5) แทน คุณจะได้รับรายการเดียวที่มีองค์ประกอบ 5 รายการ เช่น:

['OOOOOO', 'OOOOOO', 'OOOOOO', 'OOOOOO', 'OOOOOO']

*5 คูณสตริง หากคุณเพิ่งเรียกใช้จากพรอมต์แบบโต้ตอบ 'O' * 5 คุณจะได้รับ:

'โอ้โห'

อย่างไรก็ตาม หากคุณเรียกใช้ ['O'] * 5 ข้อความภายในรายการจะคูณกัน และคุณจะได้รายการที่มีองค์ประกอบ 5 รายการ

['O', 'O', 'O', 'O', 'O']

คุณต่อท้ายห้ารายการ แต่ละรายการมี 5 องค์ประกอบ

person ChrisProsser    schedule 29.01.2014

ก้าวแรกใน Codeacademy

board = []
for i in range(5):
    board.append(["O"]*5)

print board

ขั้นตอนที่สองใน codeacademy

board = []

def print_board(board):
    for x in range(5):
        board= (["O"] * 5)
        print board
    return board

print_board(board)

ขั้นตอนที่สามใน codeacademy

board = []

def print_board(board):
    for x in range(5):
        board= (["O"] * 5)
        print " ".join(board)
    return board

print_board(board)

ขั้นตอนที่ 4

from random import randint 

board = []

for x in range(0, 5):
    board.append(["O"] * 5)

def print_board(board):
    for row in board:
        board = " ".join(row)
        return  board

def random_row(board):
    return randint(0, len(board) - 1)

def random_col(board):
    return randint(0, len(board) - 1)

print print_board(board)
print random_row(board)
print random_col(board)

ขั้นตอนที่ 5 ของการเป็นทาสใน Codeacademy

from random import randint

board = []

for x in range(0,5):
    board.append(["O"] * 5)

def print_board(board):
    for row in board:
        print " ".join(row)

def random_row(board):
    return randint(0, len(board) - 1)

def random_col(board):
    return randint(0, len(board[0]) - 1)

ship_row = random_row(board)
ship_col = random_col(board)


guess_row = int(raw_input("Guess Row: "))
guess_col = int(raw_input("Guess Col: "))

ขั้นตอนสุดท้าย .. เล่นเกม BettleShip CodeAcademy

from random import randint

board = [] สำหรับ x อยู่ในช่วง (5): board.append(["O"] * 5)

def print_board(board): สำหรับแถวในบอร์ด: print " ".join(row)

พิมพ์ "มาเล่น Battleship กันเถอะ!" print_board(บอร์ด)

def Random_row (บอร์ด): ส่งคืน randint (0, len (บอร์ด) - 1)

def Random_col (บอร์ด): ส่งคืน randint (0, len (บอร์ด [0]) - 1)

ship_row = Random_row (บอร์ด) ship_col = Random_col (บอร์ด) พิมพ์ ship_row พิมพ์ ship_col

เปลี่ยน = 0 ชนะ = 0 สำหรับเทิร์นในช่วง (4): ถ้าเทิร์น ‹= 5: Guess_row = int(raw_input("Guess Row:"))guess_col = int(raw_input("Guess Col:"))

    if guess_row == ship_row and guess_col == ship_col:
        print "Congratulations! You sunk my battleship!"
        win +=1
        if win == 2:
            break
    else:
        turns +=1
        if (guess_row < 0 or guess_row > 4) or (guess_col < 0 or guess_col > 4):
            print "Oops, that's not even in the ocean."
        elif(board[guess_row][guess_col] == "X"):
            print "You guessed that one already."
        else:
            print "You missed my battleship!"
            board[guess_row][guess_col] = "X"
            print (turn + 1)
        print_board(board)
elif turns == 3:
    print "Game Over"
else:
    print "Max Turn try is over Try Again"
person Engr Nayab Bukhari Syed    schedule 22.07.2014