Aşağıdaki program çalışan ve bir şeye benzeyen ilk C programım
diyebilirim 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
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 view
source
[Linkleri görebilmek için üye olun veya giriş yapın.]
diyebilirim 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
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 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 | /////////////////////////////////////////////////// |
022 | struct Item { |
023 | struct Item *next; |
024 | int val1,val2; // Dizi iki boyutlu oldugu icin 2 elemanli liste olusturdum. |
025 | }; |
026 |
027 | struct 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 |
074 | main(){ |
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 |
114 | void 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 | /////////////////////////////////////////////////// |
148 | void 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 | /////////////////////////////////////////////////// |
167 | void 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 | /////////////////////////////////////////////////// |
181 | int rasgele(int n) |
182 | { |
183 | return rand()%n; |
184 | } |
185 | /////////////////////////////////////////////////// |
186 | /* ADIM SAYISINI TUTAN FONKSIYON */ |
187 | /////////////////////////////////////////////////// |
188 | int 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 | /////////////////////////////////////////////////// |
203 | void 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