لنبدأ باستكشاف عقدنا الخاص بلعبة 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 سيناريو الرسم هذا. إنه يحاكي سلسلة من التحركات التي تؤدي إلى السحب ويتحقق من أن العقد يتعامل معها بشكل صحيح.
لنبدأ باستكشاف عقدنا الخاص بلعبة 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 سيناريو الرسم هذا. إنه يحاكي سلسلة من التحركات التي تؤدي إلى السحب ويتحقق من أن العقد يتعامل معها بشكل صحيح.