cb
codebamin
الفصل 11 · مشروع لعبة إكس-أو (Tic-Tac-Toe)

تسجيل الحركات بتعديل القوائم المتداخلة

تعلمنا استقبال إدخال المستخدم. الآن سنستخدم ذلك لوضع القطع فعلًا على اللوحة والبدء في اللعب.

جرّب هذا الكود أولًا:

__copyable__ __program_indented__

لاحظ أن استدعاء play_move(game_board, 'X') يعدّل game_board نفسها مباشرة. المتغير board داخل استدعاء play_move والمتغير game_board في الدالة المستدعية يشيران إلى كائن القائمة نفسه؛ لا تُنشأ نسخة جديدة.

لذلك لا تحتاج play_move في هذه الحالة إلى إعادة شيء. يكفي أن تعدّل board، وسيرى المستدعي التغيير.

لكن اللوحة ثنائية الأبعاد وممثلة بقائمة متداخلة، لذلك نحتاج إلى إسناد player إلى عنصر داخل قائمة داخلية. يمكن فعل ذلك مثل:

__copyable__ __program_indented__

يمكن دمج السطرين:

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 قبل استخدام الفهرسة المتداخلة.

رائع! اقتربت جدًا من تجميع أجزاء اللعبة كلها معًا. واصل.

solution.py
1
2
3
4
5
6
7
8
9
10
الطرفية (shell)
>>>