folder Tahribat.com Forumları
linefolder C - C++
linefolder C De Satnranç Tahtasında At Oynatma Programı Yardım!!!!!!



C De Satnranç Tahtasında At Oynatma Programı Yardım!!!!!!

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    ibnalahad
    ibnalahad's avatar
    Kayıt Tarihi: 27/Mayıs/2009
    Erkek

    arkadaşlar öyle bi program yazmalıym ki, satranç tahtasında at her kareye ancak bir kere uğrasın ve 64 hamlede her taşı gezsin, gezsin ve bunu kaç deneme sonunda gerçekleştirdiğini yazsın, kendi kafasına göre adam gibi bişey yazan varsa onu bana komple gönderebilir nolur yardım ya!!!  aha bu da yazdığım çalışmaya ancak compile edilebilen programcık

    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    int main(){
        int yatay[8]={2,1,-1,-2,-2,-1,1,2}, dikey[8]={-1,-2,-2,-1,1,2,2,1};(bu ikisi hamle numaralrına denk gelen hareketler yani at sonuçta 8 farklı hareket yapar)
        int i,j,k,n, sayac=0;
        int x;
        int y;
        int uranankare[8][8];
        for(i=0;i<=7;i++)
        for(j=0;j<=7;j++)
        uranankare[i][j]=0;(uranankare dizisi satranç tahtasındaki 64 kareye takiben yazılmıştır ve her bir kareye 0 dır at bi geçmesinde 1 olacak ve 1 değerini aşarsa yani at bir kez daha geçerse for döngüsü sil baştan yapacak)
        int hamle;
        uranankare[4][4]=1;
        x=4;(xler ve yler satır ve sütun numaralarını gösterir satır ve sütunlar 0 dan başlar 7 de biter)
        y=4;
        srand(time(NULL));
        for(i=0;i<=63;i++){
                           hamle=rand()%8;(bilgisayar kendi oynasın dedim ama burası beni biraz ayar edio sonuçta hiç bulmayadabilir doğru döngüyü)
                           sayac=sayac+1;
                           y+=yatay[hamle];
                           x+=dikey[hamle];
                           if(x<0 || y<0 || x>7 || y>7)
                           i=0;
                           uranankare[x][y]+=1;
                           for(k=0;k<=7;k++)
                           for(n=0;n<=7;n++)
                           if(uranankare[k][n]>1){(aynı kareye bi daha gelme durumu)
                           for(k=0;k<=7;k++)
                           for(n=0;n<=7;n++)
                           uranankare[k][n]=0;
                           i=0;
                           }
                           }
                           printf("at %d deneme sonunda doğru yolu buldu",sayac);
                           getchar();
                           getchar();
                           return 0;
                           }


    yok olmadan, varlığa ulaşamazsın
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    JUSTICE
    JUSTICE's avatar
    Kayıt Tarihi: 08/Eylül/2007
    Erkek

    4 gün geçmiş ama inş. gecikmemişimdir. Yeni gördüm.

    Ya anladığım şu: Her yaptığı yanlış hamleyi sayacaksın. Eğer buysa:
    Sen mecbur recursive(yinelenen) fonksiyon kullanmak zorundasın.
    Çünki ilerleyeceksin ilerleyeceksin olmazsa bir önceki hamleye dönüp ordan devam edeceksin.
    Bunun için fonksiyon kullanmamız lazım. Fonksiyonla kendini çağıra çağıra gidersin.
    Eğer hamle yanlış olursa return edersin.Dfs(depth first search)'de tam işimize göre.
    Hepsini tek tek deneriz.

    Kısaca dfs:

    int dfs(int x, int y)//bana en son kaldigim koordinatlar gelcek
    {
        int i,j,temp=0;
        temp=kontrol();//Burdada usedların hepsı dolu mu diye bakarsın. Doluysa 1 döner.
        if(temp) return 1;//artik tamamen dolaştığımız tescillendi. Dönüyoruz geriye
        for(int i=0; i<=7; i++)
           for(int j=0; j<=7; j++)
           {
            depth++;//burda global depth değişkeninle yaptığın deneme sayısı
            a=b=0;
            a=x+yatay[i];
            b=y+dikey[j];
            //işte burda kontrol edersin 0 dan büyüktü 8 den küçüktü fln...
                if(!used[a][b])//Burdada gittiğin yere bir daha gitmeme kontrolü
                {
                    used[a][b]=1;//Girerken gidildi diyoruz.
                    temp=dfs(a,b);
                    if(temp) return 1;//Geri dönüş...
                    used[a][b]=0;//Çıkarken siliyoruz.
                 }
           }
           return 0;
    }

    //En son mainde de depth'i yazdırsan tamamdır işin heralde. Bu arada mainden fonksiyon çağırdığına değer 0 dönerse. Anlaki at dolaşamamış :)

    Niyese içimden bir ses yanlış anladın diyor :)
    C yazmayalı uzun zaman oldu. Not Defterinde yazdım. Compiler falan yok. Hatamız varsa affola...

Toplam Hit: 1741 Toplam Mesaj: 2