امتیاز موضوع:
  • 0 رأی - میانگین امتیازات: 0
  • 1
  • 2
  • 3
  • 4
  • 5
شبیه سازی حرکت اسب شطرنج
نویسنده پیام
HoseinVig آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 1,165
موضوع‌ها: 97
تاریخ عضویت: مرداد ۱۳۸۵

تشکرها : 4768
( 2464 تشکر در 677 ارسال )
ارسال: #1
شبیه سازی حرکت اسب شطرنج
سلام
میخاستم ببینم الگوریتمش یه چه صورته؟
فرض کنید یه اسب شطرنج میخاد توی صفحه شطرنج (آرایه 8*8)
حرکت کنه بدونه اینکه وارد خونه تکراری بشه و در نهایت باید وارد تمامیه خونه هم بشه
من برنامشو نوشتم ولی قسمت پیدا کردن خونه ها رو از سورسی که توی سایت پیدا کردم نوشتم(به زبان CPP)
نمیخام سورس بزارید فقط درباره الگوریتمش حرف بزنید چون میخام برنامه کاملا ساخت خودم باشه، اینجوری احساسه بهتری دارم
برنامرو پایین گزاشتم نظرتون رو هم درباره ظاهره قشنگش بدیدBiggrin
قسمتی که از سورس دستکاری شده استفاده کردم تو کامنت نوشتم

کد:
# include <conio.h>
#include <dos.h>
#include <iostream.h>
#include <stdlib.h>  //rand needed
#include <time.h>   //srand parameter
#include<iomanip.h> //setw needed
int counter=1;
int scr[8][8];
/////////////////// my name ////////////////////
void hosein(int pos)
{
    textcolor(4);
    textbackground(9);
    textbackground(6);
    window(3,pos,3,pos+8),clrscr();
    window(4,pos+4,5,pos+4),clrscr();
    window(6,pos,6,pos+8),clrscr();
    window(8,pos+4,8,pos+8),clrscr();
    window(8,pos+4,10,pos+4),clrscr();
    window(10,pos+4,10,pos+8),clrscr();
    window(9,pos+8,9,pos+8),clrscr();
    window(12,pos+4,14,pos+4),clrscr();
    window(12,pos+4,12,pos+6),clrscr();
    window(12,pos+6,14,pos+6),clrscr();
    window(14,pos+6,14,pos+8),clrscr();
    window(12,pos+8,14,pos+8),clrscr();
    window(16,pos+4,18,pos+4),clrscr();
    window(16,pos+4,16,pos+8),clrscr();
    window(16,pos+6,18,pos+6),clrscr();
    window(16,pos+8,18,pos+8),clrscr();
    window(18,pos+4,18,pos+6),clrscr();
    window(20,pos+4,20,pos+8),clrscr();
    window(20,pos+2,20,pos+2),clrscr();
    window(22,pos+4,22,pos+8),clrscr();
    window(23,pos+5,24,pos+5),clrscr();
    window(24,pos+5,24,pos+8),clrscr();
    delay(3000);
    for(int i=8;i<=79;i+=2)
    {
       if(i<=46)
      window(3,8,3,i),textbackground(6),clrscr();
       window(5,12,i-3,12),textbackground(4),clrscr();
       delay(60);
    }
    int dly=100;
    for(i=12;i<=80;i++)
    {
       if(i<=44)
      window(40,12,40,i),textbackground(4),clrscr();
       delay(dly);
       if(i>46)
      window(40-((i-5)-40),44,i-5,44),textbackground(4),clrscr();
    }
    window(40,13,40,43),textbackground(0),clrscr();
}
void mansouran(int x,int y)
{
    textcolor(4);
    textbackground(9);
    textbackground(6);
    int dly=400;
    //        m
    delay(dly);
    window(x-1,y,x+4,y),clrscr();
    window(x,y,x,y+8),clrscr();
    window(x+2,y,x+2,y+8),clrscr();
    window(x+4,y,x+4,y+8),clrscr();
    delay(dly);
    //        a
    window(x+6,y+4,x+8,y+4),clrscr();
    window(x+8,y+4,x+8,y+8),clrscr();
    window(x+6,y+8,x+8,y+8),clrscr();
    window(x+6,y+6,x+6,y+8),clrscr();
    window(x+7,y+6,x+7,y+6),clrscr();
    delay(dly);
    //       n
    window(x+10,y+4,x+10,y+8),clrscr();
    window(x+10,y+5,x+12,y+5),clrscr();
    window(x+12,y+5,x+12,y+8),clrscr();
    delay(dly);
    //       s
    window(x+14,y+4,x+16,y+4),clrscr();
    window(x+14,y+4,x+14,y+6),clrscr();
    window(x+15,y+6,x+15,y+6),clrscr();
    window(x+16,y+6,x+16,y+8),clrscr();
    window(x+14,y+8,x+16,y+8),clrscr();
    delay(dly);
    //        o
    window(x+18,y+4,x+18,y+8),clrscr();
    window(x+18,y+4,x+19,y+4),clrscr();
    window(x+20,y+4,x+20,y+8),clrscr();
    window(x+19,y+8,x+19,y+8),clrscr();
    delay(dly);
    //        u
    window(x+22,y+4,x+22,y+8),clrscr();
    window(x+24,y+4,x+24,y+8),clrscr();
    window(x+23,y+8,x+23,y+8),clrscr();
    delay(dly);
    //        r
    window(x+26,y+4,x+26,y+8),clrscr();
    window(x+27,y+5,x+28,y+5),clrscr();
    window(x+28,y+4,x+29,y+4),clrscr();
    delay(dly);
    //        a
    window(x+31,y+4,x+33,y+4),clrscr();
    window(x+33,y+4,x+33,y+8),clrscr();
    window(x+32,y+8,x+32,y+8),clrscr();
    window(x+31,y+6,x+31,y+8),clrscr();
    window(x+32,y+6,x+32,y+6),clrscr();
    delay(dly);
    //       n
    window(x+35,y+4,x+35,y+8),clrscr();
    window(x+35,y+5,x+37,y+5),clrscr();
    window(x+37,y+5,x+37,y+44),clrscr();
    delay(dly);
}
void middle(dly)
{
    for(int i=1;i<=10;i++)
    {
    window(4,13,76,43),textbackground(7),clrscr();
    delay(40);
    window(4,13,76,43),textbackground(0),clrscr();
    delay(50);
    }
    for(i=36;i>=-36;i--)
    {
    if(i>=6)
    {
        window(12,i+7,12,43),textbackground(3),clrscr();
        window(21,13,21,49-i),clrscr();
        window(30,i+7,30,43),clrscr();
        window(39,13,39,49-i),clrscr();
        window(48,i+7,48,43),clrscr();
        window(57,13,57,49-i),clrscr();
        window(66,i+7,66,43),clrscr();
    }
    window(i+40,16,76,16),textbackground(3),clrscr();
    window(4,20,40-i,20),clrscr();
    window(i+40,24,76,24),clrscr();
    window(4,28,40-i,28),clrscr();
    window(i+40,32,76,32),clrscr();
    window(4,36,40-i,36),clrscr();
    window(i+40,40,76,40),clrscr();
    delay(dly);
    }
    window(12,48,70,48),textbackground(0),clrscr();
    textcolor(7),cprintf("Ready...Ready...Ready........Press Any Key To Start...");
    getch();
}
void drawscreen()
{
    textbackground(0);
    clrscr();
    hosein(2);
    mansouran(40,2);
    middle(100);
}
void fillcell(int col,int row)
{
    ++col,++row;
      window(col*9-5,row*4+9,col*9+2,row*4+11),textbackground(2),clrscr();
      gotoxy(4,2),cout<<counter;
      counter++;
}
void asb()
{
}
//+++++++++++++++++++++++++++++++++ Source +++++++++
void RankIt(int c[][8]){
    int rank;
    for (int i=0;i<=7; i++) {
        for(int j=0;j<=7; j++){
            rank=0;
            if ((i-2>=0) && (j-1>=0)) rank++;
            if ((i-2>=0) && (j+1<=7)) rank++;
            if ((i+2<=7) && (j-1>=0)) rank++;
            if ((i+2<=7) && (j+1<=7)) rank++;
            if ((j-2>=0) && (i+1<=7)) rank++;
            if ((j-2>=0) && (i-1>=0)) rank++;
            if ((j+2<=7) && (i-1>=0)) rank++;
            if ((j+2<=7) && (i+1<=7)) rank++;
            c[i][j]=rank;
        }
    }

}


void DecRank(int i,int j,int c[][8]){


    if ((i-2>=0) && (j-1>=0)) if (c[i-2][j-1]>0) c[i-2][j-1]--;
    if ((i-2>=0) && (j+1<=7)) if (c[i-2][j+1]>0) c[i-2][j+1]--;
    if ((i+2<=7) && (j-1>=0)) if (c[i+2][j-1]>0) c[i+2][j-1]--;
    if ((i+2<=7) && (j+1<=7)) if (c[i+2][j+1]>0) c[i+2][j+1]--;
    if ((j-2>=0) && (i+1<=7)) if (c[i+1][j-2]>0) c[i+1][j-2]--;
    if ((j-2>=0) && (i-1>=0)) if (c[i-1][j-2]>0) c[i-1][j-2]--;
    if ((j+2<=7) && (i-1>=0)) if (c[i-1][j+2]>0) c[i-1][j+2]--;
    if ((j+2<=7) && (i+1<=7)) if (c[i+1][j+2]>0) c[i+1][j+2]--;


}
int IsPossible(int i,int j,int counter,int c[][8]){

    int isp=0;
    if ((i-2>=0) && (j-1>=0)) if (c[i-2][j-1]>0) isp=1;
    if ((i-2>=0) && (j+1<=7)) if (c[i-2][j+1]>0) isp=1;
    if ((i+2<=7) && (j-1>=0)) if (c[i+2][j-1]>0) isp=1;
    if ((i+2<=7) && (j+1<=7)) if (c[i+2][j+1]>0) isp=1;
    if ((j-2>=0) && (i+1<=7)) if (c[i+1][j-2]>0) isp=1;
    if ((j-2>=0) && (i-1>=0)) if (c[i-1][j-2]>0) isp=1;
    if ((j+2<=7) && (i-1>=0)) if (c[i-1][j+2]>0) isp=1;
    if ((j+2<=7) && (i+1<=7)) if (c[i+1][j+2]>0) isp=1;
    if (counter>61) return 1;
    return isp;
}
int IsFull(int c[][8]){
    int i,j;
    int isp=1;
    for ( i=0;i<=7; i++) {
        for( j=0;j<=7; j++){

            if (c[i][j]>0) isp=0;
        }
    }
    return isp;
}


int rnd(int min,int max){

  int i=rand();
  return ((i%(max-min+1))+min);

}
//++++++++++++++++++++++++++++++++++source up++++++++++++++
void main()
{
    drawscreen();
//    for(int i=1;i<=8;i++)
//       for(int j;j<=8;i++)
//      scr[i][j]=0;
    asb();
// ****************************************8 Source Code *********88
getch();
    srand(time(0));
    Start:
    int c[8][8];
    int t[8][8]={0};
    int im[63][2]={0};
    int rs[8][2]={0};
    int currenti=0;
    int currentj=0;
    int counter=1;
    int i,j;
    int tmin=0;
    RankIt(c);
    c[0][0]=0;
    DecRank(0,0,c);
    while (!(counter==63) ){
        if (IsPossible(currenti,currentj,counter,c) ) {
            t[currenti][currentj]=counter;
            tmin=8;
            for (j=0;j<8;j++) {
                rs[j][0]=0;
                rs[j][1]=0;
            }
        if ((currenti-2>=0) && (currentj-1>=0)) if (c[currenti-2][currentj-1]<tmin && c[currenti-2][currentj-1]>0) tmin=c[currenti-2][currentj-1];
            if ((currenti-2>=0) && (currentj+1<=7)) if (c[currenti-2][currentj+1]<tmin && c[currenti-2][currentj+1]>0) tmin=c[currenti-2][currentj+1];
            if ((currenti+2<=7) && (currentj-1>=0)) if (c[currenti+2][currentj-1]<tmin && c[currenti+2][currentj-1]>0) tmin=c[currenti+2][currentj-1];
            if ((currenti+2<=7) && (currentj+1<=7)) if (c[currenti+2][currentj+1]<tmin && c[currenti+2][currentj+1]>0) tmin=c[currenti+2][currentj+1];
            if ((currentj-2>=0) && (currenti+1<=7)) if (c[currenti+1][currentj-2]<tmin && c[currenti+1][currentj-2]>0) tmin=c[currenti+1][currentj-2];
            if ((currentj-2>=0) && (currenti-1>=0)) if (c[currenti-1][currentj-2]<tmin && c[currenti-1][currentj-2]>0) tmin=c[currenti-1][currentj-2];
            if ((currentj+2<=7) && (currenti-1>=0)) if (c[currenti-1][currentj+2]<tmin && c[currenti-1][currentj+2]>0) tmin=c[currenti-1][currentj+2];
            if ((currentj+2<=7) && (currenti+1<=7)) if (c[currenti+1][currentj+2]<tmin && c[currenti+1][currentj+2]>0) tmin=c[currenti+1][currentj+2];

            if ((currenti-2>=0) && (currentj-1>=0)) if (c[currenti-2][currentj-1]==tmin) {rs[0][0]=currenti-2;rs[0][1]=currentj-1;};
            if ((currenti-2>=0) && (currentj+1<=7)) if (c[currenti-2][currentj+1]==tmin) {rs[1][0]=currenti-2;rs[1][1]=currentj+1;};
            if ((currenti+2<=7) && (currentj-1>=0)) if (c[currenti+2][currentj-1]==tmin) {rs[2][0]=currenti+2;rs[2][1]=currentj-1;};
            if ((currenti+2<=7) && (currentj+1<=7)) if (c[currenti+2][currentj+1]==tmin) {rs[3][0]=currenti+2;rs[3][1]=currentj+1;};
            if ((currentj-2>=0) && (currenti+1<=7)) if (c[currenti+1][currentj-2]==tmin) {rs[4][0]=currenti+1;rs[4][1]=currentj-2;};
            if ((currentj-2>=0) && (currenti-1>=0)) if (c[currenti-1][currentj-2]==tmin) {rs[5][0]=currenti-1;rs[5][1]=currentj-2;};
            if ((currentj+2<=7) && (currenti-1>=0)) if (c[currenti-1][currentj+2]==tmin) {rs[6][0]=currenti-1;rs[6][1]=currentj+2;};
            if ((currentj+2<=7) && (currenti+1<=7)) if (c[currenti+1][currentj+2]==tmin) {rs[7][0]=currenti+1;rs[7][1]=currentj+2;};

            int test=1;
            while (test) {
                int h=0;
                h=rnd(0,7);
                if (rs[h][0]!=0 || rs[h][1]!=0){
                currenti=rs[h][0];
                currentj=rs[h][1];
                test=0;
                }
            }

        im[counter][0]=currenti;
                im[counter][1]=currentj;
                DecRank(currenti,currentj,c);
                c[currenti][currentj]=0;
            counter++;


    }

        if ((!IsPossible(currenti,currentj,counter,c))  ){
            goto Start;
        }

    }

        for ( i=0;i<=62; i++) {

        delay(700),fillcell(im[i][0],im[i][1]);
    }
        for ( i=0;i<=62; i++) {
            t[im[i][0]][im[i][1]]=i+1;
    }
        for ( i=0;i<=7; i++) {

        for( j=0;j<=7; j++){
            if(    t[i][j]==0)delay(700),fillcell(i,j);

        }
            }
        //cout<<"\nGraphical Answer:\n";
            for ( i=0;i<=7; i++) {
        for( j=0;j<=7; j++){
            t[i][j]==0?t[i][j]=64:t[i][j]=t[i][j];
            //cout<<setw(3)<<t[i][j]<<"";
        }
        //cout<<endl;
        getch();
    }

}

۱۵-فروردین-۱۳۸۷, ۱۳:۰۰:۱۵
ارسال‌ها
پاسخ
lord_viper غایب
مدیر کل انجمن
*****

ارسال‌ها: 3,949
موضوع‌ها: 352
تاریخ عضویت: بهمن ۱۳۸۴

تشکرها : 5193
( 9875 تشکر در 2650 ارسال )
ارسال: #2
RE: شبیه سازی حرکت اسب شطرنج
سلام حسین جان
قانونش اینجوریه
1 تمام حرکات بعدی اسب رو پیدا میکنی
2 در هر حرکت بعدی حساب میکنی که اسب چند حرکت دیگه میتونه انجام بده
3 در اخر اسب رو در خانهای که کمترین حرکت بعدی رو میتونه داشته باشه میگزاریم
ببخشید خیلی خلاصه گفتم
موفق باشید
۱۵-فروردین-۱۳۸۷, ۱۳:۴۸:۱۹
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : HoseinVig
ajlajlajl آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 2,192
موضوع‌ها: 70
تاریخ عضویت: مهر ۱۳۸۴

تشکرها : 932
( 2618 تشکر در 1020 ارسال )
ارسال: #3
RE: شبیه سازی حرکت اسب شطرنج
ولی خداییش انیمیشنشه که منو کشته.

میزان رای دشمن است!
[تصویر:  cff100.png]
۱۵-فروردین-۱۳۸۷, ۱۶:۰۵:۳۱
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : HoseinVig
HoseinVig آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 1,165
موضوع‌ها: 97
تاریخ عضویت: مرداد ۱۳۸۵

تشکرها : 4768
( 2464 تشکر در 677 ارسال )
ارسال: #4
RE: شبیه سازی حرکت اسب شطرنج
نقل قول: ولی خداییش انیمیشنشه که منو کشته.
آخ ، من متعلق به شمامBiggrin
نقل قول: سلام حسین جان
قانونش اینجوریه
1 تمام حرکات بعدی اسب رو پیدا میکنی
2 در هر حرکت بعدی حساب میکنی که اسب چند حرکت دیگه میتونه انجام بده
3 در اخر اسب رو در خانهای که کمترین حرکت بعدی رو میتونه داشته باشه میگزاریم
ببخشید خیلی خلاصه گفتم
موفق باشید
تا دومیشو بو برده بودم اما دقیقا نمیدونستم
متوجه شدم فقط اگه تونستی اینایی که گفتی unzip کن بهتر متوجه شم.

یه چیزه دیگه راه هایی که وجود داره مختلفه یا همیشه یه راه رو میره تا آخر ؟
میشه کاری کرد اتفاقی هر بار یک راه جدا گونرو بره اما بازم وارد همه خونه ها بشه؟

۱۵-فروردین-۱۳۸۷, ۲۰:۵۳:۱۶
ارسال‌ها
پاسخ
lord_viper غایب
مدیر کل انجمن
*****

ارسال‌ها: 3,949
موضوع‌ها: 352
تاریخ عضویت: بهمن ۱۳۸۴

تشکرها : 5193
( 9875 تشکر در 2650 ارسال )
ارسال: #5
RE: شبیه سازی حرکت اسب شطرنج
راحت تر این است که با استفاده از تابع بازگشتی بروی .
حتما باید بررسی کرد در این خانه ای که هست از این خانه فرضا چند حرکت می تواند داشته باشد اون حرکتی انتخاب می شود که کمترین حرکت ممکن را در مرحله ی بعدی داشته باشد .
مثلا اسب در 3 حرکت می تواند داشته باشد (در این خانه ای که هست ) حرکت اول را اگر بکند در حرکت بعدی 4 حرکت می تواند انجام دهد حرکت دوم را اگر بکند 3 حرکت در حرکت بعدی می تواند داشته باشد وحرکت سوم را اگر بکند در حرکت بعدی 1 حرکت خواهد داشد پس حرکت سوم را انتخاب باید کند که در حرکت بعدی کمترین حرکت را دارد.
کد:
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 خانه قرار گیرد ، یکی از خانه های موجود برای حرکت بعدی خود را از دست داده است ، چرا که یک بار از آنجا عبور کرده .
موفق باشید
۱۶-فروردین-۱۳۸۷, ۰۶:۳۴:۵۰
وب سایت ارسال‌ها
پاسخ
HoseinVig آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 1,165
موضوع‌ها: 97
تاریخ عضویت: مرداد ۱۳۸۵

تشکرها : 4768
( 2464 تشکر در 677 ارسال )
ارسال: #6
RE: شبیه سازی حرکت اسب شطرنج
آقا دستت درد نکنه .خیلی ممنونم
مشکل به کل بر طرف شد الان برنامشو نوشتم

۲۹-فروردین-۱۳۸۷, ۱۶:۲۳:۲۴
ارسال‌ها
پاسخ


موضوعات مرتبط با این موضوع...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  [سوال] پیاده سازی لگوریتم چبیشف-ارنولدی arj1991 0 1,737 ۲۱-دى-۱۳۹۲, ۲۱:۱۹:۲۱
آخرین ارسال: arj1991
  پیاده سازی الگوریتم استراسن myklik 5 9,940 ۰۱-دى-۱۳۹۰, ۱۲:۳۴:۵۶
آخرین ارسال: ashkan wolf
  الگوریتم های مرتب سازی اعداد با زبان c reza555 0 5,840 ۲۹-آذر-۱۳۸۹, ۲۱:۱۵:۴۹
آخرین ارسال: reza555

پرش به انجمن:


کاربرانِ درحال بازدید از این موضوع: 1 مهمان

صفحه‌ی تماس | IranVig | بازگشت به بالا | | بایگانی | پیوند سایتی RSS