حل تمرین بازی minesweeper با c++
حل تمرین بازی mine sweeper با برنامه نویسی c++
برنامه ای مشابه minesweeper ویندوز بنویسید که یک جدول m*n را در نظر بگیرد، تعدادی از خانه های جدول بمب هستند و در بقیه خانه ها اعدادی وجود دارد که نشانه گر تعداد بمب هایی است که در 8 طرف آن خانه قرار دارد.
ابتدا به ترتیب سطر و ستون را از ورودی خوانده ، سپس تعداد بمب های واقع در جدول و در نهایت مختصات بمب ها را با زوج عددی که اولی شماره سطر و دومی شماره ستون هست بیان کند. به جای بمب ها * و در سایر خانه ها اعداد را قرار دهید.
اگر با این بازی آشنایی ندارید بهتر است قبل از شروع به کد نویسی ابتدا خود بازی را یاد بگیرید تا سوال بهتر مفهوم بشه. اگه این بازی را بلد باشین سوال خیلی سادس. باید یه آرایه n*m درست کنید که تعداد بمب ها را بگیره و بمب ها را جایگذاری کنید( در آرایه) و سپس اعداد محاسبه و در آرایه قرار بگیرند. وقتی یک خانه عدد 5 هست یعنی دور تا دور آن خانه اندیسهای چسبیده بهش(8خانه دور تا دورش) 5 تا بمب هست.
دانلود بازی مین سویپر minesweeper
الگوریتم:
اول اینکه آرایه به صورت عددی هست و * نمیشه توی آرایه عددی گذاشت پس ما اینجا بجای* عدد منفی یک را در نظر میگیریم. چون هیچوقت جمع بمب ها منفی یک نمیشه.
اولین کاری که میکنیم اینه که 2 ورودی برای متغیر های m و n میگیریم تا تعداد سطر و ستون مشخص بشه
دومین کار اینکه تعداد بمب ها را از ورودی میگیریم تا به تعدادش با یک حلقه for اندیس x,y بمب ها را دریافت کنیم.
بعد از اینکه بمب ها دریافت شد و بجاش توی آرایه -1 قرار دادیم حالا باید اعداد را بسازیم.
آرایه را از اول تا آخر پیمایش میکنیم هر خانه ای که بمب نبود یعنی بزرگتر از منفی کی بود را اندیس xوy اون خانه رو میفرستیم به تابع bombcalculator تا بمبهای دور تا دور اون اندیس را محاسبه کنه و در اندیس قرار دهد.
فقط در تابع محاسبه بمب ها به این نکته توجه داشته باشید که اولا خود اندیس حساب نیست و اندیسهایی که از محدوده تعریف آرایه هم بیرون زدن باز حساب نیستن یعنی با یک شرط اونها رو باید فاکتور گرفت بخاطر اینکه اگه بگیم خانه ی منفی یکم بخاطر اینکه اون خانه تعریف نشده خطا میده.
در نهایت هم که اعداد محاسبه و جای گذاری شد از ابتدا و انتها آرایه دو بعدی خودمون رو چاپ میکنیم فقط هرجا منفی یک دیدیم بجاش * چاپ میکنیم.
ورودی برنامه mine sweeper و خروجی آن:

همونطور که در ورودی و خروجی برنامه میبینید خط اول سطر و ستون را به صورت جفت عددی که با فاصله جدا شدند از ورودی دریافت میشوند.
خط بعد تعداد بمب ها و خط های بعد هم به صورت زوج عدد سطر و ستون بمب ها را دریافت میکنند.
سورس کد برنامه:
//start----
# include < stdio.h >
int n,m;
int x[100][100];
int i,j,k;
int bombcalculator(int a,int b){
int sum=0;
int y,z;
for(y=a-1;y<=a+1;y++)
{
for(z=b-1;z<=b+1;z++)
{
if(y<=n && z<=m && (y!=a || b!=z))
if(x[y][z]==-1)
sum++;
}
}
return sum;
}
int main(){
int bomb=0;
scanf("%d %d",&n,&m);
scanf("%d",&bomb);
for(k=1;k<=bomb;k++){
scanf("%d %d",&i,&j);
x[i][j]=-1;
}
int a=2;
int b=4;
int y,z;
for(y=1;y<=n;y++){
for(z=1;z<=m;z++){
if(x[y][z]!=-1)
x[y][z]= bombcalculator(y,z);
}
}
for(y=1;y<=n;y++){
printf("\n");
for(z=1;z<=m;z++){
if(x[y][z]==-1){
printf("* ");
}else{
printf("%d ",x[y][z]);
}
}
}
return 0;
}
//end--
