اذهب إلى المحتوى
  • 0

سؤال

Baraa Mohsen Elalfy

السؤال

لقد كتبت هذه اللعبة لعبة X O

 

import os

def clear():

    os.system("cls "if os.name == "nt" else "clear")

class Player:

    def __init__(self):

        self.name = ""

        self.symbol=""

   

    def choose_name(self):

        while True :

            name = input("enter your name (letters only)")

            if name.isalpha()==True:

                self.name=name

                break

            else:

                print("invalid name . please use letters only")

    def choose_symbol(self):

        h=["X","O"]

        while True:

            symbol=input(f"{self.name},choose your symbol ({"/".join(h)})")

            if symbol.isalpha() and len (symbol)==1:

                if symbol in h:

                    self.symbol=symbol

                    h.remove(symbol)

                    break

                else:

                    print(f"please enter{h}")

                    continue

            else:

                print("please enter one leater only")

                continue

           

class menu:

    def display_main_menu(self):

        print("welcome to my X-O game!")

        print("1.Start game")

        print("2.Quit Game")

        while True:

            choice=input("Enter your choice (1 or 2): ")

            if choice==1 or 2:

                break

            else:

                print("wrong!!  please inter 1 to start game or 2 to Quit game")

                continue

        return choice

    def display_endgame_menu(self):

        menu_text="""

        Game over!

        1. Restart Game

        2.Quit Game

        Enter your choice (1 or 2):"""

        while True:

            choice=input(menu_text)

            if choice==1 or 2:

                break

            else:

                print("wrong!!  please inter 1 to restart game or 2 to Quit game")

        return choice                  

       

class Board:

    def __init__(self) :

        self.board=[str(i)for i in range(1,10)]



    def display_board(self):

        for i in range(0,9,3):

            print("|".join(self.board[i:i+3]))

            if i <6:

                print("-"*5)

    def update_board(self, choice, symbol):

        if self.is_valid_move(choice):

            self.board[choice-1]=symbol

            return True

        return False    



    def is_valid_move(self,choice):

        return self.board[choice-1].isdigit()



    def reset_baord(self):

        self.board=[str(i)for i in range(1,10)]

   

class Game:

    def __init__(self):

        self.players= [Player(),Player()]

        self.board = Board()

        self.menu = menu()

        self.current_player_index = 0

    def start_game(self):

        choise = self.menu.display_main_menu()

        if choise=="1":

            self.setup_players()

            self.play_game()

        else:

            self.quit_game()

    def setup_players(self):

        for number ,player in enumerate( self.players,start=1):

            print(f"Player{number},enter your details:")

            player.choose_name()

            player.choose_symbol()

            print("-"*20)

            clear()



    def play_game(self):

        while True:

            self.play_turn()

            if self.check_win() or self.check_drow():

                self.who_win()

                choice = self.menu.display_endgame_menu()

                if choice =="1":

                    self.restart_game()

                else:

                    self.quit_game()

                    break

           

    def restart_game(self):

        self.board.reset_baord()

        self.current_player_index = 0

        self.play_game()



    def check_win(self):

        win_combinstions=[

            [0,1,2],[3,4,5],[6,7,8],

            [0,3,6],[1,4,7],[2,5,8],

            [0,4,8],[2,4,6]

        ]

        for combo in win_combinstions:

            if (self.board.board[combo[0]] == self.board.board[combo[1]]==self.board.board[combo[2]]):

               

                return True

        return False

       

    def check_drow(self):

       return all(not cell.isdigit() for cell in self.board.board)

   

    def play_turn(self):

        player = self.players[self.current_player_index]

        self.board.display_board()

        print(f"{player.name}'s turn ({player.symbol})")

        while True:

            try:

                cell_choice = int(input("choose a cell (1-9): "))

                if 1 <= cell_choice <= 9 and self.board.update_board(cell_choice, player.symbol):

                    # Valid move, switch turns and clear screen

                    self.switch_player()

                    clear()  # Call clear() after switching player

                    break

                else:

                    print("invalid move , try again.")

            except:

                print("please enter a number between 1 and 9.")

    def who_win(self):

        H=self.players[self.current_player_index]

        if self.check_win:

            print(f"{H.name} is win")

       

    def switch_player(self):

        self.current_player_index= 1 - self.current_player_index

        clear()



    def quit_game(self):

        print("thank you for playing!")

       



game = Game()

game.start_game()

 

هذا هو الكود

و الخطا في هذا الجزء من الكود

def choose_symbol(self):

        h=["X","O"]

        while True:

            symbol=input(f"{self.name},choose your symbol ({"/".join(h)})")

            if symbol.isalpha() and len (symbol)==1:

                if symbol in h:

                    self.symbol=symbol

                    h.remove(symbol)

                    break

                else:

                    print(f"please enter{h}")

                    continue

            else:

                print("please enter one leater only")

                continue

الدالة remov لا تعمل

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

الكود فيه أخطاء أخرى غير التي ذكرتها، فمثلًا تعليمة الطباعة التي تخبر بها الشخص أن يختار أحد الرموز، فقد قمت بوضع علامتي تنصيص داخل سلسلة نصية فيها علامتي تنصيص "" ، يجب أن تستعمل علامات تنصيص مغايرة كما يلي:

symbol=input(f"{self.name},choose your symbol ({'/'.join(h)})")

بعد القيام بذلك تبدأ اللعبة بالعمل بشكل صحيح نسبيًا، و لكن هناك خطأ منطقي آخر لديك و هو أنه يمكن للاعبين اختيار نفس الرمز، عليك جعل اللاعب الأول فقط يختار الرمز و يكون الرمز الخاص باللاعب الثاني هو الرمز الآخر.

يبدو أنك ظننت أن الدالة remove لا تعمل بسبب أن اللاعب الثاني يظهر له الخيارين و السبب ليس مشكلة في الدالة remove، فأنت تقوم بإنشاء المصفوفة الخاصة بالخيارات في بداية التابع و بالتالي كل لاعب سيكون لديه الخيارين. يمكنك جعل المصفوفة معطى يمرر للدالة الخاصة بالاختيار، بحيث عندما يقوم اللاعب الأول باختيار أحد الخيارات يقوم بإزالتها من المصفوفة فتكون المصفوفة الممررة للاعب الثاني تحوي خيار واحد فقط. و لكن الطريقة الأولى أفضل فهي منطقية أكثر، فلا فكرة من جعل اللاعب الثاني يختار و هو ليس لديه إلا خيار واحد.

تحياتي.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

بسبب كيفية استخدامك لمتغير choice داخل دالتي display_main_menu و display_endgame_menu.

أنت تقارن choice (وهو مُدخل نصي) مباشرةً بالأعداد الصحيحة (1 أو 2)، وفي بايثون، لن تنجح تلك المقارنة كما تتوقع، تستطيع تحويل الأرقام إلى نص من خلال دالة str.

الصحيح هو تعديل  المقارنة من choice == 1 إلى choice == '1' ومن choice == 2 إلى choice == '2' وذلك يضمن أنك تقارن مُدخل النص مع القيم النصية '1' و '2'.

أيضًا دالتي choice يجب أن يقوموا بإرجاع نص ('1' أو '2').

بجانب أنت تستخدم h.remove(symbol) لإزالة الرمز الذي تم اختياره من القائمة h، لكن input() تُرجع دائمًا نصًا، بينما تحتوي h على أحرف كبيرة، لذا حوّل مُدخل المستخدم إلى حرف كبير باستخدام symbol.upper() قبل التحقق من وجوده في h وقبل إزالته.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 10 دقائق مضت قال Mustafa Suleiman:

بسبب كيفية استخدامك لمتغير choice داخل دالتي display_main_menu و display_endgame_menu.

أنت تقارن choice (وهو مُدخل نصي) مباشرةً بالأعداد الصحيحة (1 أو 2)، وفي بايثون، لن تنجح تلك المقارنة كما تتوقع، تستطيع تحويل الأرقام إلى نص من خلال دالة str.

الصحيح هو تعديل  المقارنة من choice == 1 إلى choice == '1' ومن choice == 2 إلى choice == '2' وذلك يضمن أنك تقارن مُدخل النص مع القيم النصية '1' و '2'.

أيضًا دالتي choice يجب أن يقوموا بإرجاع نص ('1' أو '2').

بجانب أنت تستخدم h.remove(symbol) لإزالة الرمز الذي تم اختياره من القائمة h، لكن input() تُرجع دائمًا نصًا، بينما تحتوي h على أحرف كبيرة، لذا حوّل مُدخل المستخدم إلى حرف كبير باستخدام symbol.upper() قبل التحقق من وجوده في h وقبل إزالته.

   

def choose_symbol(self):

        h=["X","O"]

        while True:

            symbol=input(f"{self.name},choose your symbol ({'/'.join(h)})")

            if symbol.isalpha() and len (symbol)==1:

                symbol.upper()

                if symbol in h:

                   

                    self.symbol=symbol

                    h.remove(symbol)

                    break

                else:

                    print(f"please enter{h}")

                    continue

            else:

                print("please enter one leater only")

                continue

ما زال هذا الجزء لا يعمل بشكل صحيح

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 1 دقيقة مضت قال Baraa Mohsen Elalfy:

   def choose_symbol(self):

        h=["X","O"]

        while True:

            symbol=input(f"{self.name},choose your symbol ({'/'.join(h)})")

            if symbol.isalpha() and len (symbol)==1:

                symbol.upper()

                if symbol in h:

                   

                    self.symbol=symbol

                    h.remove(symbol)

                    break

                else:

                    print(f"please enter{h}")

                    continue

            else:

                print("please enter one leater only")

                continue

ما زال هذا الجزء لا يعمل بشكل صحيح

لقد أخبرتك بالحل الصحيح في تعليقي.

تحياتي.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 2 دقائق مضت قال Baraa Mohsen Elalfy:

   

def choose_symbol(self):

        h=["X","O"]

        while True:

            symbol=input(f"{self.name},choose your symbol ({'/'.join(h)})")

            if symbol.isalpha() and len (symbol)==1:

                symbol.upper()

                if symbol in h:

                   

                    self.symbol=symbol

                    h.remove(symbol)

                    break

                else:

                    print(f"please enter{h}")

                    continue

            else:

                print("please enter one leater only")

                continue

ما زال هذا الجزء لا يعمل بشكل صحيح

هنا symbol.upper(), لا تقوم بتحديث قيمة المتغير symbol بعد تحويله إلى أحرف كبيرة.

    def choose_symbol(self):
        h = ["X", "O"]
        while True:
            symbol = input(f"{self.name}, choose your symbol ({'/'.join(h)}): ")
            if symbol.isalpha() and len(symbol) == 1:
                symbol = symbol.upper()  # تحديث قيمة symbol
                if symbol in h:
                    self.symbol = symbol
                    h.remove(symbol)
                    break
                else:
                    print(f"Please enter {h}")
                    continue
            else:
                print("Please enter one letter only.")
                continue

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 48 دقائق مضت قال Kais Hasan:

الكود فيه أخطاء أخرى غير التي ذكرتها، فمثلًا تعليمة الطباعة التي تخبر بها الشخص أن يختار أحد الرموز، فقد قمت بوضع علامتي تنصيص داخل سلسلة نصية فيها علامتي تنصيص "" ، يجب أن تستعمل علامات تنصيص مغايرة كما يلي:

symbol=input(f"{self.name},choose your symbol ({'/'.join(h)})")

بعد القيام بذلك تبدأ اللعبة بالعمل بشكل صحيح نسبيًا، و لكن هناك خطأ منطقي آخر لديك و هو أنه يمكن للاعبين اختيار نفس الرمز، عليك جعل اللاعب الأول فقط يختار الرمز و يكون الرمز الخاص باللاعب الثاني هو الرمز الآخر.

يبدو أنك ظننت أن الدالة remove لا تعمل بسبب أن اللاعب الثاني يظهر له الخيارين و السبب ليس مشكلة في الدالة remove، فأنت تقوم بإنشاء المصفوفة الخاصة بالخيارات في بداية التابع و بالتالي كل لاعب سيكون لديه الخيارين. يمكنك جعل المصفوفة معطى يمرر للدالة الخاصة بالاختيار، بحيث عندما يقوم اللاعب الأول باختيار أحد الخيارات يقوم بإزالتها من المصفوفة فتكون المصفوفة الممررة للاعب الثاني تحوي خيار واحد فقط. و لكن الطريقة الأولى أفضل فهي منطقية أكثر، فلا فكرة من جعل اللاعب الثاني يختار و هو ليس لديه إلا خيار واحد.

تحياتي.

طب اعطيني فكرة او اعد كتابة الشيفرة حيث اني حاولت ان افكر في ان اجعل الاعب الاول هو الذي يختارX او O و الثاني يتم اختيار العنصر الثاني  تلقائيا لكن لم اعرف كيف اكتب هذا السطر من الاوامر ارجو ان تساعدني

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 2 دقائق مضت قال Baraa Mohsen Elalfy:

طب اعطيني فكرة او اعد كتابة الشيفرة حيث اني حاولت ان افكر في ان اجعل الاعب الاول هو الذي يختارX او O و الثاني يتم اختيار العنصر الثاني  تلقائيا لكن لم اعرف كيف اكتب هذا السطر من الاوامر ارجو ان تساعدني

 

سأخبرك بالفكرة فمن الجيد أن تحاول هذا يساعدك على التحسن بشكل أسرع.

في الكود التالي:

image.png.6e2aa6bb29858d2d3c16e8c9cb689d78.png

أنت تقوم بالمرور على اللاعبين و تجعلهم يختارون الرمز. يمكنك وضع شرط قبل كود اختيار الرمز، في حال كان اللاعب الأول تجعله يختار الرمز. أما في حال كان اللاعب التاني، فيمكنك تحديد الرمز عن طريق جلب رمز اللاعب الأول و اختيار الرمز المعاكس. يمكنك اختيار الرمز المعاكس بسهولة عن طريق تعريف المصفوفة الخاصة بالرموز  و إزالة رمز اللاعب الأول منها. هكذا يمكنك بسهولة إعطاء هذا الرمز للاعب الثاني.

تحياتي.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...