Jumat, 06 November 2015

Bantuan Kepada yang Membutuhkan Jilid-3

Kembali lagi kita berkutat ke materi yang kebetulan menarik namun penting. Kemarin kita mempelajari cara menjadi pengedit foto vintage handal tanpa melakukan apa-apa menggunakan linux. Nah hari ini saya akan menunjukkan cara membuat game tebak-tebakan menarik menggunakan IPC pipe.
Tetapi sebelum itu, seperti biasa kita perlu menyiapkan beberapa hal agar segala yang saya tulis di sini menjadi bermanfaat dan tidak disia-siakan.
-pertama siapkan sebuah komputer!
-kedua siapkan OS linux apa saja dan pastikan sudah terinstall di komputer anda!
-ketiga siapkan doa kepada tuhan agar apa yang saya jelaskan di sini berhasil diimplementasikan!


Kita mulai ya, ini nih langkah mudah teman-teman untuk membuat game tebak-tebakan sederhana.

Bag I Membuat Kodingan Utama:
1. buka gedit text editor.
2. Masukkan copy and paste tulisan di bawah ini:
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#define MAX_BUF 28

int main()

{
int x=1,pos[17], takeshi_score=0,z,other=0, player_score=0,ranjau[17],temp,total=0;
char * tmp_takeshi = "/tmp/pipe_takeshi";  // Lokasi pipe untuk menyimpan input jebakan takeshi
char * tmp_player = "/tmp/pipe_player"; // Lokasi pipe untuk mengakses hasil jawaban player
char * tmp_fscore = "/tmp/pipe_fscore"; // Lokasi pipe untuk mengakses hasil jawaban takeshi
system("clear");
for(z=1;z<=16;z++)ranjau[z]=0;
for(z=1;z<=16;z++)pos[z]=0;
do
{
printf("Benteng Takeshi : \n\n");
int p[7],sum=1,jebakan=0,t[5],a=0,j, i=0, file_takeshi, file_player,file_fscore,score=0;
puts("---------------------");
puts("|  Takeshi | Player  |");
printf("|    %d    |    %d    |\n", takeshi_score, player_score);
puts("---------------------");
puts("");
printf("Babak ke - %d\n", x++);
puts("");
puts("-------------");
puts("| 1  | 2  | 3  | 4  |");
puts("|----|----|----|----|");
puts("| 4  | 5  | 6  | 8  |");
puts("|----|----|----|----|");
puts("| 9  | 10 | 11 | 12 |");
puts("|----|----|----|----|");
puts("| 13 | 14 | 15 | 16 |");
puts("|----|----|----|----|");
puts("");
puts("Masukkan posisi antara 1 sampai 16");
int trap[MAX_BUF];
while(1){
total=0;
for(z=1;z<=16;z++) total=total+ranjau[z];
printf("Posisi %d: ",i+1);
scanf("%d",&temp);
if(temp==0||total==16) break;
if(ranjau[temp]==0){
i++;
p[i]=temp;
ranjau[temp]=1;
jebakan++;
if(i==4)break;
}
else printf("Ranjau telah di pasang, ulangi input\n");
}
total=0;
//for(z=1;z<=16;z++) total=total+ranjau[z];
p[6]=total;
p[5]=jebakan;
mkfifo(tmp_takeshi, 0666); // membuat named pipe yang akan diisi dengan jebakan takeshi
puts("Menunggu player memberikan jebakan . . ");

file_takeshi = open(tmp_takeshi, O_WRONLY); // Membuka file yang sudah dibuat dengan akses write
write(file_takeshi, p, sizeof(p)); // Menyimpan penempatan jebakan takeshi pada named pipe yang telah dibuat
close(file_takeshi);


while((file_player = open(tmp_player, O_RDONLY)) == -1) // Menunggu player mengirimkan skor dan jebakan
sleep(1);

read(file_player, trap, MAX_BUF); // Ketika dapat di open, baca inputan skor dan jebakan player

close(file_player); // menyimpan perubahan yang dilakukan, atau dapat mengirimkan signal bahwa file tersebut selesai dipakai

//printf("%d",trap[0]);
for(i=0;i<7;i++)printf("%d\n",trap[i]);
puts("Masukkan tebakan dari 1 sampai 16");//inputkan tebakan takeshi
for(i = 1; i < 5; i++)
{
printf("Posisi %d: ",i);
scanf("%d",&temp);
if(temp<=0||temp>16||pos[temp]==1){
printf("Posisi tidak valid, coba lagi\n");
i--;
}
else{
t[i]=temp;
pos[temp]=1;
}
}
//cek jebakan dan tebakan
score=0;

/*for(i=0;i<5;i++){
//printf("%d",trap[i]);
}*/
for(i = 1; i < 5; i++)
{
if(trap[6]==16&&trap[5]==0){
printf("Tidak ada jebakan yang disiapkan");
break;
}
a=0;
for(j = 1; j <= trap[5]; j++){
if(t[i] == trap[j]){
a=1;
break;

}
if(a==0)score++; 
}
other=trap[6];
p[0]=score;
mkfifo(tmp_fscore, 0666); // membuat named pipe yang akan diisi dengan jawaban takeshi
//puts("Menunggu player memberikan jebakan . . ");

file_fscore= open(tmp_fscore, O_WRONLY); // Membuka file yang sudah dibuat dengan akses write
write(file_fscore, p, sizeof(p)); // Menyimpan penempatan jebakan takeshi pada named pipe yang telah dibuat
close(file_fscore);
takeshi_score=takeshi_score+score+4-trap[0];
player_score=player_score+trap[0]+4-score;
sleep(3);
system("clear");

}while (total < 16  && other < 16);


if(takeshi_score>=20)
("Takeshi menang");
else ("Penantang menang");

return 0;

}
3. save dengan nama yang diinginkan di home.
4. Buat untuk player 2 juga
5. buka gedit text editor.
6. Masukkan copy and paste tulisan di bawah ini:
#include <fcntl.h> 
#include <stdio.h> // printf, scanf, gets, puts, dll
#include <sys/stat.h> // 
#include <unistd.h> //
#include <string.h> // fungsi string 
#define MAX_BUF 28 

int main() 

{
char * tmp_takeshi = "/tmp/pipe_takeshi"; // Lokasi pipe jebakan takeshi
char * tmp_player = "/tmp/pipe_player"; // Lokasi pipe jebakan player
char * tmp_fscore = "/tmp/pipe_fscore"; // Lokasi pipe untuk mengakses hasil jawaban hiryuu
int x=1,a,i,j,z, takeshi_score=0,pos[17],other=0, player_score=0,rnd=0,ranjau[17],temp,total=0;
for(z=0;z<=16;z++)pos[z]=0;
for(z=0;z<=16;z++)ranjau[z]=0;
system("clear");
do
{
rnd++;
int trap[MAX_BUF];

printf("Benteng Takeshi : \n\n");

int p[7],t[5],sum=1,jebakan=0, i, j, file_takeshi, file_player,file_fscore,score=0;
puts("---------------------");
puts("|  Takeshi | Player  |");
printf("|   %d     |    %d    |\n",takeshi_score, player_score);
puts("---------------------");
puts("");
printf("Babak ke - %d\n", x++);
puts("");
puts("-------------");
puts("| 1  | 2  | 3  | 4  |");
puts("|----|----|----|----|");
puts("| 4  | 5  | 6  | 8  |");
puts("|----|----|----|----|");
puts("| 9  | 10 | 11 | 12 |");
puts("|----|----|----|----|");
puts("| 13 | 14 | 15 | 16 |");
puts("|----|----|----|----|");
puts("");
puts("Menunggu Takeshi menempatkan jebakan . . ");

while((file_takeshi = open(tmp_takeshi, O_RDONLY)) == -1) // Menunggu inputan jebakan takeshi hingga file pipe dibuat (dapat di open)
sleep(1);
read(file_takeshi, trap, MAX_BUF); // Ketika dapat di open, baca inputan jebakan takeshi
close(file_takeshi); // menyimpan perubahan yang dilakukan, atau dapat mengirimkan signal bahwa file selesai dipakai

//if(rnd>1)takeshi_score=takeshi_score+trap[0]+4-score;

// inputkan tebakan player

for(i=0;i<7;i++)printf("%d\n",trap[i]);
puts("Masukkan tebakan dari 1 sampai 16");
for(i = 1; i < 5; i++)
{
printf("Posisi %d: ",i);
scanf("%d",&temp);
if(temp<=0||temp>16||pos[temp]==1){
printf("Posisi tidak valid, coba lagi\n");
i--;
}
else{
t[i]=temp;
pos[temp]=1;

}

// cek hasil tebakan dengan jebakan takeshi
score=0;
for(i = 1; i < 5; i++)
{
if(trap[6]==16&&trap[5]==0){
printf("Tidak ada jebakan yang disiapkan");
break;
}
a=0;
for(j = 1; j <= trap[5]; j++){
if(t[i] == trap[j]){
a=1;
break;
}
}
if(a==0)score++;
}
//printf("%d",score);
i=0;
puts("Menempatkan jebakan di posisi antara 1 sampai 16");//menyiapkan jebakan player
while(1){
total=0;
for(z=1;z<=16;z++) total=total+ranjau[z];
printf("Posisi %d: ",i+1);
scanf("%d",&temp);
if(temp==0||total==16) break;
if(ranjau[temp]==0){
i++;
p[i]=temp;
ranjau[temp]=1;
jebakan++;
if(i==4)break;
}
else printf("Ranjau telah di pasang, ulangi input\n");
}
total=0;
//for(z=1;z<=16;z++) total=total+ranjau[z];
p[5]=jebakan;
p[0]=score;
p[6]=total;

mkfifo(tmp_player, 0666); // membuat named pipe yang akan diisi oleh jebakan dan skor player

puts("Mengirimkan jebakan kepada Takeshi . . ");
file_player = open(tmp_player, O_WRONLY); // Membuka file yang sudah dibuat dengan akses write
write(file_takeshi, p, sizeof(p)); // Menyimpan jebakan dan skor player pada named pipe yang telah dibuat
close(file_player); // menyimpan perubahan yang dilakukan, atau dapat mengirimkan signal bahwa file selesai dipakai

while((file_fscore = open(tmp_fscore, O_RDONLY)) == -1) // Menunggu inputan jebakan takeshi hingga file pipe dibuat (dapat di open)
sleep(1);
read(file_fscore, trap, MAX_BUF); // Ketika dapat di open, baca inputan jebakan takeshi
close(file_fscore); // menyimpan perubahan yang dilakukan, atau dapat mengirimkan signal bahwa file selesai dipakai
//for(i=0;i<7;i++)printf("%d\n",trap[i]);
takeshi_score=takeshi_score+4+trap[0]-score;
player_score=player_score+score+4-trap[0];
other=trap[6];
sleep(3);
system("clear");

}while (total < 16 && other < 16);


if(player_score>=20)
printf("Penantang menang");
else printf("Takeshi menang");
return 0; 
}
7. save dengan nama yang diinginkan di home.

Menjalankan Program:

1. Buka bagian terminal pada os linux anda. Dengan cara pada tombol home ketik "terminal" tanpa tanda baca.
2. Ketik gcc *nama yang diinginkan* -o *namafile* (lakukan untuk kedua file).
3. Kemudian ketik ./*namafile*(lakukan untuk kedua file).

Aturan permainan:

-Player disediakan bom sebanyak 1-16.
-Dilarang menaruh bom di tempat yang sama 2x.
-Player dilarang menebak di tempat yang sama.
-Player bergantian memberi jebakan dan menebak tempat yang tidak di beri jebakan oleh player.
-Poin di dapat kalau player berhasil menghindari ranjau dan ranjau yang di pasang player mengenai player lawan.

Saya akan menjelaskan apa yang terjadi:

-untuk bagian yang pertama adalah user interface untuk pemain 1(saya namakan takeshi) dia adalah yang pertama memberikan jebakan pada awal ronde melalui pipe ke-1.
-setelah itu data jebakan diberikan ke pemain 2(saya namakan player).
-Player kemudian akan memberikan daftar posisi yang sekiranya tidak memiliki jebakan.
-Poin player bertambah setiap posisi yang tidak sesuai dengan jebakan yang di berikan dan poin Takeshi bertambah tiap jawaban yang diberikan sesuai dengan jebakan yang di pasang.
-Setelah itu player mengirimkan scorenya ke Takeshi melalui pipe ke-2.
-Setelah Takeshi menerima jawabannya, ia akan menjawab dan sama peraturannya dengan player.
-Score Takeshi kemudian dikirim ke player melalui pipe ke-3 agar player juga bisa melihat score Takeshi.
-Proses akan terus berulang hingga seluruh jebakan(1-16) di pasang.

Sekian rancauan saya yang kurang jelas. Mohon maaf bila ada kesalahan. 

Tidak ada komentar:

Posting Komentar