Leçon 3

تطوير لعبة تيك تاكتوس على Tezos

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

لنبدأ باستكشاف عقدنا الخاص بلعبة TicTactoe:

هيكل العقد

الثعبان
# TicTactoe - مثال لأغراض توضيحية فقط.

الاستيراد بذكاء كـ sp


@sp. وحدة
تعريف رئيسي ():
 فئة TicTactoe (عقد SP):
 ديف __init__(الذات):
 نقل البيانات الذاتية.nb = 0
 الفائز بالبيانات الذاتية = 0
 self.data.draw = خطأ
 self.data.deck = {
 0: {0: 0, 1: 0, 2: 0},
 1: {0: 0, 1: 0, 2: 0}،
 2: {0: 0, 1: 0, 2: 0}،
 }
 البيانات الذاتية. اللاعب التالي = 1

 @sp. نقطة الدخول
 لعب الصم (الذات، المعلمات):
 قم بتأكيد self.data.winner == 0 وليس self.data.draw
 معايير التأكيد. >= 0 والمعايير. <3
 معايير التأكيد. >= 0 والمعايير. <3
 قم بتأكيد المعلمات. الخطوة == البيانات الذاتية.nextPlayer
 تأكيد self.data.deck [params.i] [params.j] == 0
 self.data.deck [params.i] [params.j] = بارامات.موف
 نقل البيانات الذاتية.nb += 1
 البيانات الذاتية. اللاعب التالي = 3 - البيانات الذاتية. اللاعب التالي
 self.data.winner = خط التحقق الذاتي (
                sp.record (الفائز = self.data.winner)، السطر = self.data.deck [params.i])
            )
 self.data.winner = خط التحقق الذاتي (
                سجل خاص (
 الفائز = self.data.winner،
                    السطر ={
                        0: self.data.deck[0][params.j],
                        1: self.data.deck[1][params.j],
                        2: self.data.deck[2][params.j],
                    }،
 )
 )
 self.data.winner = خط التحقق الذاتي (
                سجل خاص (
 الفائز = self.data.winner،
                    السطر ={
                        0: self.data.deck[0][0],
                        1: self.data.deck[1][1],
                        2: self.data.deck[2][2],
                    }،
 )
 )
 self.data.winner = خط التحقق الذاتي (
                سجل خاص (
 الفائز = self.data.winner،
                    السطر ={
                        0: self.data.deck[0][2],
                        1: self.data.deck[1][1],
                        2: self.data.deck[2][0],
                    }،
 )
 )
 إذا كان self.data.nbmoves == 9 وself.data.winner == 0:
 self.data.draw = صحيح

 @sp .خاص ()
 تعريف CheckLine (الذات، الفائز، السطر):
 الفائز_ = الفائز
 إذا كان السطر [0]! = 0 والخط [0] == السطر [1] والسطر [0] == السطر [2]:
 الفائز_ = السطر [0]
 الفائز بالإرجاع_

 # إضافة وظيفة إعادة ضبط اللعبة
 @sp. نقطة الدخول
 def confirm_and_reset (self):
 قم بتأكيد self.data.winner! = 0 أو self.data.draw
 الذات.__init__()

# اختبارات
إذا لم " تكن " القوالب موجودة في __name__:

 @sp .add_test (الاسم = Tictactoe) " "
 اختبار def ():
 سيناريو = سيناريو sp.test_( رئيسي)
        السيناريو الأول (تيك تاك تو) " "
        # تحديد العقد
 c1 = عامل التيك الرئيسي ()

 # أظهر تمثيلها
 السيناريو 2 (أ) " تسلسل التفاعلات مع الفائز")
 سيناريو += c1
 سيناريو. h2 (رسالة) " التنفيذ")
 السيناريو 3 (أ) " الخطوة الأولى في الوسط")
 c1. اللعب (i=1، j=1، التحرك=1)
 السيناريو 3 (أ) " خطوة ممنوعة")
 c1.play (i=1، j=1، Move=2) .run (صالح = خطأ)
        السيناريو 3 (أ) " الخطوة الثانية")
 c1. اللعب (i = 1، j = 2، الحركة = 2)
 سيناريو. h3 (أخرى) " التحركات")
 c1. اللعب (i = 2، j = 1، الحركة = 1)
 c1. اللعب (i = 2، j = 2، الحركة = 2)
 سيناريو التحقق (c1.data.winner == 0)
 c1. اللعب (i = 0، j = 1، الحركة = 1)
 سيناريو التحقق (c1.data.winner == 1)
 سيناريو. (اللاعب 1) " لقد فاز")
 c1.play (i=0، j=0، Move=2) .run (صالح = خطأ)

        c2 = التكتكوت الرئيسي (1)
 السيناريو 2 (أ) " تسلسل التفاعلات (مع السحب")
 سيناريو += c2
 سيناريو. h2 (رسالة) " التنفيذ")
 السيناريو 3 (أ) " الخطوة الأولى في الوسط")
 c2. play (i=1، j=1، التحرك=1)
 السيناريو 3 (أ) " خطوة ممنوعة")
 c2.play (i=1، j=1، Move=2) .run (صالح = خطأ)
        السيناريو 3 (أ) " الخطوة الثانية")
 c2. play (i = 1، j = 2، الحركة = 2)
 السيناريو 3 (آخر) " التحركات")
 c2. play (i = 2، j = 1، الحركة = 1)
 c2. play (i = 2، j = 2، الحركة = 2)
 c2. play (i=0، j=0، التحرك=1)
 c2. play (i = 0، j = 1، الحركة = 2)
 c2. play (i = 0، j = 2، الحركة = 1)
 c2. play (i = 2، j = 0، الحركة = 2)
 c2. play (i=1، j=0، التحرك=1)

 # إضافة اختبارات لإعادة ضبط اللعبة
 السيناريو 2 (الاختبار) " إعادة ضبط اللعبة")
 سيناريو. (الفائز " أو تم تأكيد السحب، والآن إعادة ضبط اللعبة")
 c1. التأكيد_وإعادة الضبط ()
 سيناريو التحقق (C1.data.nbmoves == 0)
 سيناريو التحقق (c1.data.winner == 0)
 سيناريو. تحقق (لا c1. data.draw)

        c2. التأكيد_وإعادة الضبط ()
 سيناريو التحقق (C2.data.nbmoves == 0)
 سيناريو التحقق (c2.data.winner == 0)
 سيناريو. تحقق (لا c2. داتا.draw)

تمت كتابة عقد لعبة TicTactoe الخاصة بنا على Tezos بلغة SmartPy. وتتكون من جزأين رئيسيين: حالة العقد ومنطق اللعبة.

حالة العقد

تتم تهيئة حالة العقد في وظيفة **init. وهي تشمل:

  • NBMoves: هذا عداد لعدد الحركات التي تمت في اللعبة. يبدأ من الصفر.
  • الفائز: هذا يتتبع الفائز في اللعبة. في البداية، القيمة صفر، مما يشير إلى عدم وجود فائز.
  • السحب: هذه علامة تشير إلى ما إذا كانت اللعبة قد انتهت بالتعادل. في البداية، هذا خطأ.
  • سطح السفينة: هذه شبكة 3 × 3 تمثل لوحة TicTactoe. جميع النقاط على اللوحة فارغة في البداية، ويتم تمثيلها بالأصفار.
  • NextPlayer: يشير هذا إلى دور الشخص الذي يجب أن يلعب. تبدأ اللعبة باللاعب 1، لذلك تم تعيينها مبدئيًا على 1.

منطق الألعاب

يتم تضمين منطق اللعبة في وظيفة اللعب. يقوم بإجراء العديد من عمليات التحقق للتأكد من صحة الحركة:

  • إنه يتحقق من عدم فوز أي لاعب حتى الآن وأن اللعبة ليست تعادلًا.
  • يتحقق من أن مؤشرات بقعة الشبكة التي اختارها اللاعب تقع ضمن حدود الشبكة.
  • يتأكد من أن اللاعب الذي يقوم بهذه الخطوة يطابق NextPlayer.
  • يضمن أن البقعة المختارة على الشبكة فارغة.
    بمجرد اتخاذ الخطوة، يقوم منطق اللعبة بزيادة عدد NBMoves، ويقوم بتبديل NextPlayer، ويتحقق مما إذا كانت الحركة قد أدت إلى الفوز أو التعادل.

يتم التحقق من حالة الفوز عبر صف وعمود الخطوة الأخيرة، بالإضافة إلى القطرين.

إذا تم ملء جميع النقاط على اللوحة ولم يفز أي لاعب (على سبيل المثال، NBMoves يساوي 9 والفائز لا يزال 0)، يتم إعلان اللعبة بمثابة تعادل.

التحقق من الفوز

يتم استخدام وظيفة CheckLine للتحقق مما إذا كان أي لاعب قد فاز. يتحقق مما إذا كانت جميع النقاط في السطر (والتي يمكن أن تكون صفًا أو عمودًا أو قطريًا) قد تم ملؤها بواسطة نفس اللاعب. إذا كان الأمر كذلك، فسيتم إعلان هذا اللاعب الفائز.

التفاعل مع العقد

يتم تمثيل التفاعلات مع العقد كمعاملات. عندما يقوم اللاعب بحركة عن طريق استدعاء وظيفة اللعب ، فإنه ينشئ معاملة. يتم تسجيل هذه المعاملة ويمكن رؤيتها في اللوحة اليمنى من SmartPY IDE:

قد تؤدي الخطوة غير الناجحة أو غير الصالحة أيضًا إلى إنشاء معاملة ولكن مع إشارة خطأ:

الخطوة الثانية وما بعدها

الخطوة الأولى في لعبة TicTactoe الخاصة بنا بسيطة نسبيًا نظرًا لأن لوحة اللعبة فارغة. ومع ذلك، تصبح الأمور أكثر إثارة للاهتمام مع الخطوة الثانية والتحركات اللاحقة. لا تضيف هذه التحركات قطعًا إلى لوحة اللعبة فحسب، بل تستدعي أيضًا منطق اللعبة للتحقق من الفائزين المحتملين.

بعد الخطوة الأولى، تتحول قيمة NextPlayer إلى اللاعب 2. الآن، تتحقق وظيفة التشغيل من حركة اللاعب 2. يتم إجراء عمليات فحص مماثلة للتأكد من صحة النقل، أي أن بقعة الشبكة المحددة داخل الحدود وفارغة.

عندما يقوم كل لاعب بحركة، تتطور حالة اللعبة. يزداد عدد NBMoves ، ويتم تبديل NextPlayer ، ويتم تحديث المجموعة. أيضًا، بعد كل خطوة، يتحقق العقد مما إذا كان هناك فائز أو ما إذا كان السحب.

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

الحركات الأخرى وتطور اللعبة

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

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

سيناريو السحب

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

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

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

Clause de non-responsabilité
* Les investissements en cryptomonnaies comportent des risques importants. Veuillez faire preuve de prudence. Le cours n'est pas destiné à fournir des conseils en investissement.
* Ce cours a été créé par l'auteur qui a rejoint Gate Learn. Toute opinion partagée par l'auteur ne représente pas Gate Learn.
Catalogue
Leçon 3

تطوير لعبة تيك تاكتوس على Tezos

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

لنبدأ باستكشاف عقدنا الخاص بلعبة TicTactoe:

هيكل العقد

الثعبان
# TicTactoe - مثال لأغراض توضيحية فقط.

الاستيراد بذكاء كـ sp


@sp. وحدة
تعريف رئيسي ():
 فئة TicTactoe (عقد SP):
 ديف __init__(الذات):
 نقل البيانات الذاتية.nb = 0
 الفائز بالبيانات الذاتية = 0
 self.data.draw = خطأ
 self.data.deck = {
 0: {0: 0, 1: 0, 2: 0},
 1: {0: 0, 1: 0, 2: 0}،
 2: {0: 0, 1: 0, 2: 0}،
 }
 البيانات الذاتية. اللاعب التالي = 1

 @sp. نقطة الدخول
 لعب الصم (الذات، المعلمات):
 قم بتأكيد self.data.winner == 0 وليس self.data.draw
 معايير التأكيد. >= 0 والمعايير. <3
 معايير التأكيد. >= 0 والمعايير. <3
 قم بتأكيد المعلمات. الخطوة == البيانات الذاتية.nextPlayer
 تأكيد self.data.deck [params.i] [params.j] == 0
 self.data.deck [params.i] [params.j] = بارامات.موف
 نقل البيانات الذاتية.nb += 1
 البيانات الذاتية. اللاعب التالي = 3 - البيانات الذاتية. اللاعب التالي
 self.data.winner = خط التحقق الذاتي (
                sp.record (الفائز = self.data.winner)، السطر = self.data.deck [params.i])
            )
 self.data.winner = خط التحقق الذاتي (
                سجل خاص (
 الفائز = self.data.winner،
                    السطر ={
                        0: self.data.deck[0][params.j],
                        1: self.data.deck[1][params.j],
                        2: self.data.deck[2][params.j],
                    }،
 )
 )
 self.data.winner = خط التحقق الذاتي (
                سجل خاص (
 الفائز = self.data.winner،
                    السطر ={
                        0: self.data.deck[0][0],
                        1: self.data.deck[1][1],
                        2: self.data.deck[2][2],
                    }،
 )
 )
 self.data.winner = خط التحقق الذاتي (
                سجل خاص (
 الفائز = self.data.winner،
                    السطر ={
                        0: self.data.deck[0][2],
                        1: self.data.deck[1][1],
                        2: self.data.deck[2][0],
                    }،
 )
 )
 إذا كان self.data.nbmoves == 9 وself.data.winner == 0:
 self.data.draw = صحيح

 @sp .خاص ()
 تعريف CheckLine (الذات، الفائز، السطر):
 الفائز_ = الفائز
 إذا كان السطر [0]! = 0 والخط [0] == السطر [1] والسطر [0] == السطر [2]:
 الفائز_ = السطر [0]
 الفائز بالإرجاع_

 # إضافة وظيفة إعادة ضبط اللعبة
 @sp. نقطة الدخول
 def confirm_and_reset (self):
 قم بتأكيد self.data.winner! = 0 أو self.data.draw
 الذات.__init__()

# اختبارات
إذا لم " تكن " القوالب موجودة في __name__:

 @sp .add_test (الاسم = Tictactoe) " "
 اختبار def ():
 سيناريو = سيناريو sp.test_( رئيسي)
        السيناريو الأول (تيك تاك تو) " "
        # تحديد العقد
 c1 = عامل التيك الرئيسي ()

 # أظهر تمثيلها
 السيناريو 2 (أ) " تسلسل التفاعلات مع الفائز")
 سيناريو += c1
 سيناريو. h2 (رسالة) " التنفيذ")
 السيناريو 3 (أ) " الخطوة الأولى في الوسط")
 c1. اللعب (i=1، j=1، التحرك=1)
 السيناريو 3 (أ) " خطوة ممنوعة")
 c1.play (i=1، j=1، Move=2) .run (صالح = خطأ)
        السيناريو 3 (أ) " الخطوة الثانية")
 c1. اللعب (i = 1، j = 2، الحركة = 2)
 سيناريو. h3 (أخرى) " التحركات")
 c1. اللعب (i = 2، j = 1، الحركة = 1)
 c1. اللعب (i = 2، j = 2، الحركة = 2)
 سيناريو التحقق (c1.data.winner == 0)
 c1. اللعب (i = 0، j = 1، الحركة = 1)
 سيناريو التحقق (c1.data.winner == 1)
 سيناريو. (اللاعب 1) " لقد فاز")
 c1.play (i=0، j=0، Move=2) .run (صالح = خطأ)

        c2 = التكتكوت الرئيسي (1)
 السيناريو 2 (أ) " تسلسل التفاعلات (مع السحب")
 سيناريو += c2
 سيناريو. h2 (رسالة) " التنفيذ")
 السيناريو 3 (أ) " الخطوة الأولى في الوسط")
 c2. play (i=1، j=1، التحرك=1)
 السيناريو 3 (أ) " خطوة ممنوعة")
 c2.play (i=1، j=1، Move=2) .run (صالح = خطأ)
        السيناريو 3 (أ) " الخطوة الثانية")
 c2. play (i = 1، j = 2، الحركة = 2)
 السيناريو 3 (آخر) " التحركات")
 c2. play (i = 2، j = 1، الحركة = 1)
 c2. play (i = 2، j = 2، الحركة = 2)
 c2. play (i=0، j=0، التحرك=1)
 c2. play (i = 0، j = 1، الحركة = 2)
 c2. play (i = 0، j = 2، الحركة = 1)
 c2. play (i = 2، j = 0، الحركة = 2)
 c2. play (i=1، j=0، التحرك=1)

 # إضافة اختبارات لإعادة ضبط اللعبة
 السيناريو 2 (الاختبار) " إعادة ضبط اللعبة")
 سيناريو. (الفائز " أو تم تأكيد السحب، والآن إعادة ضبط اللعبة")
 c1. التأكيد_وإعادة الضبط ()
 سيناريو التحقق (C1.data.nbmoves == 0)
 سيناريو التحقق (c1.data.winner == 0)
 سيناريو. تحقق (لا c1. data.draw)

        c2. التأكيد_وإعادة الضبط ()
 سيناريو التحقق (C2.data.nbmoves == 0)
 سيناريو التحقق (c2.data.winner == 0)
 سيناريو. تحقق (لا c2. داتا.draw)

تمت كتابة عقد لعبة TicTactoe الخاصة بنا على Tezos بلغة SmartPy. وتتكون من جزأين رئيسيين: حالة العقد ومنطق اللعبة.

حالة العقد

تتم تهيئة حالة العقد في وظيفة **init. وهي تشمل:

  • NBMoves: هذا عداد لعدد الحركات التي تمت في اللعبة. يبدأ من الصفر.
  • الفائز: هذا يتتبع الفائز في اللعبة. في البداية، القيمة صفر، مما يشير إلى عدم وجود فائز.
  • السحب: هذه علامة تشير إلى ما إذا كانت اللعبة قد انتهت بالتعادل. في البداية، هذا خطأ.
  • سطح السفينة: هذه شبكة 3 × 3 تمثل لوحة TicTactoe. جميع النقاط على اللوحة فارغة في البداية، ويتم تمثيلها بالأصفار.
  • NextPlayer: يشير هذا إلى دور الشخص الذي يجب أن يلعب. تبدأ اللعبة باللاعب 1، لذلك تم تعيينها مبدئيًا على 1.

منطق الألعاب

يتم تضمين منطق اللعبة في وظيفة اللعب. يقوم بإجراء العديد من عمليات التحقق للتأكد من صحة الحركة:

  • إنه يتحقق من عدم فوز أي لاعب حتى الآن وأن اللعبة ليست تعادلًا.
  • يتحقق من أن مؤشرات بقعة الشبكة التي اختارها اللاعب تقع ضمن حدود الشبكة.
  • يتأكد من أن اللاعب الذي يقوم بهذه الخطوة يطابق NextPlayer.
  • يضمن أن البقعة المختارة على الشبكة فارغة.
    بمجرد اتخاذ الخطوة، يقوم منطق اللعبة بزيادة عدد NBMoves، ويقوم بتبديل NextPlayer، ويتحقق مما إذا كانت الحركة قد أدت إلى الفوز أو التعادل.

يتم التحقق من حالة الفوز عبر صف وعمود الخطوة الأخيرة، بالإضافة إلى القطرين.

إذا تم ملء جميع النقاط على اللوحة ولم يفز أي لاعب (على سبيل المثال، NBMoves يساوي 9 والفائز لا يزال 0)، يتم إعلان اللعبة بمثابة تعادل.

التحقق من الفوز

يتم استخدام وظيفة CheckLine للتحقق مما إذا كان أي لاعب قد فاز. يتحقق مما إذا كانت جميع النقاط في السطر (والتي يمكن أن تكون صفًا أو عمودًا أو قطريًا) قد تم ملؤها بواسطة نفس اللاعب. إذا كان الأمر كذلك، فسيتم إعلان هذا اللاعب الفائز.

التفاعل مع العقد

يتم تمثيل التفاعلات مع العقد كمعاملات. عندما يقوم اللاعب بحركة عن طريق استدعاء وظيفة اللعب ، فإنه ينشئ معاملة. يتم تسجيل هذه المعاملة ويمكن رؤيتها في اللوحة اليمنى من SmartPY IDE:

قد تؤدي الخطوة غير الناجحة أو غير الصالحة أيضًا إلى إنشاء معاملة ولكن مع إشارة خطأ:

الخطوة الثانية وما بعدها

الخطوة الأولى في لعبة TicTactoe الخاصة بنا بسيطة نسبيًا نظرًا لأن لوحة اللعبة فارغة. ومع ذلك، تصبح الأمور أكثر إثارة للاهتمام مع الخطوة الثانية والتحركات اللاحقة. لا تضيف هذه التحركات قطعًا إلى لوحة اللعبة فحسب، بل تستدعي أيضًا منطق اللعبة للتحقق من الفائزين المحتملين.

بعد الخطوة الأولى، تتحول قيمة NextPlayer إلى اللاعب 2. الآن، تتحقق وظيفة التشغيل من حركة اللاعب 2. يتم إجراء عمليات فحص مماثلة للتأكد من صحة النقل، أي أن بقعة الشبكة المحددة داخل الحدود وفارغة.

عندما يقوم كل لاعب بحركة، تتطور حالة اللعبة. يزداد عدد NBMoves ، ويتم تبديل NextPlayer ، ويتم تحديث المجموعة. أيضًا، بعد كل خطوة، يتحقق العقد مما إذا كان هناك فائز أو ما إذا كان السحب.

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

الحركات الأخرى وتطور اللعبة

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

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

سيناريو السحب

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

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

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

Clause de non-responsabilité
* Les investissements en cryptomonnaies comportent des risques importants. Veuillez faire preuve de prudence. Le cours n'est pas destiné à fournir des conseils en investissement.
* Ce cours a été créé par l'auteur qui a rejoint Gate Learn. Toute opinion partagée par l'auteur ne représente pas Gate Learn.