ساخت بازی دوز با پایتون – از صفر تا صد + کد آماده


شاید تا الان بارهای بازی دوز را بازی کردهاید. اما آیا برای پیادهسازی این بازی با زبان برنامه نویسی پایتون تلاش کردهاید؟ بازی دوز یکی از محبوبترین و مشهورترین بازیهای ساده، دو نفره و تقریبا مشهور در سراسر جهان است. در این مطلب از مجله فرادرس، ساخت بازی دوز با پایتون را به صورت کامل به عنوان پروژه تمرینی پیادهسازی کردهایم. برای اینکار از تمام دانش پایتونی که تا به اینجا بدست آوردهایم استفاده خواهیم کرد. بازی دوز، بازی دونفره است که بر بروی صفحه ۳*۳ بازی میشود. هر بازیکنی بین X و O انتخاب میکند. بازیکن اول علامت X را بر روی یکی از خانههای خالی صفحه بازی رسم میکند و بازیکن دوم بعد از او علامت O را بر روی یکی دیگر از خانههای صفحه بازی رسم میکند. این کار تا زمانی اتفاق میافتد که بازیکنی بتواند خط کاملی را بر روی صفحه بازی رسم کند و برنده شود در غیر این صورت بازی بهصورت مساوی به پایان میرسد.
در این مطلب درباره ساخت بازی دوز با پایتون صحبت میکنیم. در ابتدا فرایند این کار را بررسی کرده و سپس شروع به پیادهسازی بازی دوز میکنیم. فرایند پیادهسازی را نیز به دو مرحله ساخت صفحه بازی و افزودن منطق بازی تقسیم کردهایم. در هر مرحله همراه با توضیحات کدهای مربوطه را نیز نمایش دادهایم.
فرایند ساخت بازی دوز با پایتون چیست؟
برای پیادهسازی این پروژه پایتونی، از تمام دانش آموخته خود تا به اینجا استفاده میکنیم و مرحله به مرحله فرایند ساخت بازی دوز با پایتون را با نمایش کد و مثال نشان دادهایم. برای اجرای این پروژه مراحل ساخت بازی دوز را به صورت مرحله به مرحله، جداگانه تقسیم کردهایم تا درک فرایند ساخت بازی به صورت موازی را آسانتر کنیم. فرایند ساخت بازی دوز در پایتون به صورت کلی شامل موارد فهرست شده در زیر میشود.
- درک روش اجرای بازی دوز در پایتون
- ساخت صفحه بازی
- ساخت دکمههای بازی
- افزودن منطق بازی
- تشخیص برنده و مساوی بازی
- تعبیه دکمهای برای بازگرداندن بازی به حالت اولیه
پیادهسازی بازیها با پایتون به غیر از نوعی تمرین کدنویسی و طراحی الگوریتم بسیار خوب و جنبه سرگرمی که دارد، باعث آشنایی با تکنولوژیهای مختلف نیز میشود. یکی دیگر از بهترین تمرینها در این زمینه پیادهسازی بازی منچ است. برای آموزش و مشاهده یکی از تکنیکهای خوب برای پیادهسازی منچ در پایتون مطلب آموزش ساخت بازی منچ با پایتون، به زبان ساده و همراه با کد را مطالعه کنید.

بازی دوز در پایتون که با نامهای هیچها و صلیبها یا X و O نیز شناخته میشود، بازی ساده دونفرهای است که در آن هر کدام از بازیکنها برای انتخاب X و O آزاد هستند. این بازی بر روی صفحه سه در سهای انجام میگیرد که مجموعا ۹ خانه دارد. به نوبت هر بازیکنی این فرصت را دارد که نماد مربوط به خود را در یکی از خانههای خالی صفحه بازی رسم کند. به محض اینکه یکی از بازیکنان موفق به رسم خط صافی با نماد خودش به صورت عمودی، افقی یا قطری شد یعنی که بازیکن مورد نظر برنده بازی شده است. اما اگر همه خانههای بازی پُر از علامت شدند و هیج خطی رسم نشده بود، درنتیجه بازی به صورت مساوی به پایان میرسد.
روش اجرای بازی دوز در پایتون
در بازی دوزی که میخواهیم بسازیم به دو بازیکن نیاز خواهیم داشت. این بازیکنان علامتهای مورد نظر خود را انتخاب میکنند. این علامتهای مورد استفاده در بازی دوز X و O هستند. دو بازیکن علامتهای X و O را بر روی فضای ۳*۳ با ۹ خانه خالی مطابق شکل زیر رسم میکنند.

بازی با رسم اشکال X و O بر روی خانههای خالی صفحه بازی توسط بازیکنان اجرا میشود. بازیکنی که علامت X را انتخاب کند بازی را شروع میکند و بعد از آن نوبت به بازیکن بعدی میرسد که علامت O را بر روی خانهی خالی از صفحه بازی رسم کند. و به همین ترتیب تا رسیدن به نتیجه به نوبه خانههای صفحه بازی را با علامتها مختص خود پُرمیکنند.
در ساخت بازی دوز با پایتون از یکی از کتابخانههای گرافیکی پایتون به نام Tkinter استفاده میکنیم. کتابخانه Tkinter یکی از پکیج های گرافیکی یا GUI استاندارد پایتون است که به صورت خودکار، همزمان با نصب پایتون بر روی سیستم نصب میشود. البته در بعضی از موارد خاص شاید لازم باشد خودمان مسئولیت نصب Tkinter را بر روی کامپیوتر بر عهده بگیریم.
در صورتی که نسبت به کار با کتابخانه گرافیکی پایتون به نام Tkinter نا آشنا باشید و تمایل به یادگیری این کتابخانه دارید با مراجعه به فیلم آموزشی آموزش پروژه محور کتابخانه Tkinter در پایتون از وبسایت آموزشی فرادرس، تا حد بسیار خوبی بر توابع و تکنیکهای کاربردی این کتابخانه استاندارد پایتون مسلط میشوید.
در این پروژه فقط نیاز به وارد کردن دو تا از ماژول های پایتون داریم.
در ادامه به تعریف توابعی پرداختهایم که به کمک آنها فرایند اجرای پروژه را بدون روبهرو شدن با خطایی میتوانیم به سرانجام برسانیم. کلمه کلیدی pass نقش «نگهدارنده فضای خالی» (Placeholder) را بازی میکند. این کلمه کلیدی به برنامه نویسان کمک میکند که بدون نوشتن کد خاصی در توابع به ریختن طرح کلی پروژه بپردازند.
افزایش مهارت های کار با پایتون با کمک فرادرس
در صورتی که نسبت به زبان برنامهنویسی پایتون آشنایی کمی دارید و علاقهمند به شروع آموزش این زبان برنامهنویسی قدرتمند و انعطافپذیر هستید میتوانید از فیلم آموزش رایگان پایتون در ۱۴۰ دقیقه فرادرس استفاده کنید. اما اگر مراحل مقدماتی و آشنایی نسبتا ابتدایی با این زبان برنامهنویسی را پشت سر گذاشتهاید، بهتر است که به سراغ فیلمهای آموزشی تخصصی پایتون در فرادرس بروید.

وبسایت آموزشی فرادرس، فیلمهای بسیار خوب و با کیفیتی را برای آموزش مفاهیم سطح بالای زبان پایتون تهیه کرده است که چند مورد را در ادامه فهرست کردهایم.
- فیلم آموزش برنامه نویسی پایتون همراه با مثال های عملی در Python فرادرس
- فیلم آموزش برنامه نویسی شی گرا در پایتون از فرادرس
- فیلم آموزش برنامه نویسی پایتون پیشرفته و ترفندهای Python در فرادرس
- فیلم آموزش کاربرد ChatGPT در برنامه نویسی پایتون با فرادرس
برای مشاهده گزینههای بیشتر میتوانید به وبسایت فرادرس مراجعه کنید یا با کلیک بر روی تصویر بالا به صورت مستقیم به صفحه مخصوص فیلمهای آموزش زبان برنامهنویسی پایتون رفته و هر کدام از فیلمهای مورد نیاز خود را مشاهده کنید.
مرحله اول ساخت صفحه بازی
اولین مرحله ساخت بازی دوز با پایتون، مرحله سنگین کار با کتابخانه Tkinter است. زیرا کتابخانه Tkinter شکل صفحه بازی و عملکرد آن را تعیین میکند.
صفحه بازی را به عنوان نمونهای از کلاس چهاچوب مخصوص tkinter تعریف میکنیم. کدنویسی این عملیات را با عبارت board = Tk() انجام میدهیم. با استفاده از قطعه کد board.title("Tic-Tac-Toe") در برنامه تیتر مناسبی نیز برای صفحه بازی انتخاب میکنیم.
تعریف نماد برای ساخت بازی دوز با پایتون
مرحله بعدی ساخت لیستی از کاراکترها است. در لیستی که تعریف کردیم حروف الفبای X و O را قرار دادهایم. قطعه کد مربوط به تعریف لیست به شکل characters = ["x", "o"] است. سپس خط کد board.mainloop() را به پایین فایل کدهای خود اضافه میکنیم. این قطعه کد به عنوان آخرین خط در کدها باقی خواهد ماند. دستور board.mainloop()صحفه بازی را باز و آماده شنیدن دستورات نگهمیدارد.
در این لحظه از زمان کدهای نوشته شده به شکل زیر خواهند بود.
در مرحله بعدی به تعریف متغیر بازیکن خواهیم پرداخت. این متغیر تعیین میکند که الان برای بازی نوبت کدام بازیکن است. متغیر بازیکن از ماژول Random در پایتون برای تعیین بازیکن شروع کننده بازی به صورت تصادفی استفاده میکند. کد مربوط به این عملیات به صورت player = random.choice(characters) است.

دکمهها را با کمک آرایه دوبعدی یا لیستی از لیستها ایجاد میکنیم. از آنجا که هنوز برای دکمههای صفحه بازی، هیچ مقداری مشخص نشده است، باید مقدار مربوط به فضای خالی را به هر دکمه تخصیص بدهیم. فرق خاصی نمیکند، در صورتی که این برنامه را برای خودتان بازنویسی میکنید نیازی به تخصیص فضای خالی به اجبار برای دکمهها نیست. به عنوان مقدار اولیه میتوانید هر مقدار مد نظرتان را به این دکمههای آرایه دو بعدی اختصاص دهید. در ادامه مراحل بازی همزمان با انتخاب بازیکنان مقادیر جدید را به این دکمهها اختصاص خواهیم داد.
در ادامه میخواهیم نوار مربوط به وضعیت را ایجاد کنیم. در این نوار به بازیکنان میگوییم که الان نوبت کیست و دکمهای را نیز برای شروع بازی جدید قرار خواهیم داد. «نوار وضعیت» (Status Bar) را با استفاده از ویجت برچسبهای کتابخانه tkinterایجاد میکنیم.
ساخت دکمه بازی جدید شبیه به کدی خواهد بود که در ادامه آمده است. عبارت command=restart در این کد، فرمانی است که با کلیک هر بازیکن بر روی دکمه در هر زمان، بازی جدیدی را شروع میکند.
همچنین به ساختن چهارچوبی برای تخصیص دادن هر دکمه به محل صحیح قرارگیری آن بر روی صفحه نیاز داریم. با استفاده از کد زیر چهارچوب مورد نیاز را ایجاد میکنیم.
در نهایت صفحه ایجاد شده شبیه به تصویر زیر خواهد بود.

ساخت دکمه های بازی
الان زمان ساختن دکمهها است. ساختن دکمهها نیاز به استفاده از حلقههای تودرتو دارد. حلقه خارجی ایندکس ردیفها را مشخص میکند و حلقه داخلی ایندکس مربوط به ستون را در آرایه دو بعدی گفته شده تعریف میکند. بلاک کدی که درون حلقهها قرار دارد دکمهها را ایجاد میکند، ویژگیهای ضروری را به آنها تخصیص میدهد و آنها را به صفحه بازی اضافه میکند. دکمهها حاوی دو تابع هستند. تابع اول از جنس توابع lambda است که ایندکس مربوط به سطر و ستون خود را به متغیرهایی با نام row و column اختصاص میدهد. خروجی این توابع را میتوان به تابع دوم یعنی next_turn() ارسال کرد.
حلقههای دورنی و بیرونی به صورت هاردکد به اندازه ۳ پیمایش محدود شدهاند. زیرا سطرها و ستونهای صفحه شامل ۳ مربع در هر کدام هستند. هر سطر و ستون با ایندکس صِفر شروع میشود.
در پایین کدهای مربوط به بلاک حلقهها را پیادهسازی کردهایم.
در پایانِ عملیاتِ ایجاد صفحه بازی در پروژه ساخت بازی دوز با پایتون، کد نوشته شده به شکل آمده در پایین است.
و صفحه بازی ساخته شده نیز به شکل زیر است.

مرحله دوم افزودن منطق بازی
تابع next_turn() که در بلاک کد درون حلقههای تودرتو تعریف شده بود اولین تابعی منطقی است که در این بخش تعریف کردهایم.
در صورت علاقهمند بودن به مطالعه بیشتر درباره حلقههای پایتونی، میتوانید با مراجعه به مطلب «تکرارها و حلقه ها» (Iterations and Loops) در پایتون به زبان ساده از مجله فرادرس اطلاعات بیشتری نیز کسب کنید.

هدف تابع ()next_turn() بررسی پیروز شدن یکی از بازیکنان است. اگر هیچ کدام از بازیکنان پیروز نشده بود، پس نوبت به حرکت بازیکن بعدی میرسد. اما این تابع چگونه کار میکند؟ نباید فراموش کنیم که پارامترهای سطر و ستون را به این تابع اضافه کنیم.
تابع check_winner() تابع بعدی است که باید تعریف شود. در این تابع میخواهیم که هر ردیف، ستون و قطر را به منظور پیدا کردن پیروز یا مساوی بررسی کنیم. کد نویسی فرایندی که گفتیم به صورت زیر است.
در این لحظه از زمان، میتوانیم بر روی مربعها کلیک کنیم. میبینیم که کاراکترها بر روی دکمهها ظاهر میشوند و محاسبات لازم برای پیدا کردن پیروز احتمالی انجام میپذیرد. در این مرحله صفحه بازی به شکل نشان داده شده در پایین است.

تشخیص مساوی شدن در بازی
برای تشخیص مساوی شدن بازی، لازم است که تابع empty_spaces() را تعریف کنیم. وقتی که تابع empty_spaces() فراخوانی شود، متن تمام دکمهها را بررسی میکند. این تابع، خالی بودن یا کاراکتر داشتن هر دکمه بازی بررسی میکند. اگر محتوای دکمهای شامل کاراکتر باشد، این تابع از تعداد کل متغیرهای spaces یک واحد کم میکند.
با اضافه شدن حرکات بازیکنان و به تساوی کشیده شدن فرضی، صفحه بازی به این شکل در میآید.

تعبیه دکمه restart برای بازگرداندن بازی به حالت اولیه
آخرین کاری که در ساخت بازی دوز با پایتون، باید قبل از اعلام تکمیل پروژه انجام بدهیم، ساخت تابع restart() است. این تابع، متغیر سراسری بازیکنان را بهروزرسانی میکند، متن نوار وضعیت بازیکنان را تنظیم میکند و متن همه دکمهها را با فضای خالی بازنشانی میکند.
تعریف تابع restart() تکمیل کننده این متن آموزشی درباره ساخت بازی دوز با پایتون است.

کد کامل ساخت بازی دوز با پایتون
در بخش زیر تمام کد مربوط به پیادهسازی این بازی را نمایش دادهایم. با کپی کردن و بازنشانی این کد در ادیتور خود میتوانید برنامه نوشته شده را بهطور کامل در سیستم شخصیتان ایجاد کنید.
آموزش تخصصی پایتون با استفاده از تمرینات پروژه محور
آموزش زبانهای برنامه نویسی شامل مراحل مختلفی میشود. از مراحل پایه و مقدماتی برای آشنایی با سینتکس زبان و مفاهیمی مانند حلقهها، نوعهای داده، عبارات شرطی و غیره گرفته تا مراحل پیشرفته و مفاهیم تخصصی مانند شیگرایی را شامل میشود. اما معمولا آخرین مرحله برای آموزش برنامهنویس به منظور ورود به دنیای واقعی و بازار کار، اجرای تمرینات پروژه محوری است که قابل ارائه در دنیای واقعی باشند. از طراحی سایت گرفته تا طراحی مدلهای هوش مصنوعی و ساخت اپلیکیشنهای کاربردی، دورههایی هستند که هر کدام مهارتهای مخصوص به خود را نیاز دارند.

حتی برای اجرای بعضی از پروژهها لازم است که از چند زبان برنامهنویسی و چند تکنولوژی مختلف در کنار یکدیگر استفاده کنیم. در این بخش چند مورد از فیلمهای آموزشهای حرفهای پروژه محور پایتون را که توسط فرادرس آماده شده معرفی میکنیم. فرادرس برای تهیه این فیلمهای آموزشی حداکثر حساسیت را بهکار برده تا برای شما مخاطبان عزیز، مفیدترین گزینههای ممکن را فراهم کند.
- فیلم آموزش مقدماتی ساخت ربات تلگرام با پایتون از فرادرس
- فیلم آموزش پروژه محور پایتون درباره طراحی گرافیکی با PyQt و بدون کدنویسی با QT Designe فرادرس
- فیلم آموزش پیشبینی با الگوریتمهای یادگیری ماشین در پایتون درباره پیشبینی نارسایی قلبی از فرادرس
- فیلم آموزش پروژه محور ساخت ربات اینستاگرام با سی شارپ و پایتون فرادرس
- فیلم آموزش پروژه محور جنگو و پایتون، طراحی سایت و وب اپلیکیشن با فریمورک Django در فرادرس
در صورت تمایل با کلیک بر روی تصویر بالا، به فیلمهای آموزشی بیشتری دسترسی خواهید داشت.
جمع بندی
بازی دوز در پایتون که به نام X و O نیز شناخته میشود، یکی از سادهترین بازیهای دونفرهای است که هر دو بازیکن علامت مورد نیاز خود را از بین X و O انتخاب میکنند و بر روی صفحهای ۳*۳ به اجرای بازی میپردازند. وقتی یکی از بازیکنان پیروز میشود که موفق شود در یکی از راستاهای عمودی افقی یا قطری کاراکترهای خود را به صورت ردیفی قرار دهد. در غیر این صورت اگر همه خانههای صفحه بازی پر از کاراکتر شود و کسی موفق به ترسیم خطی با نماد خود نشود بازی به صورت مساوی به پایان میرسد.
در این مطلب از مجله فرادرس، این بازی را با کمک زبان برنامهنویسی پایتون و کتابخانه گرافیکی Tkinder به صورت کاربر پسندی پیادهسازی کردیم. تمرین پیادهسازی این بازی یا افزودن نکاتی برای سرگرم کنندهتر شدن یا حتی بزرگ کردن بازی به منظور سختتر کردن بازی یکی از راههای افزایش مهارتهای پایتونی هستند.
برنامه مشکل دارد
در قسمت نظرات هم نمی توان تصحیح کرد و فرستادن برنامه غیر ممکن است تابع نکست تورن نیاز به تصحیح دارد
با سلام و احترام؛
تابع «next_turn» اصلاح شد.
از همراهی شما با مجله فرادرس سپاسگزاریم.
چرا o نمیخوره؟