درود!
این جا مکانی است ویژه برای دانشجویان مهندسی کامپیوتر / آی تی و نرم افزار و صد البته افرادی که جویندگان دانش و تکنولوژی هستند.
آقایان دانوش ،یاشار و آمالی دارندگان این بلاگ بودند و هم اکنون تنها آقای دانوش مدیریت این وبلاگ را بر عهده دارد، با توجه به زمان بندی ها هم اکنون در این سایت فعالیت پویا ای نداریم.

مهم! بازی دوز (نسخه دوم)

یکشنبه 20 بهمن 1392
20:13
دانوش پیچگاه
درود؛
بازی دوز نسخه اول اینگونه بود که کاربر با خودش بازی می کرد. یعنی هر باز بعد از کلیک ماوس دایره و با زدن راست کلیک ضربدر نمایش داده می شد.
در نسخه دوم که در ادامه مطلب موجود هست؛ کاربر با کامپیوتر مسابقه می دهد و بازی تا حدی هوشمند هست.
درضمن مشکلات زیر در نسخه دوم رفع شدند:
  • عدم پایان بازی اگر کسی برنده نمی شد.
  • نمایش کسی که برنده شده است.

و مشکلات زیر موجودند:

  • درصورتی که بعد از هر بار کلیک (دایره زدن) ؛ چند بار اینتر کنید؛ کامپیوتر چند بار ضربدر می زند. (که البته این مشکل رو تا حدودی زفع کردم و الان گاهی وقت ها - به جای اکثر وقت ها - این مشکل پدیدار می شود)
  • هوش مصنوعی بازی در سطح Very Easy هست (که با کمی تلاش قابل رفع هست)

کد در ادامه همین پست موجود است. برای اجرا بازی، ابتدا آنرا اجرا کنید سپس بر یک خانه کلیک کرده و اینتر را یک بار بفشارید، همین کار را تکرار کنید تا بازی تمام شود! (مثل بازی واقعی اش).
در کد بازی دوز؛ دایره ها با دایره قرمز و ضربدرها با دایره بنفش رنگ نمایان می شوند.

(زمان کد نویسی: سه ساعت و بیست و چهار دقیقه و نه ثانیه و پنج صدم ثانیه)


توجه نمایید که این کد برپایه نسخه اول کد بازی دوز ساخته شده است. برای دیدن نسخه اول کد بازی دوز من؛ به این آدرس رجوع نمایید:
https://inftek.tk/post/94
                                                                                               https://inftek.tk/post/94 

راهنمای آموزش این کد کمی طولانی است اما بسیار آسان؛ لطفا برای اینکه متوجه شوید که این کد چگونه کار می کند؛ حتما آموزش  نسخه اول کد نویسی این بازی را در آدرس بالا دیده و سپس این کد و اموزشش را انالیز نمایید.
#include<iostream.h> فراخوانی تابع ها
#include<conio.h>
#include<graphics.h>
#include<mouse.h>  تابع موشواره باید دانلود شود  - پست های قبلی بلاگ را ببینید
#include<process.h>
#include<dos.h>
#include<stdlib.h> این کتاب خانه تابع رندم را فراخوانی  می کند. توضیح بیشتر در ادامه
int AA[3][3]; int BB[3][3]; برای اینکه متوجه این آرایه شوید، پستی که مربوط به نسخه اول بازی دوز است را ببینید
 int nn=0;  شمارنده پایان کننده بازی که در ادامه توضیح می دهم
void Copy_right_DANOOSH_Peechgah () در بازی دوز نسخه یک  توضیح داده بودم
{
 for (int i=1; i<4; i++)
 {
  for (int j=1; j<4; j++)
  {
  if ((AA[i][j]==0)||(AA[i][j]==1))
  AA[i][j]=rand();
  }
 }
 sound(2014); توابع صدا؛ صدا ها را به باری اضافه می کنند
 setbkcolor(7); رنگ زمینه
 delay(95); کمی صبر می کند تا صدا پخش شود
 nosound(); صدا قطع شود
 sound(1392);
 delay(95);
 nosound();
 line (0,0,480,0); line (0,0,0,360);  خطوط جدول رسم شود
 line (0,120,480,120); line (160,0,160,360);
 line (0,240,480,240); line (320,0,320,360);
 line (0,360,480,360); line (640,0,640,640);
 line (0,480,480,480); line (480,0,480,360);
}
void A(int x, int y, int i, int j)
{ if ((AA[i][j]!=0)&&(AA[i][j]!=1)) اگر آرایه ای انتخاب نشد؛ دستورات انجام شود
 {AA[i][j]=1; آرایه برابر با یک یعنی کاربر آن آرایه را انتخاب نمود
 nn++;  *این شمارنده تا مقدار معینی می شمارد زمانی که به حد خود رسید بازی تمام می شود
 if ((x<160)&&(y<120)) توضیح داده شده در پست نسخه اول بازی دوز
 circle (80,60,60);
 if ((x>160)&&(x<320)&&(y<120))
  circle (240,60,60);
 if ((x>320)&&(x<640)&&(y<120))
  circle (400,60,60);
 if ((x<160)&&(y>120)&&(y<240))
  circle (80,180,60);
 if ((x<160)&&(y>240)&&(y<480))
   circle (80,300,60);
 if ((x>160)&&(y>120)&&(y<240)&&(x<320))
  circle (240,180,60);
 if ((x>320)&&(y>120)&&(y<240)&&(x<640))
  circle (400,180,60);
 if ((x>160)&&(x<320)&&(y>240)&&(y<480))
  circle (240,300,60);
 if ((x>320)&&(x<640)&&(y>240)&&(y<480))
  circle (400,300,60);}
}

void B(int x, int y, int i, int j)
{
 if ((AA[i][j]!=0)&&(AA[i][j]!=1)) اگر آرایه ای انتخاب نشد دستورات انجام شود
 {
 AA[i][j]=0; آرایه های انتخاب شده کامپیوتر پس از برابر شدن با عدد صفر برابر شده حساب می آیند
 if ((x<160)&&(y<120))
 circle (80,60,60);
 if ((x>160)&&(x<320)&&(y<120))
  circle (240,60,60);
 if ((x>320)&&(x<640)&&(y<120))
  circle (400,60,60);
 if ((x<160)&&(y>120)&&(y<240))
  circle (80,180,60);
 if ((x<160)&&(y>240)&&(y<480))
   circle (80,300,60);
 if ((x>160)&&(y>120)&&(y<240)&&(x<320))
  circle (240,180,60);
 if ((x>320)&&(y>120)&&(y<240)&&(x<640))
  circle (400,180,60);
 if ((x>160)&&(x<320)&&(y>240)&&(y<480))
  circle (240,300,60);
 if ((x>320)&&(x<640)&&(y>240)&&(y<480))
  circle (400,300,60);
 }
}

int fb(int i, int j) این تابع چک میکند و سپس در بدنه اصلی تابع می گوید که
                        آیا کامپیوتر می تواند جدولی را برای ضربدر زدن انتخاب کن یا نه
{
 if ((AA[i][j]!=0)&&(AA[i][j]!=1))
 {
 return 0;} صفر یعنی می تواند
 else { return 1;} یک یعنی حانه نمی تواند انتخاب شود
}
void RULE () یک ویژگی دیگر که به بازی اضافه شد، تشخیص برنده شدن توسط
                  ضربدر ها یا دایره هایی است که پیاپی و مورب هم چیده شده باشند
    در نسخه قبلی بازی و البته آنچه استاد خواسته بود؛ تنها اشکال یکسان در یک سطر
                                                                     .یا ستون برنده حساب می شدند
                 
{
 if((AA[1][3]==AA[2][2])&&(AA[2][2]==AA[3][1])) چک کردن اینکه در قطر اصلی جدول آیا اشکال شبیه هم هستند
 {if (AA[1][1]==0) {cleardevice(); cout<<"You won!";} else {cleardevice(); cout<<"FAIL, Computer won";}
 delay (450); exit(0);}
 if ((AA[1][1]==AA[2][2])&&(AA[3][3]==AA[2][2])) کار مشابه با دستور قبلی اما برای ستون فرعی
 {if (AA[1][1]==1) {cleardevice(); cout<<"You won!";} else {cleardevice(); cout<<"FAIL, Computer won";}
 delay (450); exit(0);}
 for (int i=1; i<=3; i++)
 {
 if ((AA[1][i]==AA[2][i])&&(AA[3][i]==AA[2][i]))
 {if (AA[1][i]==1) {cleardevice(); cout<<"You won!";} else {cleardevice(); cout<<"FAIL, Computer won";}
 delay (450); exit(0);}
 if ((AA[i][1]==AA[i][2])&&(AA[i][3]==AA[i][2]))
 {if (AA[i][1]==1) {cleardevice(); cout<<"You won!";} else {cleardevice(); cout<<"FAIL, Computer won";}
 delay(450); exit(0);}
 }
}

void main()
{
 int i=0,x,y,c;
 int m=0,d=0;
 initgraph(&m,&d,"");
 initmouse();
 showmouse();
 Copy_right_DANOOSH_Peechgah ();
 while (1==1)
 {
  getmouse(&x,&y,&c); مکان یابی موشواره
  if (c==1)
  {
 setcolor(4); تعیین رنگ قرمز به عنوان دایره از سوی کاربر
 if ((x<160)&&(y<120))
 A(x,y,1,1);
 if ((x>160)&&(x<320)&&(y<120))
 A(x,y,1,2);
 if ((x>320)&&(x<640)&&(y<120))
 A(x,y,1,3);
 if ((x<160)&&(y>120)&&(y<240))
 A(x,y,2,1);
 if ((x<160)&&(y>240)&&(y<480))
 A(x,y,3,1);
 if ((x>160)&&(y>120)&&(y<240)&&(x<320))
 A(x,y,2,2);
 if ((x>320)&&(y>120)&&(y<240)&&(x<640))
 A(x,y,2,3);
 if ((x>160)&&(x<320)&&(y>240)&&(y<480))
 A(x,y,3,2);
 if ((x>320)&&(x<640)&&(y>240)&&(y<480))
 A(x,y,3,3);
 setcolor(15); رنگ سفید که البته مهم نیست
 i=i+1;
 getch(); این تابع باعث می شود که پس از انتخاب یک دایره از سوی کاربر؛ کامپیوتر یک ضربدر که در واقع همان دایره بنفش رنگ است را انتخاب کند و سپس به کاربر زمان کافی برای انتخاب دایره قرمز رنگ خودش را بدهد. در غیر این صورت و در صورت عدم وجود این تابع زمان انتخاب دایره از سوی کاربر در مرحله بعد از انتخاب ضربدر از سوی کامپیوتر داده نمی شود.
.یادتان باشد که در این جا نقش ضربدر بازی را دایره بنفش رنگ انجام می دهد
  }
 if (nn==5) {cleardevice(); cout<<"No one won :/ \n Wanna try again?"; delay(458); exit(0);} این تابع تشخیص می دهد که کسی برنده نشده است  از بازی خارج میکند. کاربر در یک دوز 3 در 3 تنها 5 بار قادر به کلیک کردن است. شمارنده یادشده در این جا به کار رفت
 if(i%2!=0)  به کامپیوتر اجازه می دهد تا بعد از کاربر یک جدول را انتخاب کند تا ضربدر بزند
  {
 x=random(641); از بین عدد صفر تا عدد داخل پرانتز یک عدد را شانسی انتخاب میکند
 y=random(481); این هم همینطور. ایکس و وای مختصات موشواره از سوی کامپیوتر است
 setcolor(5); رنگ بنفش به عنوان دایره بنفش رنگ که نقش ضربدر را در بازی دارد از سوی کامپیوتر منتخب می شود
 for(;;) این حلقه هر بار چک میکند که آیا مختصات منتخب از سوی کامپیوتر جدولی خالی را نشان می گیرند یا خیر
اگر بلی، یک ضربدر رسم می شود و سپس از حلقه خارج می شود و اگر خیر حلقه ادامه پیدا میکند تا مختصات دیگری را کامپیوتر انتخاب کند
   {
 if ((x<160)&&(y<120)&&(fb(1,1)!=1))
 {B(x,y,1,1);  break;}
 if ((x>160)&&(x<320)&&(y<120)&&(fb(1,2)!=1))
 {B(x,y,1,2);  break;}
 if ((x>320)&&(x<640)&&(y<120)&&(fb(1,3)!=1))
 {B(x,y,1,3);  break;}
 if ((x<160)&&(y>120)&&(y<240)&&(fb(2,1)!=1))
 {B(x,y,2,1);  break;}
 if ((x<160)&&(y>240)&&(y<480)&&(fb(3,1)!=1))
 {B(x,y,3,1);  break;}
 if ((x>160)&&(y>120)&&(y<240)&&(x<320)&&(fb(2,2)!=1))
 {B(x,y,2,2);  break;}
 if ((x>320)&&(y>120)&&(y<240)&&(x<640)&&(fb(2,3)!=1))
 {B(x,y,2,3);  break;}
 if ((x>160)&&(x<320)&&(y>240)&&(y<480)&&(fb(3,2)!=1))
 {B(x,y,3,2);  break;}
 if ((x>320)&&(x<640)&&(y>240)&&(y<480)&&(fb(3,3)!=1))
 {B(x,y,3,3);  break;}
 x=random(641); در صورتی که مختصات اولیه مجاز نبودند و جداول پر را نشانه میگرفتند,مختصات دیگری منتخب می شوند
 y=random(481);
   }
 setcolor(15);
 i=i+1; این شمارنده کوچک، به خودش بک واحد اضافه می کند تا شروط ترتیب بندی زیر حفظ شود:
          اول کابر دایره رسم کند سپس کامپیوتر
  }
 RULE(); چک کند که کسی برنده شده است یا خیر
 }
}




شبکه اجتماعی فارسی کلوب | Buy Mobile Traffic | سایت سوالات