آبان
۹
۱۳۹۱

برنامه ی بازی دوز (تیک تاک تو)

حتما شما هم بازی دوز یا به قول بعضیا “تیک تاک تو” رو بازی کردید. یک بازی دو نفره که یک نفر دایره و دیگری ضربدر رو در یک جدول سه در سه بازی میکنه و هرکس زودتر به یک ردیف یک شکل دست پیدا کرد برنده بازی میشه.

در این پست از کدبلاگ کدی رو برای دانلود قرار میدم که این بازی کلاسیک رو با زبان سی پلاس و کتابخانه OpenGL به صورت دو نفره مدل سازی و پیاده میکنه. من این برنامه رو چند سال قبل به عنوان تمرین درس گرافیک انجام داده بودم و چون فرصت زیادی نداشتم، بیشتر به بعد گرافیکی برنامه توجه نشون داده بودم اما شما در صورت تمایل میتونید امکانات بیشتری رو به برنامه اضافه کنید. به طور مثال میشه منویی به برنامه اضافه کرد تا نوبت دهی رو کاربر انتخاب و ذخیره کنه (در کد فعلی نوبت دهی به صورت نوبتی بین ضربدر و دایره انتخاب میشه) همچنین به خوبی میشه الگوریتم بازی “کاربر با کامپیوتر” رو پیاده سازی کرد.

برای این کار میتونیم از یک تابع ارزیابی نسبتا ساده و یا الگوریتم مینی ماکس استفاده کنیم. ماکسیمم حالت های ممکن برای بازی کردن ۹ فاکتوریل است که رقم چندان بزرگی نیست. با اضافه کردن شرط هایی این رقم کاهش بسیار زیادی نیز پیدا خواهد کرد. اگر درس هوش مصنوعی پاس میکنید این برنامه میتونه زمینه بسیار خوبی برای پیاده سازی و یادگیری الگوریتم مینی ماکس و هرس آلفا-بتا باشه.

 

 
برای تشخیص اینکه کلیک در کدام خانه از جدول انجام شده با هر بار کلیک مختصات نقطه کلیک شده توسط ماوس با تک تک محدوده های خانه های جدول مقایسه میشه. هر خانه ای که طول و عرض نقطه کلیک شده در محدوده ی اون قرار داشت خانه ی انتخاب شده است. بعد از تشخیص خانه ی مورد نظر انجام حرکت در ماتریس مدل صورت میگیره و نوبت بازی عوض میشه.

برای مدل کردن خانه های بازی از یک ماتریس سه در سه استفاده کرده بودم. همچنین متغیر turn وظیفه تعیین نوبت بازی رو داره.

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

 

 

مختصات خانه ها و کل صفحه نمایش کاملا داینامیک و در زمان اجرا انتخاب و تخصیص داده میشوند. میتونید با ریسایز کردن پنجره و مشاهده عکس العمل برنامه به این نکته پی ببرید. نحوه ریسایز شدن پنجره بازی خودش برای من مثال جالبی بود که سعی داشتم پیاده سازیش کنم.

در صورتی که برنامه رو کامپایل و اجرا کنید خواهید دید که به هنگام پیروزی یکی از بازیکن ها؛ پوزیشنی که باعث پیروزی اون فرد شده به صورت چشمک زن نمایش داده میشه. برای پیاده کردن این مطلب در اون زمان از روش ساده ای استفاده کردم که مقدار نسبتا زیادی به حجم کد در بازی اضافه میکرد. هرچند میشه از روش های بهتری هم استفاده کرد اما این روش هم به خوبی کار میکنه. با خوندن تابع timerfunction متوجه این روش میشید.

طبق معمول الگوریتم برنامه کاملا در ویندوز و لینوکس قابلیت کامپایل و اجرا رو داره و نیازی به تغییر خاصی در کد نیست.

نکته آخری که حضور ذهن دارم در مورد کلید های کمکی است که با کلید f2 بازی ریست میشه و با زدن دکمه e بازی از حالت اجرا خارج میشه.

موفق و پیروز باشید.


نوشته‌های مرتبط

درباره نویسنده

برنامه‌نویس ++‏C/C‏ - برنامه‌نویس سیستم‌های گرافیکی با استفاده از کتابخانه ‏OpenGL - برنامه‌نویس #‏C و ..‏



۲۱ دیدگاه افزودن دیدگاه +

  • سلام من برنامه رو دانلود کردم وقتی در محیط ویژوال استدیو بازش میکنم و میخوام اجراشو ببینم با پیغام خطای زیر مواجه میشم لطفا راهنماییم کنین باتشکر:
    ۱)error C1014:too many include files:depth =1024

    ۲)intelliSense: #include file “c:\program Files(x86)\microsoft Visual studio 10.0\Vc\include\glut.h” includes itself

    • سلام
      یه مقدار توضیح بدید که روشی که استفاده میکنید تا برنامه رو کامپایل و اجرا کنید چیه
      شما برنامه دیگه ای رو با opengl در ویژوال ۲۰۱۰ نوشتید و اجرا گرفتید یا این اولین برنامس؟

      • بله قبلا هم برنامه با open gl نوشتم و در ویژوال استدیو ۲۰۱۰ اجرا گرفتم.ویژوال استودیو رو که باز میکنم به آدرس زیر میرم:
        new project\visual c++\general\empty project

        وقتی پروژه ایجاد شد روی source files کلیک راست میکنم و از منوی ظاهر شده add\new item ودر پنجره ظاهر شده c++ file رو انتخاب میکنم و در نهایت کد برنامه شما رو اونجا کپی میکنم و پروژه رو سیو میکنم و f5 میزنم و با خطاهایی که گفتم مواجه میشم
        امیدوارم توضیحم واضح بوده باشه
        ممنون

        • دوست عزیز از روش شما هم میشه برنامه رو اجرا کرد اما یک بار محض امتحان از طریق ساخت کنسول اپلیکیشن برنامه رو سعی کنید اجرا کنید ببینید چی جواب میده هرچند چیزی که از پیغام ها به نظر میرسه مشکل بر سر فایل های هدر برنامست. فکر میکنم اولین اروری که دریافت کردید معمولا به خاطر اینکلود کردن چند باره یک فایل هدر صورت میگیره به همین خاطر به نظرم یک بار تمام فایل های مربوط به اوپن جی ال (glu,gl,glut) رو پاک کنید و از اول با دقت بیشتری کپی کنید. قبلشم مطمئن باشید که این فایل ها همگی درست و صحیح هستند (از جای مطمئنی دانلودشون کنید) بعد پیشنهاد آخرم هم اینه که اگر میتونید از کامپایلر دیگری مثل cygwin در ویندوز به جای ویژوال استادیو استفاده کنید.

  • دوباره سلام
    کارایی که فرموده بودین انجام دادم فایل ها رو پاک کردم و یکبار دیگه کپی کردم حتی ویژوال استدیو هم دوباره نصب کردم الان دیگه اون ارور ها رو نداره یه ارور جدید میده :

    intelliSense: identifier “GLchar” is undefined

    که این ارور مربوط میشه به خط ۱۹ برنامه اگه لطف کنید راهنماییم کنید

    و یکمی هم بیشتر راجعبه الگوریتم برنامه توضیح بدین که من بتونم سر کلاس ارائه بدم

    • به خاطرم اومد که من این کد رو با gcc کامپایل کردم و مشکلات موردی شما به خاطر استفاده از یک کامپایلر دیگست. اما مشکلی نیست. GLchar رو پاک کنید و به جاش از GLbyte یا char استفاده کنید مشکلتون حل میشه. در ضمن اگر هنگام اجرا با صفحه نمایش تماما سفید روبه رو شدید به جای تابع glSwapFunction در انتهای تابع display از glFlush استفاده کنید.
      دوست عزیز من این کدها رو برای کسانی که از خودم تازه واردترن اینجا میذارم تا با مطالعه اون شاید نکته ای به آموخته هاشون افزوده بشه و هدفم اجرای برنامه های دانشجویی دوستان دیگه نبوده اما اگر شما خودتون دوست دارید در این راه ازش استفاده کنید (بخونید در حق خودتون ظلم کنید) فکر میکنم حداقل کاری که باید انجام بدید اینه که خودتون خط به خط تریسش کنید و اگه سوالی داشتید بپرسید تا موردی پاسخ سوالتون رو بدم.

  • دستتون درد نکنه برنامه اجرا شد.منم نمی خوام به قول شما به خودم ظلم کنم ولی متاسفانه زمانم واسه نوشتن برنامه خیلی کمه.

    بازم ممنون

    • موفق باشید

  • سلام ببخشید من پروزه شما را دانلود کردم امیدورم راضی باشید
    ببخشید من میخوام این پروزه را برای درس گرافیکم ارائه بدم
    فکرنکنیید آدم سودجویی هستم و از رو تنبلی خواستم برنامه ی آماده شما را دانلود کنم
    خداشاهده استاد اصلا با ما توابع را کار نکرد
    الان میخوام شنبه این پروزه را ارائه بدم اما کد شما را خوندم متوجه نشدم اگه هم بخوام با ایمیل سوال کنم طول میکشه
    میشه امشب یا فردا یا شنبه یه ساعت که وقت دارید بگید تا من بیام ON بشم و CHAT کنیم در مورد پروزه
    زیاد وققتتون را نمیگیرم چندتا سوال کوچیکه
    خواهش میکنم کمکم کنید
    منتظر جوابتون هستم

    • دوست گرامی اگر الگوریتم برنامه رو خوب خونده باشید و به قول خودتون فقط چند تا سوال فنی در موردش داشته باشید من میتونم کمکتون کنم در غیر اینصورت متاسفانه کمک زیادی از من ساخته نیست. ساعت ۱۱ امشب میتونید بیایید چت روم سایت

  • سلام
    من قبلا با opengl کار کردم الان دارم روی یه پروژه کار میکنم چند تا سوال دارم اگه ممکنه جوابشونو بدین
    اگه میتونستین بهم ایمیل بزنین

    • سلام
      اگه کمکی از دستم بر بیاد خوشحال میشم انجام بدم

  • توی این برنامه که گفتین مختصات صفحه داینامیک هست و در زمان اجرا گرفته میشه کد کدوم قسمت هست؟؟؟؟

    • با استفاده از کدهای زیر میتونید مختصات رو از سیستم بگیرید:
      glutGet(GLUT_SCREEN_WIDTH
      glutGet(GLUT_SCREEN_HEIGHT

  • واقعا ممنونم همه جا بود این کد بازی اما هیچکدوم از کلاس ها استفاده نکرده بودن………مرسی کلی ی ی ی ی

  • سلام
    من نتونستم خروجی رو ببینم،واسه همین تابع glflush رو بعد تمام glend ها نوشتم،اینبار اجرا شو دیدم اما صفحه انگاری دائم رفرش میشه،ونهایتا دوتا کلیک میتونم بکنم و با سومی یا هنگ میکنه یا قبلیا پاک میشه

    لطفا راهنمایی کنید

  • عالی بود ممنون از لطفا شما

  • با عرض سلام و خسته نباشید خدمت شما دوست گرامی
    واقعا ازتون ممنونم به خاطر قرار دادن کد بازی دوز
    خواستم ببینم امکانش هست توضیح برنامرو هم برای فهم بیشتر قرار بدید
    با تشکر

    • با سلام و سپاس از شما
      من سعی کردم توضیحات کلی رو بگم با اینحال سوال خاصی اگر داشتید در خدمتم. پیشنهاد میکنم برنامه رو خط به خط تریس کنید تا شیوه اجرای برنامه را متوجه بشید و هرجا مشکلی داشتید بگید تا توضیح بدم.

  • سلام میشه فایل اصلی و کامل پروژه را برایم بفرستید؟ منتظر جوابتان هستم

    • سلام. فایل اصلی همین فایلی هست که درون مطلب گذاشتم ولی اگر منظور شما فایل پروژه ای مثل فایل های ویژوال استادیوست نه متاسفانه اونهارو در اختیار ندارم.

فرستادن دیدگاه

*