Forums

Full Version: jتو رو خدا به من کمک کنید (برنامه ی شطرنج از نوع جدید)
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
سلام دوستان . من جدیدا عضو این سایت شدم و دانش آموز سال سوم دبیرستانم که تو دبیرستانمون به ما C++ آموزش میدن . یه پروژه باید تا 4 تیر تحویل بدیم که هنوز هیچ کس از کلاسمون نتونسته بنویسه . حالا ازتون خواهش میکنم که منو راهنمایی کنید یا حداقل بگید از کجا میتونم سورسشو پیدا کنم .
برنامه : یک اسب با حرکت در یک شطرنج 2n*2n تمام خانه های آنرا بپیماید تا جایی که فقط یک خانه ی خالی باقی بماند . به طور مثال :
@@@@@@ @:خانه های پیموده شده
@@@@@@ *: خانه ای که اسب به آن وارد نشده است
@@@@@@
@@@@@@
@@@@@@
@@@@@*

پیشاپیش از راهنمایی شما ممنونم.
سلام
شما به راحتی و با یک جستجوی ساده تو اینترنت میتونین الگوریتم حرکت اسب رو پیدا کنین.
ولی اگه واقعا میخواین خودتون بنویسین این راهنمایی زیر رو که یک دوستی در سایت برنامه نویس گذاشت بود رو یک نگاهی بندازین Victory
سه آرایه زیر رادرنظر بگیرید :
Code:
int access[ SIZE ][ SIZE ] = { 2, 3, 4, 4, 4, 4, 3, 2,
                                     3, 4, 6, 6, 6, 6, 4, 3,
                                     4, 6, 8, 8, 8, 8, 6, 4,
                                     4, 6, 8, 8, 8, 8, 6, 4,
                                     4, 6, 8, 8, 8, 8, 6, 4,
                                     4, 6, 8, 8, 8, 8, 6, 4,
                                     3, 4, 6, 6, 6, 6, 4, 3,
                                     2, 3, 4, 4, 4, 4, 3, 2 };
           int horizontal[ SIZE ] = { 2, 1, -1, -2, -2, -1, 1, 2 };
           int vertical[ SIZE ] =   { -1, -2, -2, -1, 1, 2, 2, 1 };
آرایه اول نشون میده که اگه اسب در یه خانه باشه ، به چند خانه بعد می تونه بره
مثلا اگه در خانه ای باشه که عدد 4 در آن خانه است ، عدد 4 نشان می دهد که اسب از خانه فعلی به 4 خانه دیگر می تواند برود

آرایه دوم و سوم در واقع حرکت اسب رو پیاده سازی می کنند .
به این صورت که اگه مثلا خانه اول از دو آرایه Horizontal و Vertical رو انتخاب کنیم ( بالاجبار باید عناصر های متناظر از این دو آرایه انتخاب شود مثلا اگر عنصر اول از آرایه دوم انتخاب شود باید عنصر اول نیز از آرایه سوم انتخاب شود ) به این معنی است که اسب 2 خانه به جلو و یک خانه به بالا باید برود ، که دقیقا یکی از 6 حرکت اسب است .


یک خانه برای شروع حرکت در نظر میگیریم ؛ در یک آرایه دیگر ( 8*8) این خانه را به عنوان اولین خانه ای که اسب از آنجا قرار است حرکت خود را آغاز کند ، ثبت می کنیم . سپس در آرایه Access از 6 خانه اطراف محل شروع حرکت 1 واحد کم میکنیم ، به این معنی که اگر اسب در یکی از این 6 خانه قرار گیرد ، یکی از خانه های موجود برای حرکت بعدی خود را از دست داده است ، چرا که یک بار از آنجا عبور کرده .
دوست عزیز از راهنماییت ممنونم . ولی اگه شما سورسشو می دونی کجا میشه پیدا کرد به من بگو چون من زیاد وقت ندارم. بازم ازت خیلی ممنونم. فقط سهیل جان به اینم دقت کن که باید یکی از خانه های شطرنج خالی بمونه یعنی اسب به اونجا نره و حرکات اسب باید ممتد باشه .راستی این برنامه 2n* 2n هست و نمیتونیم اونو 8*8 در نظر بگیریم.
Code:
include <iostream.h>
#include <iomanip.h>
#include <conio.h>
int min,npos,l,m,counter,
board[9][9]={{0},{0}} ,nexti[9]={0},
exits[11][2] ,nextj[9]={0}, //main
ktmov1[9]={0,-2,-1,1,2,2,1,-1,-2}, // variables
ktmov2[9]={0,1,2,2,1,-1,-2,-2,-1};
int i,j,t,p,q,r,temp; //temporary required elements
void move(int min)
{ //This function
i = nexti[min]; //move horse place
j = nextj[min]; //if needed
board[i][j] = m;
}
void prompt(){
cout<<'\n'<<setw(22)<<"The chessboard is: "<<'\n'<<'\n';
for(p=1 ; p<=8 ; p++) {
for(q=1 ; q<=8 ; q++)
cout<<setw(4)<< board[p][q] ;
cout<< endl;
} // end_first for
} //end_prompt
void main(){
cout<<'\n'<<"Enter Number Of Row And Column You Want To Start From ? ";
cout<<'\n'<<" ( 0<row<9 and 0<column<9 ) >> ";
cin>>i>>j;
board[i][j] = 1;
for(m=2 ; m<=64 ; m++) //main loop
{
for(p=0 ; p<=10 ;p++) //giving
for(q=0 ; q<=1 ;q++) //zero to
exits[p][q]=0; //variables
for(p=0 ; p<=8 ;p++) //and arrays
nexti[r]=nextj[r]=0; //needed
l=1 ;npos=0;
for (r=1 ; r<=8 ; r++) //This loop
{ //find rows and columns of
p =i + ktmov1[r]; //places the horse
q =j + ktmov2[r]; //can go and save
if( p<=8 && p>0 //rows in 'nexti' array and
&& q<=8 && q>0 //column in 'nextj' array
&& board [p][q]==0)
{
nexti[l] = p;
nextj[l] = q;
++l;
++npos; //number of positions
} // end_if
} //end_for
if(npos == 0){ //This condition check
prompt(); //the next place .
return; }
if(npos == 1) { // This condition check
min = 1; // if there is only one
move(min); // place to go, move horse
continue; } // to it.
t=0;
for( l=1 ; l<=npos ; l++) // This loop find and
{ // save numbers of exits
counter=0; // from every next place
for( r=1 ; r<=8 ; r++)
{
p=nexti[l] + ktmov1[r];
q=nextj[l] + ktmov2[r];
if( p<=8 && p>0 // checking next
&& q<=8 && q>0 // move is in board
&& board [p][q]==0) // and is empty
++counter;} // or not
exits[t][0]=l;
exits[t][1]=counter;
t++;
} //end for l
t=0;
min=exits[t][0];
temp=exits[t][1];
t++;
while(exits[t][0]!=0){ // finding minimum exit
if(temp>exits[t][1]){ // in next place
temp=exits[t][1];
min=exits[t][0];} // end_if
++t;
} //end_while
move(min);

}
prompt(); //showing board
getch();
cin.get();
}


source : p30world.com
دوستان از راهنماییتو ممنونم ولی تمام برنامه هایی که میذارید اسب کل خانه های شطرنجو میره میگرده
ولی این برنامه ای که من میخوام آخر سر باید یکی از خونه ها خالی بمونه.
میگم بد نیست خودتون هم یکم فکر کنین
قرار نیست ما اینجا پروژه های دیگران رو حل کنیم
دوستان من سورس این برنامه رو پیدا کردم . ولی الگوریتمشو متوجه نمیشم . اگه میشه منو راهنمایی کنید . . ممنون میشم اگه جواب بدید.
کد :
Code:
#include <iostream>
#include <conio.h>
using namespace std;
int N;
void cal(char**,int,int,int,int,int);
void display(char**,int);
int main()
{
    char **a;
    int i,j,n,x,y,x1,y1,temp;
    float s1,s2;
    cout<<"Enter Size of your map :";
    cin>>n;
    temp=N=n;
    while (n!=2)
    {
          if (n%2)
          {
             cout<<"We cant hace such a size (size must be power of 2)!\n";
             system("pause");
             exit(0);
          }
          n/=2;
    }
    cout<<"Enter the empty place:\n";
    cout<<"X:";
    cin>>x;
    cout<<"Y:";
    cin>>y;
    a=new char* [N];
    for (i=0 ; i<N ; i++)
        a[i]=new char [N];
    for (i=0 ; i<N ; i++)
        for (j=0 ; j<N ; j++)
            a[i][j]='?';
    a[x][y]=' ';
    x1=y1=0;
    while ( temp != 1)
    {
          cal(a,temp,x1,y1,x,y);
          if ( x < (s1=(float)(x1+x1+temp-1)/2) && y < (s2=(float)(y1+y1+temp-1)/2) )//area 1
          {
             x1=x1;//baraye neshan dadane raveshe kar ast vagarne ehtiaji be neveshtan nadasht
             y1=y1;
          }
          else if ( x < (float)(x1+x1+temp-1)/2 && y > (float)(y1+y1+temp-1)/2 )//area 2
          {
               x1=x1;
               y1=y1+temp/2;
          }
          else if ( x > (float)(x1+x1+temp-1)/2 && y < (float)(y1+y1+temp-1)/2 )//area 3
          {
               x1=x1+temp/2;
               y1=y1;
          }
          else//area 4
          {
              x1=x1+temp/2;
              y1=y1+temp/2;
          }
          temp/=2;
    }
    cout<<"The final map is :\n";
    for (i=0 ; i<N ; i++)
    {
        for (j=0 ; j<N ; j++)
            cout<<a[i][j]<<' ';
        cout<<endl;
    }
    system("pause");
    return 0;
}
//*********************
void cal(char **a , int n, int x1 , int y1 , int x , int y)//x1 & y1 : first place
{                                                          //x & y : empty space
     if (n == 2)
     {
           if ( x == x1 && y == y1 )//1
           {
                a[x1][y1+1]=1;
                a[x1+1][y1]=1;
                a[x1+1][y1+1]=1;
                display(a,N);
                return;
           }
           else if ( x == x1 && y == y1+1 )//2
           {
                a[x1][y1]=1;
                a[x1+1][y1]=1;  
                a[x1+1][y1+1]=1;
                display(a,N);
                return;
           }
           else if ( x == x1+1 && y == y1 )//3
           {
                a[x1][y1]=1;
                a[x1][y1+1]=1;
                a[x1+1][y1+1]=1;
                display(a,N);
                return;
           }
           else//4
           {
               a[x1][y1]=1;
               a[x1+1][y1]=1;
               a[x1][y1+1]=1;
               display(a,N);
                return;
           }
     }
     else
     {
         if ( x < (float)(x1+x1+n-1)/2 && y < (float)(y1+y1+n-1)/2 )//1
         {
            cal(a , n/2 , x1 , y1+n/2 , x1+n/2-1 , y1+n/2);//2->3 x: kamtar   y: hamoonja
            cal(a , n/2 , x1+n/2 , y1 , x1+n/2 , y1+n/2-1);//3->2  x: hamoonja    y: bishtar
            cal(a , n/2 , x1+n/2 , y1+n/2 , x1+n/2 , y1+n/2);//4->1  x: hamoonja  y:hamoonja
            cal(a , n/2 , x1+n/4 , y1+n/4 , x1+n/4 , y1+n/4);//vasat->khodesh
            
         }
         else if ( x < (float)(x1+x1+n-1)/2 && y > (float)(y1+y1+n-1)/2 )//2
         {
              
            cal(a , n/2 , x1 , y1 , x1+n/2-1 , y1+n/2-1);//1 x:ham x ham y bishtar
            cal(a , n/2 , x1+n/2 , y1 , x1+n/2 , y1+n/2-1);//3
            cal(a , n/2 , x1+n/2 , y1+n/2 , x1+n/2 , y1+n/2);//4
            cal(a , n/2 , x1+n/4 , y1+n/4 , x1+n/4 , y1+n/4+n/2-1);//vasat
            
         }
         else if ( x > (float)(x1+x1+n-1)/2 && y < (float)(y1+y1+n-1)/2 )//3
         {
              
            cal(a , n/2 , x1 , y1 , x1+n/2-1 , y1+n/2-1);//1
            cal(a , n/2 , x1 , y1+n/2 , x1+n/2-1 , y1+n/2);//2
            cal(a , n/2 , x1+n/2 , y1+n/2 , x1+n/2 , y1+n/2);//4
            cal(a , n/2 , x1+n/4 , y1+n/4 , x1+n/4+n/2-1 ,y1+n/4);//vasat
            
         }
         else
         {
            
            cal(a , n/2 , x1 , y1 , x1+n/2-1 , y1+n/2-1);//1
            cal(a , n/2 , x1 , y1+n/2 , x1+n/2-1 , y1+n/2);//2
            cal(a , n/2 , x1+n/2 , y1 , x1+n/2 , y1+n/2-1);//3
            cal(a , n/2 , x1+n/4 , y1+n/4 , x1+n/4+n/2-1 , y1+n/4+n/2-1);//vasat
            
         }
     }
}
//*************************
void display(char **a,int ssf)
{
     for (int i=0 ; i<ssf ; i++)
     {
         for (int j=0 ; j<ssf ; j++)
             cout<<a[i][j]<<' ';
         cout<<endl;
     }
     cout<<"\nPress any key to see next step...\n";
     getch();
     system("cls");
}
//**************************
دوست من این که کد خودمه و مال شطرنج نیست ، این کد کاشی کردن یک محیط به صورت L و البته میتونه همون کد شما باشه چون تقریبا همون حرکت اسب ولی با یک خونه کمتر.
درباره ی توضیحش هم باید بگم که به صورت یک تابع بازگشتی و با روش تقسیم و غلبه کار میکنه. محیط رو میشکنه و به داخل محیط جدید میره و این کار رو اونقدر ادامه میده که به یک مربع با 4 خونه برسه و با توجه به مکان هدف ( همون خونه ای که قراره خالی بمونه ) 3 خونه از 4 تا رو پر میکنه و همین کار رو تا آخر ادامه.
حالا اینو از کجا گیر آوردین ؟ :
http://forum.codecorona.com/showthread.php?tid=821P
Reference URL's