Tuesday 13 March 2018

رمز استراتيجية ريفيرسي


الخيارات الثنائية.
رمز استراتيجية ريفيرسي.
جيثب - لوجياثوي / ريفيرسيغام: ريفيرسي (a. k.a. أوثيلو.
تاريخ جيثب اليوم. جيثب هي موطن لأكثر من 20 مليون مطورين يعملون معا لاستضافة ومراجعة التعليمات البرمجية، وإدارة المشاريع، وبناء البرمجيات معا.
ريفيرسي على الانترنت - تلعب ريفيرسي لعبة.
حول جافاسكريبت ريفيرسي: جافا سكريبت ريفيرسي المباراة الذكاء مع متصفح الويب الخاص بك. أبيض: 2 أسود: 2.
ريفيرسي غش & أمب؛ رموز للكمبيوتر - تشيكوديس.
ريفيرسي. من ويكي الكتب، مقدمة لاستراتيجية وتكتيكات لعبة عطيل، تيد لانداو، 1987؛ عطيل: من المبتدئين إلى الماجستير، راندي فانغ، 2003؛
ريفيرسي لعبة في C # وينفورمز - كود ارسنال.
لمزيد من المعلومات حول كيفية تشغيل ريفيرسي، والاستراتيجيات وراء ذلك، يرجى الاطلاع على دليل ريفيرسي على ويكي الكتب. ضوابط . لوحة التحكم تراكب.
تلعب ريفيرسي على الانترنت - العاب اون لاين.
لعبت ريفيرسي مع الحجارة الصغيرة من لونين مختلفين. تبدأ اللعبة مع كل لاعب وجود اثنين من بلايتس مخطط قطريا في وسط المجلس. كل.
لعبة ريفيرسي صعبة لمبتدئ - C ++ المنتدى.
وهناك لعبة ريفيرسي بسيطة مكتوبة في أكتيونسكريبت. انها مصممة لتشغيل على أي جهاز يدعم فلاش / إير، بغض النظر عن حجم الشاشة. للحصول على إرشادات حول إنشاء.
ريفيرسي نوع عطيل لعبة: سلسلة عامة & # 171؛ سترينغ & # 171؛ C.
ريفيرسي الملقب عطيل هي لعبة اثنين من لاعب متنها. لعب ريفيرسي على الانترنت ضد الكمبيوتر من صديق.
ريفيرسي - لغز والاستراتيجية لعبة للأطفال - داكسترس.
استنساخ عبر هتبس استنساخ مع جيت أو الخروج مع سفن باستخدام عنوان ويب مستودع التخزين.
قواعد ريفيرسي - فلايوردي.
ريفيرسي لعبة مكتوبة في C # وينفورمز مع شفرة المصدر المتاحة للتحميل.
الفصل 15 - ريفيرسي - اخترع مع بيثون.
2003-07-31 & # 0183؛ & # 32؛ لعبة ريفيرسي في C # .؛ المؤلف باستخدام الرمز. فإن بحث غوغل سيحضر الكثير من الموارد التي تصف الاستراتيجيات ونهج منظمة العفو الدولية.
لعبة ريفيرسي و أي في C ++ (غرسلاتون.
هذا هو تنفيذ لعبة ريفيرسي، أو عطيل مع على وف، وذلك باستخدام نمط مففم المعروفة. واجهة بسيطة جدا وسريعة، وجيدة لاعب.
ريفيرسي - ويكيبيديا.
ريفيرسي. يعرف أيضا باسم & كوت؛ عطيل & كوت؛ إصدارات أخرى: ريفيرسي، ريفيرسي واسعة، ريفيرسي صغيرة و ريفيرسي (فلاش) هناك الكثير من استراتيجية مثيرة للاهتمام في هذه اللعبة!
عطيل | مجلس لعبة | BoardGameGeek.
2017-03-31 & # 0183؛ & # 32؛ مقدمة ريفيرسي هي لعبة متنها رائعة لا نهاية لها لمدة 2 لاعبين، أفضل لعبة ريفيرسي الحرة. الحصول على مزيد من المشورة استراتيجية ريفيرسي،
ريفيرسي تعليمي.
تحميل شفرة المصدر - 57.8 كيلوبايت؛ المقدمة. هذا المشروع هو تنفيذ لعبة ريفيرسي مع الذكاء الاصطناعي بسيط. خلفية.
ريفيرسي - كوديبروجيكت.
ريفيرسي من السهل أن تلعب، يلعب الكمبيوتر Games4TV الخصم & كوت؛ متوسطة المستوى & كوت؛ لعبة، ويستخدم الاستراتيجية التي كل لاعب جيد ريفيرسي يعرف:
مؤشر الفوركس ريفيرسي " استراتيجية | المؤشرات.
لعب ريفيرسي Online. Articles والأخبار عن الحب، التي يرجع تاريخها، الفردي.
ريفيرسي كود - C ++ المنتدى - كبلوسبلوس.
2018-05-22 & # 0183؛ & # 32؛ تظهر عينة ريفيرسي كيفية الجمع بين العديد من ميزات التطبيق متجر ويندوز باستخدام زمل و C #، وكيفية استخدام C ++ لحسابات حساسة للأداء، و.
ريفيرسي لعبة - تلعب ريفيرسي على الانترنت.
كيف تذهب حول تنفيذ لعبة ريفيرسي؟ هل تتحدث عن تنفيذ إستراتيجية ل ريفيرسي أو كيف يمكنني تحويل هذا الرمز # فوريش.

الخيارات الثنائية.
رمز استراتيجية ريفيرسي.
ريفيرسي لعبة - تلعب ريفيرسي على الانترنت.
ريفيرسي. يعرف أيضا باسم & كوت؛ عطيل & كوت؛ إصدارات أخرى: ريفيرسي، ريفيرسي واسعة، ريفيرسي صغيرة و ريفيرسي (فلاش) هناك الكثير من استراتيجية مثيرة للاهتمام في هذه اللعبة!
جيثب - كانترل / ريفيرسي: لعبة ريفيرسي بسيطة مكتوبة.
2003-07-31 & # 0183؛ & # 32؛ لعبة ريفيرسي في C # .؛ المؤلف باستخدام الرمز. فإن بحث غوغل سيحضر الكثير من الموارد التي تصف الاستراتيجيات ونهج منظمة العفو الدولية.
ريفيرسي صغيرة - ماثسيسفون.
هذا هو تنفيذ لعبة ريفيرسي، أو عطيل مع على وف، وذلك باستخدام نمط مففم المعروفة. واجهة بسيطة جدا وسريعة، وجيدة لاعب.
جافا سكريبت ريفيرسي - ديفيد باو.
مرحبا، هنا استراتيجية قليلا من بلدي. انها لن تعطيك الملايين من الدولارات، وشرائه هو بسيط جدا (لا مؤشرات)، وفعالة على.
عطيل | مجلس لعبة | BoardGameGeek.
ريفيرسي نصائح واستراتيجيات لمساعدتك على كسب المزيد من الألعاب ضد الأصدقاء والمنافسين.
الفصل 15 - ريفيرسي - اخترع مع بيثون.
لمزيد من المعلومات حول كيفية تشغيل ريفيرسي، والاستراتيجيات وراء ذلك، يرجى الاطلاع على دليل ريفيرسي على ويكي الكتب. ضوابط . لوحة التحكم تراكب.
ريفيرسي على الانترنت لعبة استراتيجية المجلس - رولاب.
ريفيرسي من السهل أن تلعب، يلعب الكمبيوتر Games4TV الخصم & كوت؛ متوسطة المستوى & كوت؛ لعبة، ويستخدم الاستراتيجية التي كل لاعب جيد ريفيرسي يعرف:
لعبة ريفيرسي و أي في C ++ (غرسلاتون.
قواعد ريفيرسي القواعد الأساسية كل قطعة ريفيرسي لها جانب أسود وجانب أبيض. على دورك، يمكنك وضع قطعة واحدة على متن الطائرة مع لونك مواجهة.
كيف تذهب حول تنفيذ لعبة ريفيرسي.
والفكرة هي لفخ قطعة أو أكثر من المعارضين بين اثنين من القطع الخاصة بك. قطع هؤلاء المعارضين ثم تغيير اللون لتصبح القطع الخاصة بك.
مؤشر الفوركس ريفيرسي " استراتيجية | المؤشرات.
ريفيرسي. يعرف أيضا باسم & كوت؛ عطيل & كوت؛ إصدارات أخرى: ريفيرسي واسعة، ريفيرسي الصغيرة، ريفيرسي صغيرة و ريفيرسي (فلاش) هناك الكثير من استراتيجية مثيرة للاهتمام في هذه اللعبة!
جيثب - لوجياثوي / ريفيرسيغام: ريفيرسي (a. k.a. أوثيلو.
2017-03-31 & # 0183؛ & # 32؛ مقدمة ريفيرسي هي لعبة متنها رائعة لا نهاية لها لمدة 2 لاعبين، أفضل لعبة ريفيرسي الحرة. الحصول على مزيد من المشورة استراتيجية ريفيرسي،
ريفيرسي لعبة (عطيل) - فيسوال باسيك، ف.
شفرة المصدر ريفيرسي. الاستراتيجية التي يتبعها بسيطة: التحرك على الزاوية إذا استطعت، وإلا جعل هذه الخطوة التي سوف الوجه على معظم البلاط.
أفضل ريفيرسي لعبة | جيزمو مجانية.
الحصول على أحدث غش، رموز، أونلوكابليس، تلميحات، بيض عيد الفصح، مواطن الخلل، نصائح، الحيل، الخارقة، التنزيلات، الإنجازات، أدلة، أسئلة وأجوبة، و تجول ل ريفيرسي على جهاز الكمبيوتر.
لعبة ريفيرسي صعبة لمبتدئ - C ++ المنتدى.
2018-05-22 & # 0183؛ & # 32؛ تظهر عينة ريفيرسي كيفية الجمع بين العديد من ميزات التطبيق متجر ويندوز باستخدام زمل و C #، وكيفية استخدام C ++ لحسابات حساسة للأداء، و.

ريفيرسي.
الموضوعات المشمولة في هذا الفصل:
· بول () وظيفة.
· كيفية اللعب ريفيرسي.
في هذا الفصل، سنقوم بعمل لعبة تسمى ريفيرسي (وتسمى أيضا عطيل). ريفيرسي هي لعبة متن التي لعبت على الشبكة، ولذا فإننا سوف تستخدم نظام الإحداثيات الديكارتية مع إحداثيات زي. إنها لعبة لعبت مع اثنين من اللاعبين. لدينا نسخة من اللعبة سوف يكون جهاز الكمبيوتر أي الذي هو أكثر تقدما من منظمة العفو الدولية التي قطعناها على أنفسنا ل تيك تاك تو. في الواقع، وهذا الذكاء الاصطناعي هو جيد جدا أنه من المحتمل أن يضربك تقريبا في كل مرة كنت تلعب. (وأنا أعلم أنني تفقد كلما كنت ألعب ضد ذلك!)
ريفيرسي لديه لوحة 8 × 8 والبلاط التي هي سوداء على جانب واحد والأبيض من جهة أخرى (لعبتنا سوف تستخدم O و X بدلا من ذلك). تبدو لوحة البداية بالشكل 15-1. لاعب أسود واللاعب الأبيض يتناوبون وضع أسفل البلاط الجديد من لونها. أي من البلاط الخصم التي هي بين البلاط الجديد والبلاط الأخرى من هذا اللون انقلبت. والهدف من اللعبة هو أن يكون العديد من البلاط مع لونك ممكن. على سبيل المثال، الشكل 15-2 هو ما يبدو إذا كان لاعب أبيض يضع البلاط الأبيض الجديد على الفضاء 5، 6.
الشكل 15-1: بداية ريفيرسي مجلس واثنين من البلاط الأبيض واثنين من البلاط الأسود.
الشكل 15-2: يضع الأبيض بلاط جديد.
البلاط الأسود في 5، 5 هو بين البلاط الأبيض الجديد والبلاط الأبيض الحالي في 5، 4. أن البلاط الأسود انقلبت وتصبح البلاط الأبيض الجديد، مما يجعل المجلس تبدو مثل الشكل 15-3. أسود يجعل خطوة مماثلة المقبل، ووضع البلاط الأسود على 4، 6 الذي يقلب البلاط الأبيض في 4، 5. هذا يؤدي إلى لوحة التي تبدو مثل الشكل 15-4.
الشكل 15-3: تحرك أبيض سيتحرك فوق أحد بلاط الأسود.
الشكل 15-4: الأسود يضع البلاط الجديد، الذي تقلب على واحد من البلاط الأبيض.
البلاط في جميع الاتجاهات انقلبت طالما أنها بين البلاط اللاعب الجديد والبلاط القائمة. في الشكل 15-5، لاعب أبيض يضع البلاط في 3، 6 ويقلب البلاط الأسود في كلا الاتجاهين (ملحوظ بالخطوط). والنتيجة هي في الشكل 15-6.
الشكل 15-5: الخطوة الثانية البيضاء في 3، 6 سوف الوجه اثنين من البلاط الأسود.
الشكل 15-6: اللوحة بعد الخطوة الثانية للبيض.
كل لاعب يمكن أن الوجه بسرعة العديد من البلاط على متن الطائرة في واحد أو اثنين من التحركات. يجب على اللاعبين دائما جعل الخطوة التي يلتقط البلاط واحد على الأقل. وتنتهي اللعبة عندما لاعب إما لا يمكن أن تجعل هذه الخطوة، أو لوحة مليئة تماما. لاعب مع معظم البلاط من انتصارات اللون.
فإن منظمة العفو الدولية نجعل لهذه اللعبة سوف ننظر ببساطة عن أي تحركات الزاوية التي يمكن أن تتخذ. إذا لم تكن هناك تحركات الزاوية المتاحة، ثم سيقوم الكمبيوتر تحديد الخطوة التي يدعي معظم البلاط.
عينة تشغيل من ريفيرسي.
مرحبا بكم في ريفيرسي!
هل تريد أن تكون X أو O؟
لاعب سوف تذهب أولا.
1 2 3 4 5 6 7 8
لديك 2 نقطة. الكمبيوتر لديه 2 نقطة.
أدخل التحرك الخاص بك، أو اكتب إنهاء لإنهاء اللعبة، أو تلميحات لإيقاف / على تلميحات.
1 2 3 4 5 6 7 8
لديك 4 نقاط. الكمبيوتر لديه 1 نقطة.
اضغط على إنتر لرؤية حركة الكمبيوتر.
. تخطي للإيجاز.
1 2 3 4 5 6 7 8
1 | O | O | O | O | O | O | O | O |
2 | O | O | O | O | O | O | O | O |
3 | O | O | O | O | O | O | O | O |
4 | O | O | X | O | O | O | O | O |
5 | O | O | O | X | O | X | O | X |
6 | O | X | O | X | X | O | O | |
7 | O | X | X | O | O | O | O | O |
8 | O | X | X | O | | | X | |
لديك 12 نقطة. يحتوي الكمبيوتر على 48 نقطة.
أدخل التحرك الخاص بك، أو اكتب إنهاء لإنهاء اللعبة، أو تلميحات لإيقاف / على تلميحات.
X سجل 15 نقطة. وسجل O 46 نقطة.
لقد فقدت. ضرب الكمبيوتر لك بنسبة 31 نقطة.
هل تريد أن تلعب مرة أخرى؟ (نعم أو لا)
كما ترون، منظمة العفو الدولية كانت جيدة جدا في ضرب لي 46 إلى 15. لمساعدة لاعب خارج، سنقوم ببرمجة اللعبة لتقديم تلميحات. إذا كان "تلميحات" أنواع لاعب كما تحركهم، فإنها يمكن تبديل وضع تلميحات وخارجها. عندما وضع تلميحات على، كل التحركات الممكنة لاعب يمكن أن تجعل تظهر على متن الطائرة باسم '.' شخصيات، مثل هذا:
1 2 3 4 5 6 7 8
شفرة المصدر ريفيرسي.
ريفيرسي هو برنامج الماموث بالمقارنة مع مبارياتنا السابقة. انها أكثر من 300 خطوط طويلة! ولكن لا تقلق، وكثير من هذه الخطوط هي تعليقات أو خطوط فارغة إلى الفضاء خارج التعليمات البرمجية وجعلها أكثر قابلية للقراءة.
كما هو الحال مع برامجنا الأخرى، سنقوم أولا بإنشاء العديد من الوظائف لتنفيذ المهام المتعلقة ريفيرسي أن القسم الرئيسي سوف ندعو. تقريبا 250 الخطوط الأولى من التعليمات البرمجية هي لهذه الوظائف المساعد، وخطوط 50 الأخيرة من التعليمات البرمجية تنفيذ لعبة ريفيرسي نفسها.
إذا كنت تحصل على أخطاء بعد كتابة هذه التعليمات البرمجية في، قارن التعليمات البرمجية التي كتبتها إلى رمز الكتاب مع أداة ديف على الانترنت في إنفبي / ديف / ريفيرسي.
3. استيراد عشوائي.
6. ديف دراوبوارد (المجلس):
7. # هذه الوظيفة يطبع من المجلس أنه تم تمريره. عوائد لا شيء.
11. الطباعة ('1 2 3 4 5 6 7 8')
13. ل y في مجموعة (8):
16. ل x في النطاق (8):
23. ديف ريسيتبوارد (المجلس):
24. # الفراغات خارج المجلس يتم تمريره، باستثناء موقف البداية الأصلي.
25. بالنسبة إلى x في النطاق (8):
26. بالنسبة إلى y في النطاق (8):
29. # قطع البداية:
36. ديف جيتنوبوارد ():
37. # إنشاء هيكل بيانات العلامة التجارية الجديدة، فارغة.
39. بالنسبة i في المدى (8):
40. board. append ([''] * 8)
42. عودة المجلس.
45. ديف إسفالديموف (لوحة، بلاط، ستارت، يستارت):
46. ​​# ريتورنس خطأ إذا تحرك المشغل على الفضاء ستستارت، يستارت غير صالح.
47. # إذا كانت خطوة صحيحة، ترجع قائمة بالمسافات التي ستصبح اللاعب إذا قاموا بالتحرك هنا.
48. إذا كان المجلس [ستارت] [يستارت]! = '' أم لا إيسونبوارد (ستارت، يستارت):
49. عودة خطأ.
51. لوحة [ستارت] [يستارت] = البلاط # تعيين البلاط مؤقتا على متن الطائرة.
54. أوثرتيل = 'O'
56. أوثرتيل = 'X'
59. [1، 1]، [1، 1]، [1، 1]، [1، 1]، [1، 1]، [1، 1] 1، 0]، [-1، 1]]:
60. x، y = شستارت، يستارت.
61. x + = زديركتيون # الخطوة الأولى في الاتجاه.
62. y + = يديركتيون # الخطوة الأولى في الاتجاه.
63. إذا كان إيسونبوارد (x، y) والمجلس [x] [y] == أوثرتيل:
64. # هناك قطعة تابعة للاعب آخر بجانب قطعة لدينا.
65. x + = زديركتيون.
66. y + = يديريكتيون.
67. إذا لم يكن إسونبوارد (x، y):
69. في حين لوحة [س] [ص] == أخرىالطريقة:
70. x + = زديركتيون.
71. y + = يديركتيون.
72. إن لم يكن إسونبوارد (x، y): # الخروج من حلقة بينما، ثم الاستمرار في ل حلقة.
74. إن لم يكن إيسنبوارد (x، y):
76. إذا كان المجلس [x] [y] == البلاط:
77. هناك قطع على الوجه. الذهاب في الاتجاه المعاكس حتى نصل إلى الفضاء الأصلي، مشيرا إلى جميع البلاط على طول الطريق.
79. x - = زديريكتيون.
80 - y - = يديركتيون.
81 - إذا كانت x == ستارت و y == يستارت:
83. البلاط ToFlip. append ([x، y])
85. المجلس [ستستارت] [يستارت] = '' # استعادة المساحة الفارغة.
86. إذا كان لين (تيليستوفليب) == 0: # إذا لم يتم انقلبت البلاط، وهذا ليس خطوة صحيحة.
87. عودة خطأ.
88. عودة البلاطتوفليب.
91. ديف إسونبوارد (x، y):
92. # ريتورنس صحيح إذا كانت الإحداثيات موجودة على اللوحة.
93. ريتورن x & غ؛ = 0 و x & لوت؛ = 7 و y & غ؛ = 0 و y & لوت؛ = 7.
96. ديف جيتبواردويثفالدموفيس (المجلس، البلاط):
97. # إرجاع مجلس إدارة جديد مع. بمناسبة التحركات صالحة لاعب معين يمكن أن تجعل.
98. دوبيبوارد = جيتبواردكوبي (المجلس)
100. ل x، y في جيتفالديموفيس (دوبيبوارد، بلاط):
102. عودة دوبيبوارد.
105. ديف جيتاليفالموفس (لوح، بلاط):
106. # ترجع قائمة من قوائم [x، y] من التحركات الصحيحة للاعب معين على لوحة معينة.
109. بالنسبة إلى x في النطاق (8):
110. بالنسبة إلى y في النطاق (8):
111. إذا كان إسفالديموف (لوحة، بلاط، س، ص)! = خطأ:
112. validMoves. append ([x، y])
113. ريتورن فاليدموفيس.
116. ديف جيتسكوروفوارد (المجلس):
117. # تحديد النتيجة عن طريق عد البلاط. لعرض القاموس باستخدام المفتاحين "X" و "O".
120. بالنسبة إلى x في النطاق (8):
121. بالنسبة إلى y في النطاق (8):
122. إذا كان المجلس [x] [y] == 'X':
124. إذا كان المجلس [x] [y] == 'O':
129. ديف إنتيربلايرتيل ():
130. # يتيح لاعب نوع البلاط الذي تريد أن تكون.
131. # إرجاع قائمة مع البلاط لاعب كأول عنصر، والبلاط الكمبيوتر والثانية.
133 - في حين لا (البلاط == 'X' أو البلاط == 'O'):
134. الطباعة ('هل تريد أن تكون X أو O؟')
135. تايل = إنبوت (). العلوي ()
137. # العنصر الأول في القائمة هو بلاط اللاعب، والثاني هو بلاط الكمبيوتر.
144. ديفوجوزفيرست ():
145. # اختيار عشوائيا اللاعب الذي يذهب أولا.
146. إذا random. randint (0، 1) == 0:
147. عودة 'الكمبيوتر'
149. عودة 'لاعب'
152- ديفلاجين ():
153. # ترجع هذه الدالة ترو إذا كان المشغل يريد التشغيل مرة أخرى، وإلا فإنه يقوم بإرجاع فالس.
154. طباعة ('هل تريد أن تلعب مرة أخرى؟ (نعم أو لا)')
155. ريتورن إنبوت (). لور (). ستارتزويث ('y')
158. ديف ماكيموف (لوحة، بلاط، ستارت، يستارت):
159. # وضع البلاط على متن الطائرة في شستارت، يستارت، والوجه أي قطعة من الخصم.
160. # الإرجاع خطأ إذا كانت هذه خطوة غير صالحة، ترو إذا كانت صالحة.
161. تايليسوفليب = إسفالديموف (لوحة، بلاط، ستارت، يستارت)
163. إذا البلاطزوفليب == خطأ:
164- العودة خطأ.
166. لوحة [ستارت] [يستارت] = البلاط.
167. ل x، y في البلاطتوفليب:
168. لوح [x] [y] = بلاط.
169. عودة صحيح.
172. ديف جيتبواردكوبي (المجلس):
173. # إجراء نسخة مكررة من قائمة المجلس وإرجاع النسخة المكررة.
174. دوبيبوارد = جيتنوبوارد ()
176- بالنسبة إلى x في النطاق (8):
177- بالنسبة إلى y في النطاق (8):
178. دوبيبوارد [x] [y] = بوارد [x] [y]
180. عودة دوبيبوارد.
183. ديف إسونكورنر (x، y):
184. # ريتورنس صحيح إذا كان الموقف في واحدة من أربع زوايا.
(0 = = 0 و y == 0) أو (x == 7 و y == 0) أو (x == 0 و y == 7) أو (x == 7 و y == 7)
188. ديف جيتبلايرموف (بوارد، بلايرتيل):
189. # اسمحوا لاعب نوع في تحركهم.
190. # ترجع هذه الخطوة ك [x، y] (أو ترجع تلميحات السلاسل أو "إنهاء")
191. DIGITS1TO8 = '1 2 3 4 5 6 7 8'.split ()
193. طباعة ('أدخل التحرك الخاص بك، أو إنهاء إنهاء لإنهاء اللعبة، أو تلميحات لإيقاف / على تلميحات.')
194. موف = إنبوت ().
195. إذا تحرك == 'إنهاء':
196. عودة 'إنهاء'
197. إذا تحرك == 'تلميحات':
198. عودة 'تلميحات'
200. إذا لين (نقل) == 2 ونقل [0] في DIGITS1TO8 ونقل [1] في DIGITS1TO8:
201. x = إنت (موف [0]) - 1.
202. y = إنت (موف [1]) - 1.
203. إذا إسفالدموف (المجلس، بلايرتيل، x، y) == خطأ:
208. طباعة ("هذا ليس خطوة صحيحة، اكتب الرقم x (1-8)، ثم الرقم y (1-8).)
209. طباعة ('على سبيل المثال، 81 سيكون أعلى الزاوية اليمنى.')
214. ديف جيتكومبوف (المجلس، كومبوتيرتيل):
215. # بالنظر إلى لوحة وبلاط الكمبيوتر، وتحديد أين.
216. # الخطوة وإرجاع هذه الخطوة كقائمة [س، ص].
217. بوسيبل موفيز = جيتفالديموفس (بوارد، كومبوتيرتيل)
219. # عشوائيا ترتيب التحركات المحتملة.
222. # دائما الذهاب لزاوية إذا كانت متوفرة.
223. x، y في إمبلويموفس:
224. إذا كان إيسونكورنر (x، y):
227. # الذهاب من خلال جميع التحركات الممكنة وتذكر أفضل خطوة التهديف.
228. بيستسكور = -1.
229- بالنسبة إلى x، y في مواضع ممكنة:
230. دوبيبوارد = جيتبواردكوبي (بوارد)
231. ماكيموف (دوبيبوارد، كومبوتيرتيل، x، y)
232. سكور = جيتسكوريوفبوارد (دويبوارد) [كومبوترتيل]
233. إذا كانت النتيجة & غ؛ شهرية:
234. بيستموف = [x، y]
235. بيستسكور = النتيجة.
236. العودة بيستموف.
239. ديف شوتبوانتس (بلايرتيل، كومبوترتيل):
240. # طباعة من النتيجة الحالية.
241. عشرات = جيتسكوروفبوارد (مينبوارد)
242. الطباعة ('لديك٪ s نقطة. الكمبيوتر لديه٪ s نقطة.'٪ (عشرات [بلايرتيل]، عشرات [كومبوترتيل]))
246. طباعة ('مرحبا بك في ريفيرسي!')
249. # إعادة تعيين المجلس واللعبة.
250. مينبوارد = جيتنوبوارد ()
252. بلايرتيل، كومبوترتيل = إنتيربلايرتيل ()
253. شوينتس = خطأ.
254. تورن = ووغزفيرست ()
255. الطباعة ('ذي' + تورن + 'ستبدأ أولا.')
258. إذا بدوره == لاعب ':
259. # لاعب بدوره.
260. إذا عرضت:
261. فاليدموفيزبوارد = جيتبواردويثفاليدموفيس (مينبوارد، بلايرتيل)
265. شوتبوانتس (بلايرتيل، كومبوترتيل)
266. موف = جيتبلايرموف (مينبوارد، بلايرتيل)
267. إذا تحرك == 'إنهاء':
268. طباعة ('شكرا للعب!')
269. sys. exit () # إنهاء البرنامج.
270. إليف الخطوة == 'تلميحات':
271. شوهينتس = نوت شو هينتس.
274. ماكيموف (مينبوارد، بلايرتيل، نقل [0]، نقل [1])
276. إذا جيتفالديموفس (مينبوارد، كومبوتيرتيل) == []:
279. بدوره = 'الكمبيوتر'
282. # دور الحاسوب.
284. شيبوانتس (بلايرتيل، كومبوترتيل)
285. الإدخال ('اضغط إنتر لرؤية حركة الكمبيوتر'. ')
286. x، y = جيتكومبوترموف (مينبوارد، كومبوتيرتيل)
287. ماكيموف (مينبوارد، كومبوتيرتيل، x، y)
289. إذا جيتفالديموفيس (مينبوارد، بلايرتيل) == []:
292. بدوره = 'لاعب'
294. # عرض النتيجة النهائية.
296. عشرات = جيتسكوروفبوارد (مينبوارد)
297. الطباعة ('X سكور٪ s نقاط O سكور٪ s بوينت' '٪ (عشرات [' X ']، عشرات [' O '])
298. إذا كانت النتائج [بلايرتيل] & غ؛ عشرات [computerTile]:
299. طباعة ('أنت تغلب على الكمبيوتر بنسبة٪ s نقاط! تهانينا!'٪ (عشرات [بلايرتيل] - عشرات [كومبوترتيل]))
300. عشرات إليف [بلايرتيل] & لوت؛ عشرات [computerTile]:
301. الطباعة ('لقد فقدت، الكمبيوتر يضربك بنسبة٪ s نقطة.'٪ (عشرات [كومبوترتيل] - عشرات [بلايرتيل]))
303. الطباعة ('كانت اللعبة التعادل!')
305. إذا لم يكن بلايغين ():
كيفية عمل المدونة.
هيكل البيانات مجلس اللعبة.
قبل الدخول في التعليمات البرمجية، دعونا معرفة هيكل البيانات للمجلس. هيكل البيانات هذا هو قائمة من القوائم، تماما مثل واحد في لعبة سونار السابقة. يتم إنشاء قائمة القوائم بحيث تمثل اللوحة [x] [y] الحرف على الفضاء الموجود في الموضع x على المحور السيني (يسارا يمينا / يمينا) والموقف y على المحور Y (صعودا / هبوطا) .
يمكن أن يكون هذا الحرف حرفا '' (لتمثيل مسافة فارغة)، '.' (لتمثيل تحرك ممكن في وضع تلميح)، أو 'X' أو 'O' (لتمثيل البلاط لاعب). كلما رأيت معلمة اسمها المجلس، ومن المفترض أن يكون هذا النوع من قائمة بنية بيانات القوائم.
استيراد وحدات أخرى.
2. استيراد عشوائي.
ويستورد السطر 2 الوحدة العشوائية لوظائف الراندينت () والاختيار (). السطر 3 يستورد وحدة تميز الكلية للخروج () وظيفة.
رسم هيكل بيانات المجلس على الشاشة.
6. ديف دراوبوارد (المجلس):
7. # هذه الوظيفة يطبع من المجلس أنه تم تمريره. عوائد لا شيء.
11. الطباعة ('1 2 3 4 5 6 7 8')
سوف دروبوارد () وظيفة طباعة لوحة اللعبة الحالية على أساس هيكل البيانات في المجلس. لاحظ أن كل مربع من لوحة يبدو مثل هذا (يمكن أن يكون هناك أيضا 'O'، '.'، أو '' سلسلة بدلا من 'X'):
وبما أن الخط الأفقي مطبوع مرارا وتكرارا، فإن الخط 8 يخزنه في متغير ثابت يدعى هلين. سيؤدي هذا إلى حفظك من كتابة السلسلة بشكل متكرر.
هناك أيضا خطوط فوق وتحت مركز البلاط التي ليست سوى '|' (تسمى أحرف "الأنابيب") مع ثلاث مسافات بين. يتم تخزين هذا في ثابت اسمه فلين.
الخط 11 هو تنفيذ أول مكالمة () استدعاء وظيفة، ويطبع التسميات للمحور X على طول الجزء العلوي من اللوحة. یقوم الخط 12 بطباعة الخط الأفقي العلوي للوحة.
13. ل y في مجموعة (8):
16. ل x في النطاق (8):
سوف حلقة حلقة ثماني مرات، مرة واحدة لكل صف. يطبع السطر 15 تسمية المحور Y على الجانب الأيسر من اللوحة، ويحتوي على وسيطة الكلمة الرئيسية إند = '' لطباعة مسافة واحدة بدلا من سطر جديد. هذا هو أن حلقة أخرى (مرة أخرى حلقات ثماني مرات، مرة واحدة لكل مساحة) يطبع كل الفضاء (جنبا إلى جنب مع 'X'، 'O'، أو '' حرف اعتمادا على ما يتم تخزينه في لوحة [س] [ذ] .)
لدالة () استدعاء الدالة داخل الحلقة الداخلية أيضا نهاية = '' وسيطة الكلمة الرئيسية في نهاية الأمر، وهذا يعني أن يتم طباعة حرف مساحة بدلا من حرف جديد. وهذا سوف ينتج سطر واحد على الشاشة التي تبدو وكأنها '| X | X | X | X | X | X | X | X '(إذا كان كل من قيم اللوحة [x] [y]' X ').
بعد الانتهاء من الحلقة الداخلية، وطباعة () استدعاء وظيفة على خط 18 يطبع النهائي '|' حرف جنبا إلى جنب مع خط جديد.
رمز داخل الخارجي ل حلقة من خط 14 إلى خط 20 يطبع صف كامل من المجلس مثل هذا:
| X | X | X | X | X | X | X | X |
عندما تطبع الحلقة على السطر 13 الصف الثامن مرات، فإنها تشكل اللوحة بأكملها (بالطبع، فإن بعض المساحات الموجودة على اللوحة ستكون 'O' أو '' بدلا من 'X'):
| X | X | X | X | X | X | X | X |
| X | X | X | X | X | X | X | X |
| X | X | X | X | X | X | X | X |
| X | X | X | X | X | X | X | X |
| X | X | X | X | X | X | X | X |
| X | X | X | X | X | X | X | X |
| X | X | X | X | X | X | X | X |
| X | X | X | X | X | X | X | X |
إعادة تعيين لوحة اللعبة.
23. ديف ريسيتبوارد (المجلس):
24. # الفراغات خارج المجلس يتم تمريره، باستثناء موقف البداية الأصلي.
25. بالنسبة إلى x في النطاق (8):
26. بالنسبة إلى y في النطاق (8):
يحتوي الخطان 25 و 26 على حلقات متداخلة لتعيين بنية بيانات اللوحة لتكون كل سلاسل أحادية المساحة. هذا يجعل لوحة ريفيرسي فارغة. تسمى وظيفة ريسيتبوارد () كجزء من بدء لعبة جديدة.
إعداد قطعة البداية.
29. # قطع البداية:
في بداية اللعبة، كل لاعب لديه اثنين من البلاط وضعت بالفعل في المركز. خطوط 30 إلى 33 تعيين تلك البلاط على لوحة فارغة.
الدالة ريستبوارد () لا يجب أن تقوم بإرجاع متغير اللوحة، لأن اللوحة هي مرجع إلى قائمة. سيؤدي إجراء تغييرات داخل النطاق المحلي للدالة إلى تعديل القائمة الأصلية التي تم تمريرها كوسيطة. (انظر قسم المراجع في الفصل 10.)
إنشاء هيكل لعبة مجلس إدارة جديد.
36. ديف جيتنوبوارد ():
37. # إنشاء هيكل بيانات العلامة التجارية الجديدة، فارغة.
39. بالنسبة i في المدى (8):
40. board. append ([''] * 8)
42. عودة المجلس.
تقوم الدالة جيتنوبوارد () بإنشاء بنية بيانات لوحة جديدة وإعادتها. خط 38 يخلق القائمة الخارجية ويخزن إشارة إلى هذه القائمة في متن الطائرة. خط 40 يخلق القوائم الداخلية باستخدام النسخ المتماثل القائمة. ([''] * 8 على أن تكون هي نفسها [''، ''، ''، '،' '،' '،' '،' '] ولكن مع أقل كتابة.)
خط 39 ل حلقة هنا يخلق القوائم الداخلية ثمانية. وتمثل المساحات لوحة لعبة فارغة تماما.
ما ينتهي المجلس هو قائمة من ثمانية قوائم، ولكل من تلك القوائم الثمانية أنفسهم ثمانية سلاسل. والنتيجة هي 64 '' سلاسل.
التحقق مما إذا كانت عملية النقل صالحة أم لا.
45. ديف إسفالديموف (لوحة، بلاط، ستارت، يستارت):
46. ​​# ريتورنس خطأ إذا تحرك المشغل على الفضاء ستستارت، يستارت غير صالح.
47. # إذا كانت خطوة صحيحة، ترجع قائمة بالمسافات التي ستصبح اللاعب إذا قاموا بالتحرك هنا.
48. إذا كان المجلس [ستارت] [يستارت]! = '' أم لا إيسونبوارد (ستارت، يستارت):
49. عودة خطأ.
50. المجلس [شستارت] [يستارت] = البلاط # تعيين البلاط مؤقتا على متن الطائرة.
52. أوثرتيل = 'O'
54. أوثرتيل = 'X'
نظرا لهيكل بيانات المجلس، البلاط لاعب، والإحداثيات زي للتحرك اللاعب، إسفالديموف () يجب أن يعود صحيح إذا كانت قواعد اللعبة ريفيرسي تسمح للتحرك إلى تلك الإحداثيات و فالس إذا لم يفعلوا ذلك.
خط 48 يتحقق إذا الإحداثيات زي ليست على لوحة اللعبة، أو إذا كانت المساحة ليست فارغة. إيسونبوارد () هي وظيفة محددة في وقت لاحق في البرنامج الذي يتأكد من كل من X و Y الإحداثيات ما بين 0 و 7.
الخطوة التالية هي وضع مؤقتا البلاط لاعب على متن الطائرة. سيتم إزالة هذا البلاط (عن طريق تحديد مساحة اللوحة مرة أخرى إلى '' قبل العودة).
البلاط لاعب (إما لاعب الإنسان أو لاعب الكمبيوتر) هو في البلاط، ولكن هذه الوظيفة سوف تحتاج إلى معرفة البلاط لاعب آخر. إذا كان لاعب لاعب هو 'X' ثم من الواضح البلاط لاعب آخر هو 'O'، والعكس بالعكس.
وأخيرا، إذا ينتهي التنسيق زي معين كموقف صالح، إسفالديموف () بإرجاع قائمة من جميع البلاط الخصم التي من شأنها أن انقلبت من قبل هذه الخطوة.
59. [1، 1]، [1، 1]، [1، 1]، [1، 1]، [1، 1]، [1، 1] 1، 0]، [-1، 1]]:
ل حلقة تكررت من خلال قائمة من القوائم التي تمثل الاتجاهات التي يمكن أن تتحرك على لوحة اللعبة. لوحة اللعبة هو نظام الإحداثيات الديكارتية مع X و Y الاتجاه. هناك ثمانية اتجاهات يمكنك التحرك: أعلى وأسفل واليسار واليمين، والاتجاهات الأربعة قطري. يتم استخدام كل من القوائم الثمانية المكونة من عنصرين في القائمة على السطر 59 للتحرك في أحد هذه الاتجاهات. يتحرك البرنامج في اتجاه بإضافة القيمة الأولى في قائمة عنصرين إلى إحداثيات X، والقيمة الثانية للإحداثيات Y.
لأن إحداثيات X زيادة كما تذهب إلى اليمين، يمكنك "نقل" إلى اليمين بإضافة 1 إلى تنسيق X. وبالتالي فإن القائمة [1، 0] تضيف 1 إلى إحداثيات X و 0 إلى إحداثيات Y، مما يؤدي إلى "حركة" إلى اليمين. الانتقال إلى اليسار هو عكس ذلك: كنت طرح 1 (وهذا هو، إضافة -1) من X تنسيق.
ولكن للتحرك قطريا، تحتاج إلى إضافة أو طرح إلى كل من الإحداثيات. على سبيل المثال، إضافة 1 إلى X تنسيق للتحرك الحق وإضافة -1 إلى Y تنسيق لنقل ما يصل يؤدي إلى الانتقال إلى الاتجاه قطري أعلى يمين.
التحقق من كل من ثمانية اتجاهات.
هنا هو رسم تخطيطي لجعل من الأسهل أن نتذكر أي اثنين من قائمة البند يمثل أي اتجاه:
الشكل 15-7: كل قائمة من بندين تمثل واحدة من ثمانية اتجاهات.
59. [1، 1]، [1، 1]، [1، 1]، [1، 1]، [1، 1]، [1، 1] 1، 0]، [-1، 1]]:
60. x، y = شستارت، يستارت.
61. x + = زديركتيون # الخطوة الأولى في الاتجاه.
62. y + = يديركتيون # الخطوة الأولى في الاتجاه.
يحدد الخط 60 متغير x و y ليكون نفس قيمة ستارت و يستارت، على التوالي، باستخدام تخصيص متعدد. تغيير x و y إلى "نقل" في الاتجاه الذي تميل زديركتيون و يديريكتيون. ستبقى المتغيرات ستستارت و يستارت نفسها بحيث يمكن للبرنامج أن يتذكر المساحة التي بدأت أصلا من.
63. إذا كان إيسونبوارد (x، y) والمجلس [x] [y] == أوثرتيل:
64. # هناك قطعة تابعة للاعب آخر بجانب قطعة لدينا.
65. x + = زديركتيون.
66. y + = يديريكتيون.
67. إن لم يكن إسونبوارد (x، y):
تذكر، من أجل أن يكون هذا خطوة صحيحة، يجب أن تكون الخطوة الأولى في هذا الاتجاه 1) على متن الطائرة و 2) يجب أن تكون مشغولة من قبل لاعب اللاعب الآخر. وإلا ليس هناك أي من البلاط الخصم على الوجه، ويجب أن تحرك صالح الوجه على الأقل البلاط واحد. إذا كان هذين الأمرين غير صحيحين، فإن شرط الخط 63 ليس صحيحا ويعود التنفيذ إلى بيان فور للاتجاه التالي.
ولكن إذا كان الفضاء الأول لديه البلاط لاعب آخر، ثم يجب على البرنامج الحفاظ على التحقق في هذا الاتجاه حتى تصل إلى واحدة من البلاط اللاعب. إذا وصلت إلى ماضي نهاية المجلس على الرغم من، ثم خط 68 يجب أن تستمر العودة إلى بيان لمحاولة الاتجاه التالي.
69. في حين لوحة [س] [ص] == أخرىالطريقة:
70. x + = زديركتيون.
71. y + = يديركتيون.
72. إن لم يكن إسونبوارد (x، y): # الخروج من حلقة بينما، ثم الاستمرار في ل حلقة.
74. إن لم يكن إيسنبوارد (x، y):
بينما حلقة على خط 69 يبقى حلقات بحيث x و y الاستمرار في الاتجاه الحالي طالما أنها تبقي رؤية درب من البلاط لاعب آخر. وإذا اكتشف السطر 72 أن x و y قد انحرفا عن اللوحة، فإن السطر 73 ينفصل عن الحلقة ويتحرك تدفق التنفيذ إلى الخط 74.
ما تريد حقا القيام به هو الخروج من الحلقة بينما تستمر في حلقة. هذا هو السبب في خط 74 إعادة فحص ليس إونبوارد (س، ص) ويستمر يستمر، الذي ينتقل التنفيذ إلى الاتجاه التالي في السطر 59 لبيان. تذكر، كسر واستمرار البيانات سوف كسر فقط أو الاستمرار من حلقة أعمق هم في.
العثور على إذا كان هناك قطع على الوجه أكثر.
76. إذا كان المجلس [x] [y] == البلاط:
77. هناك قطع على الوجه. الذهاب في الاتجاه المعاكس حتى نصل إلى الفضاء الأصلي، مشيرا إلى جميع البلاط على طول الطريق.
79. x - = زديريكتيون.
80 - y - = يديركتيون.
81 - إذا كانت x == ستارت و y == يستارت:
83. البلاط ToFlip. append ([x، y])
خط 69 بينما حلقة توقف حلقة عندما وصلت التعليمات البرمجية نهاية البلاط أخرى. خط 76 يتحقق إذا كان هذا الفضاء على متن يحمل واحد من البلاط لدينا. إذا كان الأمر كذلك، فإن الخطوة التي تم تمريرها أصلا إلى إسفالديموف () صالحة.
خط 78 الحلقات عن طريق تحريك x و y في عكس العودة إلى الأصل ستارت و يستارت موقف طرح x و y. يتم إلحاق كل مساحة لقائمة توتليب.
85. المجلس [ستستارت] [يستارت] = '' # استعادة المساحة الفارغة.
86. إذا كان لين (تيليستوفليب) == 0: # إذا لم يتم انقلبت البلاط، وهذا ليس خطوة صحيحة.
87. عودة خطأ.
88. عودة البلاطتوفليب.
الحلقة التي بدأت على الخط 59 يفعل ذلك في جميع الاتجاهات الثمانية. بعد أن يتم ذلك حلقة، وسوف تحتوي على قائمة تاتوفليبب زي إحداثيات كل من البلاط الخصم لدينا التي من شأنها أن انقلبت إذا كان لاعب انتقل على ستارت، يستارت. تذكر، يتم فحص الدالة إسفالديموف () فقط لمعرفة ما إذا كانت الخطوة الأصلية صالحة. فإنه لا تغيير في الواقع بشكل دائم هيكل البيانات من لوحة اللعبة.
إذا لم ينتهي أي من الاتجاهات الثمانية حتى التقليب واحد على الأقل من البلاط الخصم، ثم البلاطتوفليب ستكون قائمة فارغة. هذه علامة على أن هذه الخطوة غير صالحة و إسفالديموف () يجب أن ترجع خطأ.
وإلا، إيسفالديموف () بإرجاع تاتليستوفليب.
التحقق من الإحداثيات الصالحة.
91. ديف إسونبوارد (x، y):
92. # ريتورنس صحيح إذا كانت الإحداثيات موجودة على اللوحة.
93. ريتورن x & غ؛ = 0 و x & لوت؛ = 7 و y & غ؛ = 0 و y & لوت؛ = 7.
إسونبوارد () هي وظيفة تسمى من إسفالديموف (). استدعاء الدالة هو الاختزال للتعبير المنطقي على السطر 93 هذا صحيح إذا كان كل من x و y بين 0 و 7. هذه الوظيفة يتحقق إذا كان تنسيق X و Y هو في الواقع على لوحة اللعبة. على سبيل المثال، تنسيق X من 4 و Y تنسيق 9999 لن يكون على متن الطائرة منذ إحداثيات Y فقط تصل إلى 7.
الحصول على قائمة مع جميع التحركات الصالحة.
96. ديف جيتبواردويثفالدموفيس (المجلس، البلاط):
97. # إرجاع مجلس إدارة جديد مع. بمناسبة التحركات صالحة لاعب معين يمكن أن تجعل.
98. دوبيبوارد = جيتبواردكوبي (المجلس)
100. x، y في جيتفالديموفيس (دوبيبوارد، بلاط):
102. عودة دوبيبوارد.
جيتبواردويثفالدموفيس () يعود لوحة البيانات هيكل اللعبة التي لديها '.' أحرف لجميع المساحات التي هي التحركات صالحة. الفترات هي لوضع تلميحات التي تعرض لوحة مع كل التحركات الممكنة ملحوظ عليه.
هذه الوظيفة يخلق هيكل البيانات لوحة متن الطائرة مكررة (عاد بواسطة جيتبواردكوبي () على خط 98) بدلا من تعديل واحد مرت عليه في المعلمة المجلس. خط 100 يدعو جيتفالديموفس () للحصول على قائمة الإحداثيات زي مع جميع التحركات القانونية يمكن للاعب جعل. يتم وضع علامة على نسخة المجلس مع فترات في تلك المساحات وعاد.
105. ديف جيتاليفالموفس (لوح، بلاط):
106. # ترجع قائمة من قوائم [x، y] من التحركات الصحيحة للاعب معين على لوحة معينة.
109. بالنسبة إلى x في النطاق (8):
110. بالنسبة إلى y في النطاق (8):
111. إذا كان إسفالديموف (لوحة، بلاط، س، ص)! = خطأ:
112. validMoves. append ([x، y])
113. ريتورن فاليدموفيس.
ترجع الدالة جيتفالديموفيس () قائمة بقوائم عنصرين. هذه القوائم عقد الإحداثيات زي لجميع التحركات صالحة لاعب لاعبالزبون لاعب في هيكل البيانات مجلس في المعلمة المجلس.
تستخدم هذه الدالة حلقات متداخلة (على السطرين 109 و 110) للتحقق من كل تنسيق زي (كل أربعة وستين منها) عن طريق استدعاء إسفالديموف () على تلك المساحة والتحقق مما إذا كانت ترجع فالس أو قائمة بالتحركات الممكنة (وفي هذه الحالة تكون a valid move). Each valid XY coordinate is appended to the list in validMoves .
The bool() Function.
The bool() is similar to the int() and str() functions. It returns the Boolean value form of the value passed to it.
Most data types have one value that is considered the False value for that data type. Every other value is consider True . For example, the integer 0 , the floating point number 0.0 , the empty string, the empty list, and the empty dictionary are all considered to be False when used as the condition for an if or loop statement. All other values are True . Try entering the following into the interactive shell:
Imagine that any statement’s condition is placed inside a call to bool() . That is, conditions are automatically interpreted as Boolean values. This is why the condition on line 111 works correctly. The call to the isValidMove() function either returns the Boolean value False or a non-empty list.
If you imagine that the entire condition is placed inside a call to bool() , then line 111’s condition False becomes bool(False) (which, of course, evaluates to False ). And a condition of a non-empty list placed as the parameter to bool() will return True .
Getting the Score of the Game Board.
116. def getScoreOfBoard(board):
117. # Determine the score by counting the tiles. Returns a dictionary with keys 'X' and 'O'.
120. for x in range(8):
121. for y in range(8):
122. if board[x][y] == 'X':
124. if board[x][y] == 'O':
The getScoreOfBoard() function uses nested for loops to check all 64 spaces on the board (8 rows times 8 columns per row is 64 spaces) and see which tile (if any) is on them. For each 'X' tile, the code increments xscore on line 123. For each 'O' tile, the code increments oscore on line 125.
Getting the Player’s Tile Choice.
129. def enterPlayerTile():
130. # Lets the player type which tile they want to be.
131. # Returns a list with the player's tile as the first item, and the computer's tile as the second.
133. while not (tile == 'X' or tile == 'O'):
134. print('Do you want to be X or O?')
135. tile = input().upper()
This function asks the player which tile they want to be, either 'X' or 'O' . The for loop will keep looping until the player types in 'X' or 'O' .
137. # the first element in the list is the player's tile, the second is the computer's tile.
The enterPlayerTile() function then returns a two-item list, where the player’s tile choice is the first item and the computer’s tile is the second. Line 252, which calls enterPlayerTile() , uses multiple assignment to put these two returned items in two variables.
Determining Who Goes First.
144. def whoGoesFirst():
145. # Randomly choose the player who goes first.
146. if random. randint(0, 1) == 0:
147. return 'computer'
149. return 'player'
The whoGoesFirst() function randomly selects who goes first, and returns either the string 'computer' or the string 'player' .
Asking the Player to Play Again.
152. def playAgain():
153. # This function returns True if the player wants to play again, otherwise it returns False.
154. print('Do you want to play again? (yes or no)')
155. return input().lower().startswith('y')
The playAgain() function was also in previous games. If the player types in a string that begins with 'y' , then the function returns True . Otherwise the function returns False .
Placing Down a Tile on the Game Board.
158. def makeMove(board, tile, xstart, ystart):
159. # Place the tile on the board at xstart, ystart, and flip any of the opponent's pieces.
160. # Returns False if this is an invalid move, True if it is valid.
161. tilesToFlip = isValidMove(board, tile, xstart, ystart)
makeMove() is called when you want to place a tile on the board and flip the other tiles according to the rules of Reversi. This function modifies the board data structure that is passed in-place. Changes made to the board variable (because it is a list reference) will be made to the global scope.
Most of the work is done by isValidMove() , which returns a list of XY coordinates (in a two-item list) of tiles that need to be flipped. (Remember, if the xstart and ystart arguments point to an invalid move, then isValidMove() will return the Boolean value False .)
163. if tilesToFlip == False:
164. return False.
166. board[xstart][ystart] = tile.
167. for x, y in tilesToFlip:
168. board[x][y] = tile.
169. return True.
On lines 163 and 164, if the return value of isValidMove() (now stored in tilesToFlip ) was False , then makeMove() will also return False .
Otherwise, isValidMove() returns a list of spaces on the board to put down the tiles (the 'X' or 'O' string in tile ). Line 166 sets the space that the player has moved on. Line 167’s for loop sets all the tiles that are in tilesToFlip .
Copying the Board Data Structure.
172. def getBoardCopy(board):
173. # Make a duplicate of the board list and return the duplicate.
174. dupeBoard = getNewBoard()
176. for x in range(8):
177. for y in range(8):
178. dupeBoard[x][y] = board[x][y]
180. return dupeBoard.
getBoardCopy() is different from getNewBoard() . getNewBoad() will create a blank game board data structure which has only empty spaces and the four starting tiles. getBoardCopy() will create a blank game board data structure, but then copy all of the spaces from the board parameter. This function is used by the AI to have a game board that it can change around without changing the real game board. This technique was also used by the previous Tic Tac Toe program.
A call to getNewBoard() handles getting a fresh game board data structure. Then the two nested for loops copy each of the 64 tiles from board to the duplicate board data structure in dupeBoard .
Determining if a Space is on a Corner.
183. def isOnCorner(x, y):
184. # Returns True if the position is in one of the four corners.
185. return (x == 0 and y == 0) or (x == 7 and y == 0) or (x == 0 and y == 7) or (x == 7 and y == 7)
The isOnCorner() function returns True if the coordinates are on a corner space at coordinates (0,0), (7,0), (0,7) or (7,7). Otherwise isOnCorner() returns False .
Getting the Player’s Move.
188. def getPlayerMove(board, playerTile):
189. # Let the player type in their move.
190. # Returns the move as [x, y] (or returns the strings 'hints' or 'quit')
191. DIGITS1TO8 = '1 2 3 4 5 6 7 8'.split()
The getPlayerMove() function is called to let the player type in the coordinates of their next move (and check if the move is valid). The player can also type in 'hints' to turn hints mode on (if it is off) or off (if it is on). The player can also type in 'quit' to quit the game.
The DIGITS1TO8 constant variable is the list ['1', '2', '3', '4', '5', '6', '7', '8'] . The DIGITS1TO8 constant is used because it is easier to type than the entire list. You can’t use the isdigit() method because that would allow 0 and 9 to be entered, which are not valid coordinates on the 8 × 8 board.
193. print('Enter your move, or type quit to end the game, or hints to turn off/on hints.')
194. move = input().lower()
195. if move == 'quit':
196. return 'quit'
197. if move == 'hints':
198. return 'hints'
The while loop will keep looping until the player has typed in a valid move. Lines 195 to 198 check if the player wants to quit or toggle hints mode, and return the string 'quit' or 'hints' , respectively. The lower() method is called on the string returned by input() so the player can type 'HINTS' or 'Quit' but still have the command understood.
The code that called getPlayerMove() will handle what to do if the player wants to quit or toggle hints mode.
200. if len(move) == 2 and move[0] in DIGITS1TO8 and move[1] in DIGITS1TO8:
201. x = int(move[0]) - 1.
202. y = int(move[1]) - 1.
203. if isValidMove(board, playerTile, x, y) == False:
The game is expecting that the player would have typed in the XY coordinates of their move as two numbers without anything between them. Line 200 first checks that the size of the string the player typed in is 2 . After that, it also checks that both move[0] (the first character in the string) and move[1] (the second character in the string) are strings that exist in DIGITS1TO8 .
Remember that the game board data structures have indexes from 0 to 7, not 1 to 8. The code prints 1 to 8 when the board is displayed in drawBoard() because non-programmers are used to numbers beginning at 1 instead of 0. So to convert the strings in move[0] and move[1] to integers, lines 201 and 202 subtract 1.
Even if the player typed in a correct move, the code still needs to check that the move is allowed by the rules of Reversi. This is done by isValidMove() which is passed the game board data structure, the player’s tile, and the XY coordinates of the move.
If isValidMove() returns False , then line 204’s continue statement executes. The execution will then go back to the beginning of the while loop and asks the player for a valid move again.
Otherwise, the player did type in a valid move and the execution needs to break out of the while loop.
208. print('That is not a valid move. Type the x digit (1-8), then the y digit (1-8).')
209. print('For example, 81 will be the top-right corner.')
If the if statement’s condition on line 200 was False , then the player didn’t type in a valid move. Lines 208 and 209 instructs them on how to correctly type in moves. Afterwards, the execution moves back to the while statement on line 192 because line 209 isn’t only the last line in the else-block, but also the last line in the while-block.
Finally, getPlayerMove() returns a two-item list with the XY coordinates of the player’s valid move.
Getting the Computer’s Move.
214. def getComputerMove(board, computerTile):
215. # Given a board and the computer's tile, determine where to.
216. # move and return that move as a [x, y] list.
217. possibleMoves = getValidMoves(board, computerTile)
getComputerMove() and is where the AI algorithm is implemented. Normally you use the results from getValidMoves() for hints mode. Hints mode will print '.' period characters on the board to show the player all the potential moves they can make.
But if getValidMoves() is called with the computer AI’s tile (in computerTile ), it will also find all the possible moves that the computer can make. The AI will select the best move from this list.
219. # randomize the order of the possible moves.
First, random. shuffle() will randomize the order of moves in the possibleMoves list. Why we want to shuffle the possibleMoves list will be explained later, but first let’s look at the algorithm.
Corner Moves are the Best Moves.
222. # always go for a corner if available.
223. for x, y in possibleMoves:
224. if isOnCorner(x, y):
First, line 223 loops through every move in possibleMoves . If any of them are on the corner, return that space is returned as the move. Corner moves are a good idea in Reversi because once a tile has been placed on the corner, it can never be flipped over. Since possibleMoves is a list of two-item lists, use multiple assignment in the for loop to set x and y .
If possibleMoves contains multiple corner moves, the first one is always used. But since possibleMoves was shuffled on line 220, it is random which corner move is first in the list.
Get a List of the Best Scoring Moves.
227. # Go through all the possible moves and remember the best scoring move.
228. bestScore = -1.
229. for x, y in possibleMoves:
230. dupeBoard = getBoardCopy(board)
231. makeMove(dupeBoard, computerTile, x, y)
232. score = getScoreOfBoard(dupeBoard)[computerTile]
233. if score > bestScore:
234. bestMove = [x, y]
235. bestScore = score.
236. return bestMove.
If there are no corner moves, loop through the entire list and find out which move results in the highest score. Line 229’s for loop will set x and y to every move in possibleMoves . bestMove is set to the highest scoring move the code has found so far, and bestScore is set to the best move’s score.
When the code in the loop finds a move that scores higher than bestScore , line 233 to 235 will store that move and score as the new values in bestMove and bestScore .
Simulate All Possible Moves on Duplicate Board Data Structures.
Before simulating a move, line 230 makes a duplicate game board data structure by calling getBoardCopy() . You’ll want a copy so you can modify without changing the real game board data structure stored in the board variable.
Then line 231 calls makeMove() , passing the duplicate board (stored in dupeBoard ) instead of the real board. This will simulate what would happen on the real board if this move was made. makeMove() will handle placing the computer’s tile and the flipping the player’s tiles on the duplicate board.
Line 232 calls getScoreOfBoard() with the duplicate board, which returns a dictionary where the keys are 'X' and 'O' , and the values are the scores.
For example, pretend that getScoreOfBoard() returns the dictionary and computerTile is 'X' . Then getScoreOfBoard(dupeBoard)[computerTile] would evaluate to ['X'] , which would then evaluate to 22 . If 22 is larger than bestScore , bestScore is set to 22 and bestMove is set to the current x and y values.
By the time this for loop is finished, you can be sure that bestScore is the highest possible score a move can make, and that move is stored in bestMove .
Line 228 first sets bestScore to -1 so that the first move the code checks will be set to the first bestMove . This will guarantee that bestMove is set to one of the moves from possibleMoves when it returns.
Even though the code always chooses the first in the list of these tied moves, it’s random because the list order was shuffled on line 220. This ensures that the AI won’t be predictable when there’s more than one best move.
Printing the Scores to the Screen.
239. def showPoints(playerTile, computerTile):
240. # Prints out the current score.
241. scores = getScoreOfBoard(mainBoard)
242. print('You have %s points. The computer has %s points.' % (scores[playerTile], scores[computerTile]))
showPoints() calls the getScoreOfBoard() function and then prints the player’s and computer’s scores. Remember that getScoreOfBoard() returns a dictionary with the keys 'X' and 'O' and values of the scores for the X and O players.
That’s all the functions for the Reversi game. The code starting on line 246 will implement the actual game and calls these functions as needed.
The Start of the Game.
246. print('Welcome to Reversi!')
249. # Reset the board and game.
250. mainBoard = getNewBoard()
252. playerTile, computerTile = enterPlayerTile()
253. showHints = False.
254. turn = whoGoesFirst()
255. print('The ' + turn + ' will go first.')
The while loop on line 248 is the main game loop. The program will loop back to line 248 when a new game starts. First get a new game board data structure by calling getNewBoard() and set the starting tiles by calling resetBoard() . mainBoard is the main game board data structure for the program. The call to enterPlayerTile() will let the player type in whether they want to be 'X' or 'O' . The return value is then stored in playerTile and computerTile using multiple assignment.
showHints is a Boolean value that determines if hints mode is on or off. It starts as off as False on line 253.
The turn variable is a string that either has the string value 'player' or 'computer' . It will keep track of whose turn it is. It is set to the return value of whoGoesFirst() , which randomly chooses who will go first.
Running the Player’s Turn.
258. if turn == 'player':
259. # Player's turn.
260. if showHints:
261. validMovesBoard = getBoardWithValidMoves(mainBoard, playerTile)
265. showPoints(playerTile, computerTile)
The while loop that starts on line 257 will keep looping each time the player or computer takes a turn. The execution will break out of this loop when the current game is over.
Line 258 has an if statement whose body has the code that runs if it is the player’s turn. (The else-block that starts on line 282 has the code for the computer’s turn.)
First the board is displayed on the screen. If hints mode is on (that is, showHints is True ), then the board data structure needs to have '.' period characters on every valid space the player could move.
The getBoardWithValidMoves() function does that. It is passed a game board data structure and returns a copy that also contains '.' period characters. Line 262 passes this board to the drawBoard() function.
If hints mode is off, then line 264 passes mainBoard to drawBoard() .
After printing out the game board to the player, you also want to print the current score by calling showPoints() on line 265.
266. move = getPlayerMove(mainBoard, playerTile)
Next, let the player type in their move. getPlayerMove() handles this, and its return value is a two-item list of the XY coordinate of the player’s move. getPlayerMove() has already made sure that the move the player typed in is a valid move.
Handling the Quit or Hints Commands.
267. if move == 'quit':
268. print('Thanks for playing!')
269. sys. exit() # terminate the program.
270. elif move == 'hints':
271. showHints = not showHints.
274. makeMove(mainBoard, playerTile, move[0], move[1])
If the player typed in the string 'quit' for their move, then getPlayerMove() would have returned the string 'quit' . In that case, line 269 calls the sys. exit() to terminate the program.
If the player typed in the string 'hints' for their move, then getPlayerMove() would have returned the string 'hints' . In that case, you want to turn hints mode on (if it was off) or off (if it was on).
The showHints = not showHints assignment statement on line 271 handles both of these cases, because not False evaluates to True and not True evaluates to False . Then the continue statement moves the execution to the start of the loop ( turn has not changed, so it will still be the player’s turn).
Otherwise, if the player didn’t quit or toggle hints mode, line 274 calls makeMove() to make the player’s move on the board.
Make the Player’s Move.
276. if getValidMoves(mainBoard, computerTile) == []:
279. turn = 'computer'
After making the player’s move, line 276 calls getValidMoves() to see if the computer could make any moves. If getValidMoves() returns a blank list, then there are no more valid moves that the computer could make. In that case, line 277 breaks out of the while loop and ends the game.
Otherwise, line 279 sets turn to 'computer' . The flow of execution skips the else-block and reaches the end of the while-block, so execution jumps back to the while statement on line 257. This time, however, it will be the computer’s turn.
Running the Computer’s Turn.
282. # Computer’s turn.
284. showPoints(playerTile, computerTile)
285. input('Press Enter to see the computer\'s move.')
286. x, y = getComputerMove(mainBoard, computerTile)
287. makeMove(mainBoard, computerTile, x, y)
After printing out the board with drawBoard() , also print the current score with a call to showPoints() on line 284.
Line 285 calls input() to pause the script while the player can look at the board. This is much like how input() was used to pause the program in the Jokes chapter. Instead of using a print() call to print a string before a call to input() , you can do the same thing by passing the string to print to input() .
After the player has looked at the board and pressed enter , line 286 calls getComputerMove() to get the XY coordinates of the computer’s next move. These coordinates are stored in variables x and y using multiple assignment.
Finally, pass x and y , along with the game board data structure and the computer’s tile, to the makeMove() function. This places the computer’s tile on the game board in mainBoard to reflect the computer’s move. Line 286’s call to getComputerMove() got the computer’s move (and stored it in variables x and y ). The call to makeMove() on line 287 makes the move on the board.
289. if getValidMoves(mainBoard, playerTile) == []:
292. turn = 'player'
Lines 289 to 292 are similar to lines 276 to 279. After the computer has made its move, line 289 checks if there exist any valid moves the human player can make. If getValidMoves() returns an empty list, then there are no valid moves. That means the game is over, and line 290 breaks out of the while loop.
Otherwise, there’s at least one possible move the player should make. The turn variable is to 'player' . There is no more code in the while-block after line 292, so execution loops back to the while statement on line 257.
Drawing Everything on the Screen.
294. # Display the final score.
296. scores = getScoreOfBoard(mainBoard)
297. print('X scored %s points. O scored %s points.' % (scores['X'], scores['O']))
298. if scores[playerTile] > scores[computerTile]:
299. print('You beat the computer by %s points! Congratulations!' % (scores[playerTile] - scores[computerTile]))
300. elif scores[playerTile] < scores[computerTile]:
301. print('You lost. The computer beat you by %s points.' % (scores[computerTile] - scores[playerTile]))
303. print('The game was a tie!')
Line 294 is the first line beyond the while-block that started on line 257. This code is executed when the execution breaks out of that while loop from line 290 or 277. At this point, the game is over. Now the program should print the board and scores and determine who won the game.
getScoreOfBoard() will return a dictionary with keys 'X' and 'O' and values of both players’ scores. By checking if the player’s score is greater than, less than, or equal to the computer’s score, you can know if the player won, lost, or tied, respectively.
Ask the Player to Play Again.
305. if not playAgain():
Call the playAgain() function, which returns True if the player typed in that they want to play another game. If playAgain() returns False , the not operator makes the if statement’s condition True , the execution breaks out of the while loop that started on line 248. Since there are no more lines of code after this while-block, the program terminates.
Otherwise, playAgain() has returned True (making the if statement’s condition False ), and so execution loops back to the while statement on line 248 and a new game board is created.
Changing the drawBoard() Function.
The board you draw for the Reversi game is large. But you could change the drawBoard() function’s code to draw out a much smaller board, while keeping the rest of the game code the same. The new, smaller board would look like this:
You have 8 points. The computer has 9 points.
Enter your move, or type quit to end the game, or hints to turn off/on hints.
Here is the code for this new drawBoard() function, starting at line 6. You can also download this code from invpy/reversi_mini. py .
6. def drawBoard(board):
7. # This function prints out the board that it was passed. Returns None.
9. print(' 12345678')
11. for y in range(8):
13. for x in range(8):
14. print(board[x][y], end='')
The AI may seem almost unbeatable, but this isn’t because the computer is smart. The strategy it follows is simple: move on the corner if you can, otherwise make the move that will flip over the most tiles. We could do that, but it would be slow to figure out how many tiles would be flipped for every possible valid move we could make. But calculating this for the computer is simple. The computer isn’t smarter than us, it’s just much faster!
This game is similar to Sonar because it makes use of a grid for a board. It is also like the Tic Tac Toe game because there’s an AI that plans out the best move for it to take. This chapter only introduced one new concept: that empty lists, blank strings, and the integer 0 all evaluate to False in the context of a condition.
Other than that, this game used programming concepts you already knew! You don’t have to know much about programming to create interesting games. However, this game is stretching how far you can get with ASCII art. The board took up almost the entire screen to draw, and the game didn't have any color.
Later in this book, we will learn how to create games with graphics and animation, not just text. We will do this using a module called Pygame, which adds new functions and features to Python so that we can break away from using only text and keyboard input.

ريفيرسي / الاستراتيجية.
لعبة القطع الوجه بسرعة جدا، بسهولة و (في كثير من الأحيان) مرارا وتكرارا، لذلك يوفر ميزة صغيرة - وفي الواقع يصبح عادة غير مؤات - في محاولة لكسب غالبية القطع في وقت مبكر من اللعبة. الزوايا، والتنقل، واللعب الحافة، والتكافؤ، واللعب نهاية المباراة ونظرة إلى الأمام تشكل العناصر الرئيسية لاستراتيجية عطيل ناجحة.
الشكل 1 تخطيط المجلس.
اللعبة لديها 8x8 الساحات مع موقف البداية هو مبين. كل مربع له اسم (أعلى الزاوية اليسرى مربع هو a1).
الشكل 2 الساحات المذكورة.
هناك بعض المربعات اللاعبين اسمه:
مواقف الزاوية، مرة واحدة لعبت، لا تزال في مأمن من التقليب لبقية اللعبة: وبالتالي يمكن للاعب استخدام قطعة في زاوية من المجلس إلى مرساة مجموعات من القطع (بدءا من الحواف المجاورة) بشكل دائم. لذلك فإن التقاط زاوية غالبا ما يثبت استراتيجية فعالة عندما تنشأ الفرصة. وبشكل عام، تكون القطعة مستقرة عندما تكون، في كل الاتجاهات الأربعة، على حدود، في صف مملوء، أو بجوار قطعة مستقرة من نفس اللون.
فإن الخصم يلعب مع استراتيجية معقولة لن تتخلى بسهولة الزاوية أو أي تحركات جيدة أخرى. لذلك لتحقيق هذه التحركات الجيدة، يجب إجبار خصمك للعب التحركات التي تتخلى عن تلك التحركات الجيدة. أفضل طريقة لتحقيق ذلك ينطوي على الحد من عدد من التحركات المتاحة لخصمك. إذا كنت تقيد باستمرار عدد التحركات القانونية خصمك يمكن أن تجعل، ثم عاجلا أو آجلا سيكون لديهم لجعل خطوة غير مرغوب فيها. وضع مثالي ينطوي على وجود كل ما تبذلونه من القطع في وسط محاطة قطع الخصم الخاص بك. في مثل هذه الحالات يمكنك تملي ما يتحرك خصمك يمكن أن تجعل.
عندما يتحرك يبدو متساويا فيما يتعلق ما يتحرك سوف تترك نفسك وخصمك، ولعب استراتيجية الحد الأدنى قطعة سوف تميل إلى الاستفادة لك، لأن التقليل من الأقراص الخاصة بك سوف تميل إلى ترك عدد أقل من الأقراص لخصمك على الوجه في التحركات اللاحقة من اللعبة. لا ينبغي للمرء أن تلعب استراتيجية القرص الحد الأدنى إلى أقصى حد، ولكن هذا أيضا يمكن أن يؤدي بسرعة إلى عدم التنقل.
في حين لعب القطع إلى حواف المجلس قد تبدو سليمة (لأنها لا يمكن أن انقلبت بسهولة)، وهذا يمكن أن غالبا ما يضر. حافة قطع يمكن مرساة تقلب التي تؤثر التحركات إلى جميع مناطق المجلس. وبسبب ذلك، وهذا يمكن، عاجلا أم آجلا، والسم في وقت لاحق يتحرك التي تقوم بها عن طريق التسبب لك على الوجه الكثير من القطع وفتح العديد من التحركات لخصمك. ولكن في بعض الأحيان اللعب إلى حافة حيث خصمك لا يمكن أن تستجيب بسهولة لترك ذلك الخصم مع عدد أقل بكثير التحركات المتاحة.
مربع على الفور متاخمة قطريا إلى الزاوية (وتسمى X - مربع)، عندما لعبت في المباراة المبكرة أو المتوسطة، وعادة ما يضمن فقدان تلك الزاوية. اللعب إلى الساحات حافة المجاورة للزاوية يمكن أن تؤدي عادة إلى الفخاخ التكتيكية التي تنطوي على التضحية زاوية واحدة، أو ببساطة لعب خارج الحافة في تسلسل معين.
بشكل عام يجب تجنب اللعب الحافة في اللعبة المبكرة والمتوسطة إذا كان ذلك ممكنا، إلا إذا كنت يمكن الحصول على تنازلات أكبر من حيث التنقل أو كتلة من القطع غير مؤكد.
مع تقدم اللعب، ومناطق المجلس وعادة ما قسم أنفسهم قبالة حيث لا يمكن لأي طرف منع الآخر من اللعب بشكل تعسفي في تلك المناطق. ببساطة عن طريق عد عدد المربعات في المنطقة، يمكن للمرء أن يتأكد مما إذا كان عدد فردي أو عدد من المربعات موجودة. في حالة وجود عدد فردي من المربعات، من خلال اللعب هناك أولا يمكنك فرض خصمك للعب أولا خارج تلك المنطقة. كنت حققت هذا ببساطة عن طريق اللعب في تلك المنطقة في أي وقت كان لديه عدد فردي من المربعات المتاحة، وعدم اللعب فيه عندما يتميز عدد من المربعات. إذا أخذت بعين الاعتبار مربعات معينة في منطقة تبدو خطيرة جدا (مثل مربع X أو مربع حافة يؤدي إلى فخ واضح) ثم يمكنك إما فرض خصمك للعب في أي مكان آخر أو لاحتلال واحدة من هذه المربعات الخطرة.
كما هو الحال في أي استراتيجية جيدة للشطرنج أو لعبة الداما، لاعب يجب أن لا تنظر إلا في الوضع الحالي على متن الطائرة. لكل خطوة عليك أن تنظر، يجب عليك النظر في الردود المحتملة من خصمك، ثم الردود اللاحقة سوف تجعل لتلك التحركات وهلم جرا. قد لا تظل جوانب الموقف الحالي ذات صلة بضع خطوات وبالتالي. لذلك عند تحسين التنقل الخاص بك، والحصول على زوايا أو أي شيء آخر، يجب عليك أن تنظر في أفضل السبل للقيام بذلك على المدى الطويل بدلا من مجرد الخطوة التالية.
في نهاية المباراة (آخر 20 أو نحو ذلك التحركات من اللعبة) الاستراتيجيات سوف تتغير عادة. تقنيات خاصة مثل الكنس، والحصول على الوصول، وتفاصيل نقل النظام يمكن أن يكون لها تأثير كبير على نتائج المباراة. في هذه المراحل المتأخرة من اللعبة لا توجد قواعد الصعب تعيين. سوف لاعب من ذوي الخبرة محاولة للنظر إلى الأمام والحصول على الشعور بما سيؤدي إلى أفضل نتيجة النهائية.

Reversi strategy code


سحب طلبات 0.
تاريخ جيثب اليوم.
جيثب هي موطن لأكثر من 20 مليون مطورين يعملون معا لاستضافة ومراجعة التعليمات البرمجية، وإدارة المشاريع، وبناء البرمجيات معا.
استنساخ مع هتبس.
استخدام جيت أو الخروج مع سفن باستخدام ورل على شبكة الإنترنت.
#Reversi (Othello) Strategy Explorer.
##Purpose The purpose of this program is to explore strategies for the game of reversi (more popularly known by the brand name Othello). Reversi is a game played between two players which has a very large game tree of all positions (somewhere around 10 28 positions). Since the game tree would be so large, it is infeasible to find a complete strategy, therefore the game tree may be expanded and searched according to heuristic utility functions.
##GIF This is an animation of the actual program running. It consists of two computer players, white playing the greedy strategy and black playing a weighted strategy of 10 for corners, 4 for edges, and 1 for interior pieces.
##Notes The board structure makes use of numpy arrays for efficient and convenient indexing - as written all the code should be relatively efficient, straightforward, and extensible.
Contains an enumeration specifying the two possible colors that may be played.
Contains the actual game logic that allows two players to progress through the game against one another.
This library graphics. py is a simple wrapper on TKinter.
Sets up the window object and managed drawing a board / refreshing the current board in the window.
Contains the heuristic definitions to be used in navigating and expanding the game tree.
This is the main content of this program as it handles the game board and pieces as well as the logic for determining a positions validity and making a move.
This is a helper class for generating particular weightings to be used with the weighted sum heuristic.
##Licensing Do what you want but let me know if you want to do something really cool and needs some helpz.
&نسخ؛ 2018 جيثب، Inc. شروط الخصوصية تعليمات حالة الأمان.
لا يمكنك تنفيذ هذا الإجراء في الوقت الحالي.
لقد سجلت الدخول باستخدام علامة تبويب أو نافذة أخرى. أعد التحميل لتحديث الجلسة. لقد سجلت الخروج في علامة تبويب أو نافذة أخرى. أعد التحميل لتحديث الجلسة.

No comments:

Post a Comment