*Sitemize Üye Olunca Elinize Ne Geçer?

<--- 1. Üye Olarak Linkleri Görebilirsiniz... --->

<--- 2. İstediğiniz Kadar Paylaşım Yapabilirsiniz... --->

<--- 3. Güzel Bir Forum Hayatı Yaşayabilirsiniz... --->


Join the forum, it's quick and easy


*Sitemize Üye Olunca Elinize Ne Geçer?

<--- 1. Üye Olarak Linkleri Görebilirsiniz... --->

<--- 2. İstediğiniz Kadar Paylaşım Yapabilirsiniz... --->

<--- 3. Güzel Bir Forum Hayatı Yaşayabilirsiniz... --->

Would you like to react to this message? Create an account in a few clicks or log in to continue.

● En Güncel Paylaşım Platformu ●

---Misafir--- Hos Geldiniz Daha iyi Bir Hizmet İçin Üye olunuz.ÜyeLer Link GörebiLir

    Rasgele Labirent Oluşturma ve Çözme

    MnyTirith
    MnyTirith
    ● Admin ●
    ● Admin ●


    <b>Doğum tarihi</b> Doğum tarihi : 20/06/90

    Rasgele Labirent Oluşturma ve Çözme Empty Rasgele Labirent Oluşturma ve Çözme

    Mesaj tarafından MnyTirith Salı Mart 09, 2010 11:36 am

    Aşağıdaki program çalışan ve bir şeye benzeyen ilk C programım
    diyebilirim Smile Tabii ilk programım olmasından dolayı optimum şekilde
    çalışmıyor olabilir. Ayrıca programı yazdığım zamanda görsel programlama
    namına bir şey bilmediğim için program konsoldan çalışıyor.

    Sadece kod verip bırakmak istemedim ve az da olsa ne yaptığımı
    açıklayım dedim. Öncelikle programın üç ana özelliğini belirtmeliyim
    sanırım;


    -Her seferinde rasgele bir labirent oluşturulacak
    -Labirent üzerinde kapalı yani ulaşılamayan bir bölge olmayacak
    -Son olarak labirent çözülecek Smile
    Ana hatları söyledikten sonra programın çalışmasına gelelim.
    Labirenti oluşturacak alan belirlendikten sonra (ör 10×10) bu çerçeve
    üzerinde bulunan her noktayı bir listeye ekleniyor. Daha sonra bu
    noktalardan biri rasgele olarak seçiliyor. Bu nokta başlangıç alınarak
    daha önceden belirlenen adım sayısı kadar rasgele yönlerde ilerlenerek
    duvar örülüyor. Rasgele yönlerde atılan bu adımlar sonrasında oluşan
    yeni duvarlar çerçevenin olduğu listeye ekleniyor. Başlangıç olarak
    seçtiğimz ilk nokta ise listeden siliniyor.Yeni bir adım atılıp duvar
    örüldüğünde dikkat edilmesi gereken nokta ise kapalı alan
    oluşturmamaktır.

    Labirenti çözmek ise oluşturmaktan çok daha kolay. Klasik self
    avoding walk
    algoritmasıyla çözüme gidilmiştir. Labirentin
    sol en üst köşesi başlangıç, sağ en alt köşesi ise bitiş noktası olarak
    belirlenmiş ve çözüm ona göre çalışmaktadır. Tabii değiştirmek sizin
    elinizde Smile
    view
    source

    [Linkleri görebilmek için üye olun veya giriş yapın.]

    001///////////////////////////////////////////////////
    002/* HEADER
    DOSYALARI */
    003///////////////////////////////////////////////////
    004#include "conio.h"
    005#include "stdlib.h"
    006#include "stdio.h"
    007#include "iostream.h"
    008#define STEP 5
    009#define YOL 0
    010#define YOL2 1
    011#define GEREKSIZ -6
    012#define DUVAR -2
    013#define pasifDUVAR -5
    014#define DUGUM -1
    015#define eskiDUGUM -3
    016#define pasifDUGUM -4
    017#include
    018
    019///////////////////////////////////////////////////
    020/* LISTE
    YAPISI */
    021///////////////////////////////////////////////////
    022struct Item {
    023 struct Item *next;
    024 int val1,val2; // Dizi iki boyutlu oldugu icin 2 elemanli liste
    olusturdum.
    025};
    026
    027struct List {
    028 struct Item *list;
    029};
    030
    031///////////////////////////////////////////////////
    032/* LISTE
    FONKSIYONLARININ PROTOTIPLERI */
    033///////////////////////////////////////////////////
    034 struct List *liste_yarat(struct List
    *pl); //Liste Olusturuyor
    035 void listeye_ekle(struct List
    *pl,int,int); //Listeye eleman
    ekliyor
    036 void listeden_sil(struct
    List *pl,int,int); //Listeden
    eleman siliyor
    037 void liste_gez(struct List *pl,int ,int& , int&); //Listeden n. siradaki elemani aliyor
    038 void liste_goster(struct List
    *pl); //Lisde
    degerlerini yazdiriyor
    039 int uzunluk(struct List
    *pl); //Liste
    uzunlugunu veriyor
    040 bool arama(int,int);
    //listede eleman ariyor
    041///////////////////////////////////////////////////
    042/* DIGER FONKSIYON
    PROTOTIPLERI */
    043///////////////////////////////////////////////////
    044 void degeryaz(int **);
    //ekrana labirenti ciziyor
    045 void diziyap();
    //dinamik dizi olusturuyor
    046 void duzenle();
    //bos labirent olusturuyor
    047 void kontrol(int,int);
    //kapali alan kontrolu yapiyor
    048 void ilerle(int ,int);
    //duvar olusturuyor
    049 int rasgele(int);
    //random sayi uretiyor
    050 void devam(int, int);
    //adim sayisini tutuyor
    051 void ayikla();
    //gereksiz dugumleri ayikliyor
    052 void labirent();
    //Genel fonksiyon
    053 void yonbul(int , int );
    //cikis yolunu buluyor
    054 int adim_sayisi();
    //cikisa kac adim var
    055///////////////////////////////////////////////////
    056/* KULLANACAGIM
    DEGISKENLER, GLOBAL */
    057///////////////////////////////////////////////////
    058 int **dizi,**dizii,x,y,val1,val2,yon,adim=0,varmi=0;
    059/*/////////////////////////////////////////////////////
    060//dizi=>Labirenti
    tutuyor //
    061//x,y=> labirent
    boyutlari //
    062//val1,val2=>Liste
    degerlerini almak icin kullandim //
    063//yon=>gidilecek yonu
    tutuyor //
    064//adim=>kac adim
    gidildigini tutuyor //
    065//varmi=>labirent olup
    olmadigini tutuyor //
    066*//////////////////////////////////////////////////////
    067
    068 struct List *l1;
    069
    070//###############################################//
    071/* MAIN
    FONKSIYONU */
    072//###############################################//
    073
    074main(){
    075
    076 l1=liste_yarat(l1);
    // Listemi yaratyiyorum
    077 char ch='1'; // Kullanici arayuzu
    078 while(ch!='2') {
    079 cout<<<
    080 "0-Ekrani temizle"<<<
    081 "1-Yeni labirent Olustur"<<<
    082 "2-Programdan Cik"<
    083 if(varmi==1){
    084 cout<<"3-Labirenti
    Coz"<
    085 }
    086 ch=getch();
    087 if(ch=='1'){
    088 clrscr();labirent();yonbul(1,1);varmi=1;
    089 }
    090 else
    if (ch=='2'){
    091 clrscr();
    092 cout<<<
    093 "Veri Yaplilari Labirent Olusturma Odevi\\nYazan:Ahmet
    KAKICI - 150165\\nCikmak icin herhangi bir tusa basiniz.";
    094 getch();
    095 }
    096 else
    if(ch=='3'){
    097 clrscr();
    098 degeryaz(dizi);
    099 cout<
    100 degeryaz(dizii);
    101 cout<<"Labirentten
    "<<<" adimda cikildi."<
    102 varmi=0;
    103 }
    104 else
    if(ch=='0'){
    105 clrscr();
    106 }
    107 }
    108}
    109
    110//////////////////////////////////////////////////
    111/* SELF AVOIDING WALK ve
    LABIRENTTEN CIKIS */
    112//////////////////////////////////////////////////
    113
    114void yonbul(int a, int b){
    115
    116 int xMax=x-1,yMax=y-1;
    117 if(a==x-2 &&
    b==y-2){
    118 for(int i=0;i
    119 for(int j=0;j
    120 dizii[i][j]=dizi[i][j];
    121 return;
    122 }
    123
    124 if(b+2
    && dizi[a][b+2]==YOL){
    125 dizi[a][b+2]=YOL2;
    126 yonbul(a,b+2);
    127 dizi[a][b+2]=YOL;
    128 }
    129 if(a-2>0 &&
    dizi[a-1][b]==pasifDUVAR && dizi[a-2][b]==YOL){
    130 dizi[a-2][b]=YOL2;
    131 yonbul(a-2,b);
    132 dizi[a-2][b]=YOL;
    133 }
    134 if(b-2>1 &&
    dizi[a][b-1]==pasifDUVAR && dizi[a][b-2]==YOL){
    135 dizi[a][b-2]=YOL2;
    136 yonbul(a,b-2);
    137 dizi[a][b-2]=YOL;
    138 }
    139 if(a+2
    dizi[a+1][b]==pasifDUVAR && dizi[a+2][b]==YOL){
    140 dizi[a+2][b]=YOL2;
    141 yonbul(a+2,b);
    142 dizi[a+2][b]=YOL;
    143 }
    144}
    145///////////////////////////////////////////////////
    146/* LABIRENT OLUSTURMA
    FONKSIYONU */
    147///////////////////////////////////////////////////
    148void labirent(){
    149 srand(time(NULL));
    150 cout<<<"Labirent boyutlarini gir"<<<"x=";
    151 cin>>x;
    152 cout<<<"y=";
    153 cin>>y;
    154 diziyap();
    155 duzenle();
    156
    157 while((uzunluk(l1))>0){
    158 liste_gez(l1,rasgele(uzunluk(l1)),val1,val2);
    159 ilerle(val1,val2);
    160 ayikla();
    161 }
    162 degeryaz(dizi);
    163}
    164///////////////////////////////////////////////////
    165/* DIZI OLUSTURMA
    FONKSIYONU */
    166///////////////////////////////////////////////////
    167void diziyap()
    168{
    169 x=x*2+1;
    170 y=y*2+1;
    171 dizi=new int
    *[x];
    172 dizii=new int
    *[x];
    173 for(int i=0;i
    174 dizi[i]=new int[y];
    175 dizii[i]=new int[y];
    176 }
    177}
    178///////////////////////////////////////////////////
    179/* RASGELE SAYI URETEN
    FONKSIYON */
    180///////////////////////////////////////////////////
    181int rasgele(int
    n)
    182{
    183 return rand()%n;
    184}
    185///////////////////////////////////////////////////
    186/* ADIM SAYISINI TUTAN
    FONKSIYON */
    187///////////////////////////////////////////////////
    188int adim_sayisi()
    189{
    190 int adimSayisi=0;
    191 for(int i=0;i
    192 for(int j=0;j
    193 if(dizii[i][j]==YOL2){
    194 adimSayisi++;
    195 }
    196 }
    197 }
    198 return adimSayisi;
    199}
    200///////////////////////////////////////////////////
    201/* DIZI DEGERLERINI YAZAN
    FONKSIYON */
    202///////////////////////////////////////////////////
    203void degeryaz(int
    **dizim){
    204 for(int i=0;i
    205 for(int j=0;j
    206 if(dizim[i][j]==DUVAR)
    207 cout<<'\\xDB'<<'\\xDB';
    208 else if(dizim[i][j]==YOL)
    209 cout<<" "<<" ";
    210 else if(dizim[i][j]==YOL2)
    211 cout<<"_"<<"_";
    212 else if
    (dizim[i][j]==pasifDUGUM)
    213 cout<<'\\xDB'<<'\\xDB';
    214 else if
    (dizim[i][j]==eskiDUGUM ||dizim[i][j]==GEREKSIZ
    || dizim[i][j]==-2 )
    215 cout<<'\\xDB'<<'\\xDB';
    216 else cout<<' '<<" ";
    217 }
    218 cout<
    219 }
    220}
    221///////////////////////////////////////////////////
    222/* LABIRENTIN BOS
    HALINI OLUSTURUYOR */
    223/* ILK DUGUM NOKTALARINI
    LISTEYE ATIYOR */




    En son TanriLar_OkuLu tarafından Perş. Mayıs 06, 2010 4:52 pm tarihinde değiştirildi, toplamda 1 kere değiştirildi
    MnyTirith
    MnyTirith
    ● Admin ●
    ● Admin ●


    <b>Doğum tarihi</b> Doğum tarihi : 20/06/90

    Rasgele Labirent Oluşturma ve Çözme Empty Geri: Rasgele Labirent Oluşturma ve Çözme

    Mesaj tarafından MnyTirith Salı Mart 09, 2010 11:37 am

    224///////////////////////////////////////////////////
    225void duzenle(){
    226 int xx,yy;
    227 xx=x-1;
    228 yy=y-1;
    229 for(int i=0;i
    230 for(int j=0;j
    231 if( i==0 || j==0
    ||
    i==xx || j==yy)
    232
    dizi[i][j]=GEREKSIZ; //KENARLARDAKI GEREKSIZ YERLER
    233 if( ( (j==0
    ||j==yy)
    && j%2==0)|| ( (i==0||i==xx) && i%2==0) ){
    234 dizi[i][j]=DUGUM;
    //LABIRENTIN KENARLARINI
    235
    listeye_ekle(l1,i,j); //LISTEYE EKLE
    236 }
    237 else if
    (i%2!=0
    && j%2!=0){ //GIDILECEK YOLLAR
    238 dizi[i][j]=YOL;
    239 }
    240 else if( ((i%2!=0
    && j!=0 && j!=yy)
    && j%2==0)||(i%2==0
    && (i!=0 && i!=xx
    && j%2!=0)) ){
    241
    dizi[i][j]=pasifDUVAR; //PASIF DUVARLAR
    242 }
    243 else if(i%2==0
    && j%2==0){
    244
    dizi[i][j]=pasifDUGUM; //PASIF DUGUMLER
    245 }
    246 //else dizi[i][j]=8;
    247 }
    248 }
    249 //LABIRENTIN KOSELERINDEKI
    DUGUMLERI LISTEDEN SIL
    250
    listeden_sil(l1,0,0);dizi[0][0]=eskiDUGUM;
    251
    listeden_sil(l1,xx,0);dizi[xx][0]=eskiDUGUM;
    252
    listeden_sil(l1,0,yy);dizi[0][yy]=eskiDUGUM;
    253
    listeden_sil(l1,xx,yy);dizi[xx][yy]=eskiDUGUM;
    254}
    255///////////////////////////////////////////////////
    256/* LABIRENTTE DUVAR OREREK
    ILERLEME
    FONKSIYONU */
    257///////////////////////////////////////////////////
    258void ilerle(int
    Xnokta,int

    Ynokta){
    259 yon=rasgele(4);
    260 int a=Xnokta;
    261 int b=Ynokta;
    262
    263 if(Xnokta==0)yon=3;
    264 if(Ynokta==0)yon=1;
    265 if(Xnokta==x-1)yon=0;
    266 if(Ynokta==y-1)yon=2;
    267 //liste_goster(l1);
    268
    269 // Kuzey => 0 ,
    dogu
    =>1 , bati=>2 , guney=> 3,
    270 if(yon==0){ //KUZEY
    271 if(a-2>0){
    272
    if(dizi[a-2][b]==pasifDUGUM){
    273 dizi[a-1][b]=DUVAR;
    274 kontrol(a-2,b);
    275 kontrol(a,b);
    276 devam(a-2,b);
    277 }
    278 }
    279 }
    280
    281 if(yon==1){ //
    DOGU
    282 if(b+2
    283
    if(dizi[a][b+2]==pasifDUGUM){
    284 dizi[a][b+1]=DUVAR;
    285 kontrol(a,b+2);
    286 kontrol(a,b);
    287 devam(a,b+2);
    288 }
    289 }
    290 }
    291 if(yon==2){ // BATI
    292 if(b-2<0){
    293
    if(dizi[a][b-2]==pasifDUGUM){
    294 dizi[a][b-1]=DUVAR;
    295 kontrol(a,b-2);
    296 kontrol(a,b);
    297 devam(a,b-2);
    298 }
    299 }
    300 }
    301 if(yon==3){ //
    GUNEY
    302 if(a+2
    303
    if(dizi[a+2][b]==pasifDUGUM){
    304
    dizi[a+1][b]=DUVAR;
    305 kontrol(a+2,b);
    306 kontrol(a,b);
    307 devam(a+2,b);
    308 }
    309 }
    310 }
    311
    312} //gezi func. sonu
    313
    314void devam(int Xnokta,int Ynokta)
    315{
    316 if(adim
    317 adim++;
    318 ilerle(Xnokta,Ynokta);
    319 }
    320 else{
    321 adim = 0;
    322 }
    323}
    324
    ///////////////////////////////////////////////////
    325/* AYIKLA

    FONKSIYONU */
    326//////////////////////////////////////////////////
    327void ayikla(){
    328 for (int i=0;i
    329 liste_gez(l1,i,val1,val2);
    330 kontrol(val1,val2);
    331 }
    332}
    333////////////////////////////////////////////////////
    334/* KONTROL
    FONKSIYONU
    */
    335//////////////////////////////////////////////////
    336void kontrol(int
    Xnokta,int
    Ynokta)
    337{
    338 int cevre = 0;
    339
    340 if(Ynokta+2
    341
    if(dizi[Xnokta][Ynokta+2]==pasifDUGUM
    ){
    342 cevre++;
    343 }
    344 }
    345 if(Ynokta-2>0){
    346
    if(dizi[Xnokta][Ynokta-2]==pasifDUGUM
    ){
    347 cevre++;
    348 }
    349 }
    350 if(Xnokta+2
    351
    if(dizi[Xnokta+2][Ynokta]==pasifDUGUM
    ){
    352 cevre++;
    353 }
    354 }
    355 if(Xnokta-2>0){
    356 if(
    dizi[Xnokta-2][Ynokta]==pasifDUGUM){
    357 cevre++;
    358 }
    359 }
    360 if (cevre==0){
    361
    dizi[Xnokta][Ynokta]=eskiDUGUM;
    362
    listeden_sil(l1,Xnokta,Ynokta);
    363 }
    364 else if( cevre!=0 &&
    (dizi[Xnokta][Ynokta]!=DUGUM)){
    365
    if(!(arama(Xnokta,Ynokta))){
    366
    listeye_ekle(l1,Xnokta,Ynokta);
    367 }
    368 dizi[Xnokta][Ynokta]=DUGUM;
    369 }
    370}
    371
    ///////////////////////////////////////////////////
    372/* LISTE
    FONKSIYONLARI
    */
    373///////////////////////////////////////////////////
    374
    375///////////////////////////////////////////////////
    376/* LISTE YARATMA
    FONKSIYONU
    */
    377//////////////////////////////////////////////////
    378struct List *liste_yarat(struct
    List *pl){
    379 pl=(struct List *)malloc(sizeof(struct List));
    380 pl->list=0;
    381 return pl;
    382}
    383///////////////////////////////////////////////////
    384/* LISTE UZUNLUGUNU
    BULAN
    FONKSIYON */
    385///////////////////////////////////////////////////
    386int uzunluk(struct
    List *pl){
    387 struct Item
    *tmp=pl->list;
    388 int uzun=0;
    389 while(tmp){
    390 uzun++;
    391 tmp=tmp->next;
    392 }
    393 return(uzun);
    394}
    395///////////////////////////////////////////////////
    396/* LISTEDEN ELEMAN
    SILEN
    FONKSIYON */
    397///////////////////////////////////////////////////
    398void listeden_sil(struct
    List
    *pl,int
    val1,int
    val2){
    399 struct Item *prv, *pt =
    pl->list;
    400 if ( (pt) &&
    (pt->val1==val1)&&(pt->val2==val2)
    ){
    401 pl->list= pt->next;
    402 free(pt);
    403 }
    404 else if (pt){
    405 for ( prv=pt, pt=
    pt->next;
    406 ((pt) &&
    ((pt->val1 != val1) ||
    (pt->val2 != val2)));
    407 prv=prv->next,
    pt=pt->next);
    408 if ( (pt)&&
    (pt->val1==val1)
    && (pt->val2==val2) ){
    409
    prv->next=pt->next;
    410 free(pt);
    411 }
    412 }
    413}
    414///////////////////////////////////////////////////
    415/* LISTE ELEMANLARINI
    YAZDIRAN
    FONKSIYON */
    416///////////////////////////////////////////////////
    417void liste_goster(struct
    List
    *pl){
    418 struct Item
    *tmp=pl->list;
    419 while (tmp){
    420 printf("%d ", tmp->val1)
    ;
    421 printf("%d \\n", tmp->val2)
    ;
    422 tmp=tmp->next;
    423 }
    424}
    425///////////////////////////////////////////////////
    426/* LISTE BASINA ELEMAN
    EKLEYEN
    FONKSIYON */
    427///////////////////////////////////////////////////
    428void listeye_ekle(struct
    List
    *pl,int
    val1, int
    val2) {
    429 struct Item *pt=(struct Item
    *)malloc(sizeof(struct Item));
    430 pt->val1=val1;
    431 pt->val2=val2;
    432 pt->next=pl->list;
    433 pl->list=pt;
    434}
    435///////////////////////////////////////////////////
    436/* LISTEDEN n. ELEMANI
    ALMA
    FONKSIYONU */
    437///////////////////////////////////////////////////
    438void liste_gez(struct
    List
    *pl,int
    n,int
    &val1, int
    &val2){
    439 struct Item
    *tmp=pl->list;
    440 while(n-->0){
    441 tmp=tmp->next;
    442 }
    443 val1=tmp->val1;
    444 val2=tmp->val2;
    445}
    446bool arama(int xVal,int yVal){
    447 struct Item
    *tmp=l1->list;
    448 int uzun=uzunluk(l1);
    449 while(uzun-->0){
    450 if(tmp->val1==xVal
    &&
    tmp->val2==yVal){
    451 return true;
    452 }
    453 tmp=tmp->next;
    454 }
    455 return false;
    456}

      Forum Saati Ptsi Mayıs 13, 2024 11:29 am