يمكن دمج السطرين:
row = board[1] row[0] = player
في سطر واحد:
board[1][0] = player
الكودان متكافئان تقريبًا. يقيّم بايثون أولًا board[1] للحصول على القائمة الداخلية، ثم يطبق [0] = ... لتعديل عنصر داخل تلك القائمة.
الآن اجعل الحركة تفاعلية. اكتب نسختك من play_move بحيث تستدعي input() مرتين: مرة لرقم الصف ومرة لرقم العمود. المستخدم يعد من 1، بينما فهارس القوائم تبدأ من 0.
إذا أدخل المستخدم:
2 1
فهذا يعني الصف الثاني والعمود الأول، أي الموضع نفسه الذي استخدمناه في المثال السابق.
إليك كود البداية:
__copyable__ def format_board(board): first_row = ' ' for i in range(len(board)): first_row += str(i + 1) joined_rows = [first_row] for i in range(len(board)): joined_row = str(i + 1) + ''.join(board[i]) joined_rows.append(joined_row) return "
".join(joined_rows)
def play_game(): board = [ [' ', ' ', ' '], [' ', ' ', ' '], [' ', ' ', ' '], ] print(format_board(board)) print('
X to play:
') play_move(board, 'X') print(format_board(board)) print('
O to play:
') play_move(board, 'O') print(format_board(board))
def play_move(board, player): ...
play_game()
يستدعي المثال play_move مرتين، لذلك سيدخل المستخدم زوجين من الأرقام. المهم أن تعدّل دالتك board في المكان الصحيح؛ لا تحتاج إلى طباعة أو إعادة قيمة من play_move نفسها.
يمكنك افتراض أن المستخدم سيدخل أرقامًا صحيحة وصالحة. سنتعامل مع الإدخال غير الصالح لاحقًا. تذكّر أن input() تعيد نصًا، وأنك تحتاج إلى تحويله إلى عدد ثم تحويل 1..n إلى فهارس 0..n-1 قبل استخدام الفهرسة المتداخلة.