إنشاء لعبة تيك تاك تو بلغة C++

Ansha L Bt Tyk Tak Tw Blght C



Tic-tac-toe هي لعبة مثيرة للاهتمام وقديمة وكلاسيكية استمتعت بها الأجيال. في لعبة تيك تاك تو، يتنافس لاعبان على شبكة مكونة من 9 مربعات تتميز بنمط التجزئة. يأخذ كل لاعب دوره ويضع الرمز (O أو X) في أحد المربعات الفارغة. في هذه المقالة، سنستكشف كيفية إنشاء لعبة tic-tac-toe بلغة البرمجة C++. سيرشدك المثال التالي خلال إنشاء لعبة tic-tac-toe بسيطة ولكنها جذابة، وتغطي المفاهيم الأساسية وتفاصيل التعليمات البرمجية والاعتبارات الخاصة بإنشاء تجربة ألعاب تفاعلية.

إنشاء لعبة Tic-Tac-Toe بلغة C++

يوفر المثال التالي أساسيات إنشاء لعبة tic-tac-toe التفاعلية للاعبين. إنه يعرض أسلوبًا بسيطًا وسهلاً لبرمجته باستخدام C++ ويوفر كود مصدر موثق جيدًا لاستعادة تحديات الطفولة مع الأصدقاء بتنسيق رقمي جديد. دعونا نرى الكود التالي.

مثال: Tic-Tac-Toe الأساسي القائم على وحدة التحكم دون استخدام المصفوفة ثنائية الأبعاد

في هذا المثال، سوف نستخدم مصفوفة ثنائية الأبعاد ووظائف وشروط if-else لإنشاء لعبة tic-tac-toe في لغة C++. في هذه اللعبة، يُسمح للاعبين بالتناوب في إدخال تحركاتهم، وتحدد حالة اللعبة عن طريق التحقق من الفائز أو التعادل. انظر الكود المعطى التالي:







#تشمل

استخدام اسم للمحطة ;

فارغ drawBoard ( شار سبورة [ 3 ] [ 3 ] ) ;

المنطق هو نقل صالح ( شار سبورة [ 3 ] [ 3 ] , كثافة العمليات صف , كثافة العمليات العقيد ) ;

منطقي isBoardFull ( شار سبورة [ 3 ] [ 3 ] ) ;

شار com.checkWinner ( شار سبورة [ 3 ] [ 3 ] ) ;

كثافة العمليات رئيسي ( ) {

شار سبورة [ 3 ] [ 3 ] = { { '' , '' , '' } , { '' , '' , '' } , { '' , '' , '' } } ;

كثافة العمليات صف , العقيد ;

شار com.currentPlayer = 'X' ;

بينما ( حقيقي ) {

drawBoard ( سبورة ) ;

cout << 'لاعب ' << com.currentPlayer << ' دور. أدخل الصف (1-3) والعمود (1-3): ' ;

يتناول الطعام >> صف >> العقيد ;

صف --;

العقيد --;

لو ( isMoveValid ( سبورة , صف , العقيد ) ) {

سبورة [ صف ] [ العقيد ] = com.currentPlayer ;

شار الفائز = com.checkWinner ( سبورة ) ;

لو ( الفائز != '' ) {

drawBoard ( سبورة ) ;

cout << 'لاعب ' << الفائز << 'فائز! ' ;

استراحة ;

}

لو ( com.isBoardFull ( سبورة ) ) {

drawBoard ( سبورة ) ;

cout << 'إنها ربطة عنق! ' ;

استراحة ;

}

com.currentPlayer = ( com.currentPlayer == 'X' ) ؟ 'يا' : 'X' ;

} آخر {

cout << 'نقل غير صالح. اختر خلية أخرى. ' ;

} }

يعود 0 ;

}

فارغ drawBoard ( شار سبورة [ 3 ] [ 3 ] ) {

cout << 'ب| \ ر 1 \ ر | \ ر 2 \ ر | \ ر 3 \ ر | ' ;

cout << ' ______________________ ' ;

ل ( كثافة العمليات م = 0 ; م < 3 ; م ++ ) {

cout << م + 1 << '| ' ;

ل ( كثافة العمليات ر = 0 ; ر < 3 ; ر ++ ) {

cout << '' << سبورة [ م ] [ ر ] ;

لو ( ر < 2 ) cout << ' \ ر | \ ر ' ;

}

cout << ' \ ر | ' ;

لو ( م < 2 ) cout << ' ______________________ ' ;

}

cout << ' ' ; }

المنطق هو نقل صالح ( شار سبورة [ 3 ] [ 3 ] , كثافة العمليات صف , كثافة العمليات العقيد ) {

يعود ( صف >= 0 && صف < 3 && العقيد >= 0 && العقيد < 3 && سبورة [ صف ] [ العقيد ] == '' ) ;

}

منطقي isBoardFull ( شار سبورة [ 3 ] [ 3 ] ) {

ل ( كثافة العمليات م = 0 ; م < 3 ; م ++ ) {

ل ( كثافة العمليات ر = 0 ; ر < 3 ; ر ++ ) {

لو ( سبورة [ م ] [ ر ] == '' ) {

يعود خطأ شنيع ;

} } }

يعود حقيقي ; }

شار com.checkWinner ( شار سبورة [ 3 ] [ 3 ] ) {

ل ( كثافة العمليات م = 0 ; م < 3 ; م ++ ) {

لو ( سبورة [ م ] [ 0 ] == سبورة [ م ] [ 1 ] && سبورة [ م ] [ 1 ] == سبورة [ م ] [ 2 ] && سبورة [ م ] [ 0 ] != '' ) {

يعود سبورة [ م ] [ 0 ] ;

}

لو ( سبورة [ 0 ] [ م ] == سبورة [ 1 ] [ م ] && سبورة [ 1 ] [ م ] == سبورة [ 2 ] [ م ] && سبورة [ 0 ] [ م ] != '' ) {

يعود سبورة [ 0 ] [ م ] ;

} }

لو ( سبورة [ 0 ] [ 0 ] == سبورة [ 1 ] [ 1 ] && سبورة [ 1 ] [ 1 ] == سبورة [ 2 ] [ 2 ] && سبورة [ 0 ] [ 0 ] != '' ) {

يعود سبورة [ 0 ] [ 0 ] ;

}

لو ( سبورة [ 0 ] [ 2 ] == سبورة [ 1 ] [ 1 ] && سبورة [ 1 ] [ 1 ] == سبورة [ 2 ] [ 0 ] && سبورة [ 0 ] [ 2 ] != '' ) {

يعود سبورة [ 0 ] [ 2 ] ;

}

يعود '' ;

}

وفيما يلي تفصيل لوظائفه:



'#include ' هو توجيه مسبق للمعالج يتضمن مكتبة دفق الإدخال/الإخراج لعمليات الإدخال/الإخراج. يتيح استخدام 'مساحة الاسم std' الاستخدام المباشر لوظائف cout وcin وما إلى ذلك في برنامج C++، دون الحاجة إلى 'std:: prefix'.



هناك أربعة نماذج أولية للوظائف في هذا البرنامج - وهي drawBoard() وisMoveValid() وisBoardFull() وcheckWinner(). يُعرف إعلان الوظيفة بالنموذج الأولي للوظيفة. على الرغم من أنها تأتي بعد الوظيفة الرئيسية في البرنامج، إلا أنه سيتم استخدامها. تحتوي الوظيفة الرئيسية على حلقة اللعبة والمنطق لإدارة أدوار اللاعبين وحركاتهم. ضمن الوظيفة الرئيسية، تتم تهيئة لوحة اللعبة بمسافات.





شار سبورة [ 3 ] [ 3 ] = { { '' , '' , '' } , { '' , '' , '' } , { '' , '' , '' } } ;

بعد ذلك، يتم تحديد متغيرين للصف والعمود لتخزين مدخلات حركة اللاعب. 'شار currentPlayer = 'X'؛' يحدد أن اللاعب 'X' يذهب أولاً.

الآن، تبدأ حلقة اللعبة بينما (الحقيقية)، وتستمر حتى يكون هناك فائز أو تعادل. تستدعي حلقة 'while' هذه 'drawBoard ()؛' لعرض اللوحة. بعد عرض اللوحة على وحدة التحكم، يُطلب من المستخدم اختيار خلية لوضع علامة عليها في بيان الكود التالي:



cout << 'لاعب ' << com.currentPlayer << ' دور. أدخل الصف والعمود (1-3): ' ;

يقوم اللاعب بإدخال حركته في 'cin >> Row >> col;'.

عند تحديد خلية لوضع علامة عليها، سيقوم البرنامج أولاً بالتحقق من صحة الإدخال، مما يضمن عدم ملء الخلية بالفعل عن طريق استدعاء الدالة isMoveValid().

سبورة [ صف ] [ العقيد ] = com.currentPlayer ;

يضع هذا البيان علامة اللاعب على السبورة.

شار الفائز = com.checkWinner ( سبورة ) ;

لو ( الفائز != '' ) {

drawBoard ( سبورة ) ;

cout << 'لاعب ' << الفائز << ' يفوز! ' ;

تتحقق هذه البيانات من الفائز في كل مرة يقوم فيها اللاعب بوضع علامة على الإدخال على اللوحة. سيتم الإعلان عن اسم الفائز في حالة وجود فائز، وسيخرج البرنامج من حلقة اللعبة.

لو ( com.isBoardFull ( سبورة ) ) {

هذا البيان يتحقق من وجود التعادل. تحدث حالة التعادل في حالة امتلاء اللوحة وعدم وجود فائز. في هذه الحالة، 'إنها ربطة عنق!' تتم طباعتها على الشاشة.

com.currentPlayer = ( com.currentPlayer == 'X' ) ؟ 'يا' : 'X' ;

يقوم هذا البيان بتبديل اللاعبين لمنح كل لاعب فرصة للعب دوره.

cout << 'نقل غير صالح. اختر خلية أخرى. ' ;

إذا كانت النقلة غير صالحة، فسيُطلب من المستخدم الإدخال مرة أخرى واختيار أي خلية أخرى.

بعد الوظيفة 'الرئيسية'، ستبدأ تعريفات الوظائف للنماذج الأولية للوظائف التي تم الإعلان عنها مسبقًا. الوظيفة الأولى التي تم تعريفها هنا هي drawBoard() والتي تُستخدم لرسم لوحة tic-tac-toe إلى وحدة التحكم. تقوم الدالة drawBoard() بطباعة الحالة الحالية للوحة، بما في ذلك خطوط الشبكة.

الوظيفة التالية التي تم تعريفها هنا هي isMoveValid(). تُستخدم هذه الوظيفة لتحديد ما إذا كان النقل مسموحًا به داخل اللوحة وفي خلية فارغة. يتم استخدام الدالة isBoardFull() للتحقق مما إذا كانت اللوحة ممتلئة أم لا. هذا شرط لحالة التعادل عندما لا يكون هناك فائز. يتحقق isBoardFull() من امتلاء جميع المواضع على اللوحة مما يشير إلى التعادل إذا لم يكن هناك فائز. إذا كان هناك فائز، فيمكن التأكد منه باستخدام الدالة checkWinner(). يتحقق checkWinner() من جميع الأسطر الفائزة المحتملة لنفس علامة اللاعب ('X' أو 'O') ويعيد علامة اللاعب الفائز إذا تم العثور عليها أو حرف المسافة '' إذا لم يكن هناك فائز حتى الآن. وفيما يلي إخراج البرنامج. ويظهر كل منعطف من كل لاعب.

أولاً، اللوحة واضحة؛ يُطلب من اللاعب 'X' اختيار الخلية المراد وضع علامة عليها. هنا، يقوم اللاعب 'X' بإدخال 2 و2. تم وضع علامة على خلايا الصف 2 والعمود 2. راجع اللوحة المميزة في ما يلي:

والآن جاء دور اللاعب O. يُطلب من اللاعب اختيار خلية ليتم وضع علامة عليها. يختار اللاعب 'O' رقم 1 للصف و1 للعمود. تم وضع علامة على الخلية المختارة للمشغل 'O' كما هو موضح في مقتطف الإخراج التالي:

ستتبع جميع الأدوار لكل لاعب نفس النمط. إنه دور اللاعب X، ويختار اللاعب 1 للصف و2 للعمود. الرجوع إلى لقطات الإخراج المعطاة التالية:

والآن الدور على اللاعب 'O'. يختار اللاعب 1 للصف و3 للعمود.

المنعطف التالي هو مرة أخرى على اللاعب 'X'. يختار اللاعب 3 للصف و1 للعمود.

يختار اللاعب 'O' 3 للصف و2 للعمود.

يقوم اللاعب 'X' باختيار الصف الثاني والعمود الثالث.

يقوم اللاعب 'O' الآن بتحديد الصف الثاني والعمود الأول.

يختار اللاعب 'X' الصف الثالث والعمود الثالث هذه المرة.

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

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

خاتمة

يعد تطوير لعبة tic-tac-toe باستخدام لغة C++ تمرينًا عمليًا ممتازًا لتعزيز مهاراتك في البرمجة. تشرح المقالة بدقة كيفية إنشاء tic-tac-toe في لغة C++. تشتمل الإرشادات خطوة بخطوة الواردة في هذه المقالة على مصفوفة ثنائية الأبعاد ووظائف وشروط أخرى للقراء لفهم آليات اللعبة وتفاعلات المستخدم وهيكلة التعليمات البرمجية الفعالة. إن الإرشادات المفصلة للكود وشرح الوظائف التي تعتبر حاسمة في طريقة اللعب الأساسية تزود القراء برؤى لا تقدر بثمن في كل من ممارسات برمجة C++ وتعقيدات تطوير اللعبة البسيطة.