November 2nd, 2007

Example source code for labirin in C programming language..
#include<stdio.h>
#include<windows.h>
int pengarah(char labirin[12][12],int sb[2],int arah);
void move(char labirin[12][12],int sb[2]);
void cetak(char labirin[12][12]);
int main()
{
system(”PAUSE”);
char labirin [12][12]=
{{”##.#########”},
{”#…#……#”},
{”..#.#.####.#”},
{”###.#….#.#”},
{”#….###.#.#”},
{”##…#.#.#.#”},
{”#….#…#.#”},
{”##.#####.#.#”},
{”#……..#.#”},
{”######.###.#”},
{”#……#…#”},
{”##########.#”}};
int sb[2]={0,2};//sb[0]=x,sb[1]=y
int j,i;
if(labirin[1][2]==’#’ && labirin[0][3]==’#')
//jika pintu masuk dihalangi dinding
{
labirin[0][2]=’O';
Sleep(500);//selang waktu 500 ms = 1/2 s
cetak(labirin);
Sleep(500);//selang waktu 500 ms = 1/2 s
printf(”\nLabirin buntu”);
return;
}
move(labirin,sb);//jalankan fungsi move
}
void cetak(char labirin[12][12])//fungsi untuk mencetak labirin
{
int i,j;
system(”cmd /c cls”);
for(i=0;i<12;i++)
{
for(j=0;j<12;j++)
{
printf(”%c “,labirin[j][i]);
}
printf(”\n”);
}
}
int pengarah(char labirin[12][12],int sb[2] ,int arah)
//fungsi untuk menentukan gerak yang akan dilakukan robot
//fungsi ini menggunakan bantuan sb bantuan untuk memudahkan pengecekan jalan
//fungsi ini menggunakan sistem rotasi dalam bidang cartesius
//posisi titik sb relatif,tergantung kemana robot sedang mengarah
{
int i,temp;//t sebagai temporary file
int a[]={0,1};//titik sb di sebelah kanan robot
int b[]={1,0};//titik sb di depan robot
int c[]={0,-1};//titik sb di sebelah kiri robot
if(arah==1)
{
//jika arah=1 atau robot belok ke kiri, maka lakukan rotasi -90 derajat
//-90 derajat didapat dari kondisi sb pada labirin
//tujuan rotasi adalah untuk menyesuaikan sb dengan arah robot
temp=a[0]; a[0]=a[1]; a[1]=-temp;
temp=b[0]; b[0]=b[1]; b[1]=-temp;
temp=c[0]; c[0]=c[1]; c[1]=-temp;
//rumus sesuai dengan rotasi dalam bidang kartesius x’=y dan y’=-x
}
else if(arah==2)
{
//jika arah=2 atau robot berbalik arah, maka lakukan rotasi -180 derajat
//-180 derajat didapat dari kondisi sb pada labirin
//tujuan rotasi adalah untuk menyesuaikan sb dengan arah robot
a[0]=-a[0]; a[1]=-a[1];
b[0]=-b[0]; b[1]=-b[1];
c[0]=-c[0]; c[1]=-c[1];
//rumus sesuai dengan rotasi dalam bidang kartesius x’=-x dan y’=-y
}
else if(arah==3)
{
//jika arah=3 atau robot belok ke kanan, maka lakukan rotasi -270 derajat
//-270 derajat didapat dari kondisi sb pada labirin
//tujuan rotasi adalah untuk menyesuaikan sb dengan arah robot
temp=a[0]; a[0]=-a[1]; a[1]=temp;
temp=b[0]; b[0]=-b[1]; b[1]=temp;
temp=c[0]; c[0]=-c[1]; c[1]=temp;
//rumus sesuai dengan rotasi dalam bidang kartesius x’=-y dan y’=x
}
if (labirin[sb[0]+a[0]][sb[1]+a[1]]==’#')
//cek apakah di sebelah kanan terdapat dinding atau tidak
{
if (labirin[sb[0]+b[0]][sb[1]+b[1]]==’.'||labirin[sb[0]+b[0]][sb[1]+b[1]]==’X')
{
//jika di kanan robot terdapat dinding dan di depan robot terdapat ‘.’ atau ‘X’ ,maka jalan terus ke depan
return 0;
//return 0 mengindikasikan gerak robot terus ke depan
}
else if(labirin[sb[0]+b[0]][sb[1]+b[1]]==’#')
{
if (labirin[sb[0]+c[0]][sb[1]+c[1]]==’.’ || labirin[sb[0]+c[0]][sb[1]+c[1]]==’X')
{
//jika di kanan robot terdapat dinding dan dikiri robot terdapat ‘.’ atau ‘X’,maka belok kiri
return 1;
//return 1 mengindikasikan gerak robot belok ke kiri
}
else
{
//jika di kanan,depan,dan kiri terdapat dinding, maka putar arah 180 derajat atau balik arah
return 2;
//return 2 mengindikasikan gerak robot berbalik arah
}
}
}
else
{
//jika di kanan robot tidak ditemukan dinding, maka belok kanan
return 3;
//return 3 mengindikasikan gerak robot ke kanan
}
}
void move(char labirin[12][12],int sb[2])
{
static int arah=0;
if (!(sb[0]==0&&sb[1]==2&&arah==0)&&sb[0]==0||sb[0]==11||sb[1]==11||sb[1]==0)
//jika sb akhir di x=0, y=0, x=11, y=11,maka lakukan perintah dibawah
//berfungsi sebagai base case
{
if(sb[0]==0 && sb[1]==2)
//jika robot kembalik ke posisi awal
{
printf(”\nLabirin Buntu”);
}
else
//jika jalan keluar selain di posisi awal
{
labirin[sb[0]][sb[1]]=’O';
cetak(labirin);
labirin[sb[0]][sb[1]]=’X';
//jalan yang telah dilalui di mark dengan ‘X’
Sleep(500);//selang waktu 500 ms = 1/2 s
cetak(labirin);
printf(”\nHore Keluar dari labirin!!”);
Sleep(5000);
}
}
else
{
labirin[sb[0]][sb[1]]=’O';
cetak(labirin);
Sleep(500);//selang waktu 500ms = 1/2 s
if(labirin[sb[0]][sb[1]]==’O’ || labirin[sb[0]][sb[1]]==’X')
labirin[sb[0]][sb[1]]=’X';
//jalan yang telah dilalui di mark dengan ‘X’
cetak(labirin);
//mencetak labirin dan keadaan robot
arah=(arah+pengarah(labirin,sb,arah))%4;
//tentukan nilai arah untuk menentukan gerak robot
//arah tidak boleh lebih dari 3 karena nilai yang dapat dilakukan:0,1,2,3
if(arah==0)sb[0]=sb[0]+1;
//jika lurus, maka gerak selanjutnya akan dilakukan pada sb x’=x+1 dan y tetap
else if(arah==1)sb[1]=sb[1]-1;
//jika belok kiri, maka gerak selanjutnya akan dilakukan pada sb y’=y-1, dan x tetap
else if(arah==2)sb[0]=sb[0]-1;
//jika berbalik arah, maka gerak selanjutnya akan dilakukan pada sb x’=x-1 dan y tetap
else if(arah==3)sb[1]=sb[1]+1;
//jika belok ke kanan, makagerak selanjutnya akan dilakukan pada sb y’=y+1 dan x tetap
move(labirin,sb);//fungsi rekursif
}
}
Posted in Logika | No Comments »