Pada kesempatan ini, saya akan membuat tutorial tentang cara membuat game tebak tentara. Game ini berbasis console jadi, tidak ada graphics yang cantik seperti yang Anda bayangkan. Namun, pada game ini mungkin bisa melatih atau meningkatkan pola pikir algoritma pemrograman Anda. Tutorial ini lumayan...

Pembuatan Game Tebak Tentara di Pascal (Part 1)

Pada kesempatan ini, saya akan membuat tutorial tentang cara membuat game tebak tentara. Game ini berbasis console jadi, tidak ada graphics yang cantik seperti yang Anda bayangkan. Namun, pada game ini mungkin bisa melatih atau meningkatkan pola pikir algoritma pemrograman Anda. Tutorial ini lumayan panjang jadi, saya akan membuatnya secara bertahap. Untuk part 1, saya akan membuatnya sampai sebatas tampilannya saja. Dan mudah-mudahan tutorial ini bisa cepat selesai. Pada tutorial ini, saya menggunakan bahasa Pascal. Mungkin bagi Anda yang belum bisa Pascal bisa mencobanya di bahasa pemrograman lainnya yang bisa Anda kuasai.

Dalam pembuatan game ini beberapa teknik yang akan kita pakai ialah, If Else, Prosedur(disebut method dalam Java), Perulangan(Looping), Array 1 dan 2 dimensi. Untuk mempersingkat waktu langsung saja ikuti tutorial berikut secara bertahap dan pelan – pelan.

  1. Pertama, buat coding seperti berikut. Pada coding ini, kita hanya mendeklarasikan variable dan array yang akan kita pakai nantinya dalam pembuatan game ini.
    {Deklarasi Variable dan Array}
    var
    	nama_user			:string;
    	MyArmy_X			:array[1..4] of integer;
    	MyArmy_Y			:array[1..4] of integer;
    	ComArmy_X			:array[1..4] of integer;
    	ComArmy_Y			:array[1..4] of integer;
    	Kondisi_MyArmy_XY	:array[1..4, 1..4] of string;
    	Kondisi_ComArmy_XY	:array[1..4, 1..4] of string;
    	user, com			:string;
    	tebak_x_user		:integer;
    	tebak_y_user		:integer;
    	tebak_x_com			:integer;
    	tebak_y_com			:integer;
    	benar				:boolean;
    	again				:boolean;
    	skor_user			:integer;
    	skor_com			:integer;
    	x, y, z				:integer;
  2. Setelah itu, buatlah prosedur berikut untuk menginisialisasikan nilai Array yang akan kita pakai nanti untuk mengidentifikasi apakah posisi tentara sudah dibuka atau belum.
    {Prosedur Inisialisasi Kondisi MyArmy XY dan Kondisi ComArmy XY}
    procedure InitKondisiMyArmy;
    var
    	a, b, c	:integer;
    begin
    	for a := 1 to 4 do
    	begin
    		for b := 1 to 4 do
    		begin
    			Kondisi_MyArmy_XY[a, b] := 'tutup';
    			Kondisi_ComArmy_XY[a, b] := 'tutup';
    		end;
    	end;
    end;
  3. Dan ketiga, tambahkan coding berikut ke dalam Main. Dimana, coding ini akan menampilkan interface yang akan menanyakan Nama user.
    (*Tanya nama si user*)
    write('Masukkan Nama Anda : ');	readln(nama_user);
  4. Keempat, tambahkan coding berikut setelah coding diatas. Dimana, coding berikut akan menanyakan si user dimana posisi tentara si user akan diletakkan.
    (*Buat inputan untuk menanyakan mau diposisikan dimana tentara si user*)
    gotoxy(1, wherey+1);
    write('Posisikan tentara kamu pada Koordinat berikut');
    
    (*Posisi semua tentara tidak boleh ada yang sama*)
    (*Tentara 1*)
    again := false;
    repeat
    begin
    	gotoxy(1, wherey+1);
    	write('Tentara 1, Koordinat X [1..4] : ');	readln(MyArmy_X[1]);
    	write('Tentara 1, Koordinat Y [1..4] : ');	readln(MyArmy_Y[1]);
    	again := true;
    
    	(*Posisi tentara harus berada diantara 1 sampai 4*)
    	if(MyArmy_X[1] < 1) or (MyArmy_Y[1] < 1) or (MyArmy_X[1] > 4) or (MyArmy_Y[1] > 4) then
    	begin
    		writeln('Koordinat harus diantara 1 - 4 !!!');
    		again := false;
    	end;
    end
    until again = true;
    
    (*Tentara 2*)
    again := false;
    repeat
    begin
    	gotoxy(wherex, wherey+1);
    	write('Tentara 2, Koordinat X [1..4] : ');	readln(MyArmy_X[2]);
    	write('Tentara 2, Koordinat Y [1..4] : ');	readln(MyArmy_Y[2]);
    	again := true;
    
    	if(MyArmy_X[2] < 1) or (MyArmy_Y[2] < 1) or (MyArmy_X[2] > 4) or (MyArmy_Y[2] > 4) then
    	begin
    		writeln('Koordinat harus diantara 1 - 4 !!!');
    		again := false;
    	end;
    		
    	(*Cek apakah posisi tentara 2 sudah ditempati oleh tentara 1*)
    	if(MyArmy_X[2] = MyArmy_X[1]) and (MyArmy_Y[2] = MyArmy_Y[1]) then
    	begin
    		writeln('Cari tempat lain...');
    		writeln('Posisi telah ditempati oleh tentara sebelumnya !!!');
    		again := false;
    	end;
    end
    until again = true;
    	
    (*Tentara 3*)
    again := false;
    repeat
    begin
    	gotoxy(wherex, wherey+1);
    	write('Tentara 3, Koordinat X [1..4] : ');	readln(MyArmy_X[3]);
    	write('Tentara 3, Koordinat Y [1..4] : ');	readln(MyArmy_Y[3]);
                   again := true;
    		
    	if(MyArmy_X[3] < 1) or (MyArmy_Y[3] < 1) or (MyArmy_X[3] > 4) or (MyArmy_Y[3] > 4) then
    	begin
    		writeln('Koordinat harus diantara 1 - 4 !!!');
    		again := false;
    	end;
    		
    	(*Cek apakah posisi tentara 3 sudah ditempati oleh tentara 1 atau 2*)
    	if(MyArmy_X[3] = MyArmy_X[1]) and (MyArmy_Y[3] = MyArmy_Y[1]) then
    	begin
    		writeln('Cari tempat lain...');
    		writeln('Posisi telah ditempati oleh tentara sebelumnya !!!');
    		again := false;
    	end
    	else if(MyArmy_X[3] = MyArmy_X[2]) and (MyArmy_Y[3] = MyArmy_Y[2]) then
    	begin
    		writeln('Cari tempat lain...');
    		writeln('Posisi telah ditempati oleh tentara sebelumnya !!!');
    		again := false;
    	end;
    end
    until again = true;
    	
    (*Tentara 4*)
    again := false;
    repeat
    begin
    	gotoxy(wherex, wherey+1);
    	write('Tentara 4, Koordinat X[1..4] : ');	readln(MyArmy_X[4]);
    	write('Tentara 4, Koordinat Y[1..4] : ');	readln(MyArmy_Y[4]);
    	again := true;
    		
    	if(MyArmy_X[4] < 1) or (MyArmy_Y[4] < 1) or (MyArmy_X[4] > 4) or (MyArmy_Y[4] > 4) then
    	begin
    		writeln('Koodinat harus diantara 1 - 4 !!!');
    		again := false;
    	end;
    		
    	(*Cek apakah posisi tentara sudah ditempati oleh tentara 1, 2 atau 3*)
    	if(MyArmy_X[4] = MyArmy_X[1]) and (MyArmy_Y[4] = MyArmy_Y[1]) then
    	begin
    		writeln('Cari tempat lain...');
    		writeln('Posisi telah ditempati oleh tentara sebelumnya !!!');
    		again := false;
    	end
    	else if(MyArmy_X[4] = MyArmy_X[2]) and (MyArmy_Y[4] = MyArmy_Y[2]) then
    	begin
    		writeln('Cari tempat lain...');
    		writeln('Posisi telah ditempati oleh tentara sebelumnya !!!');
    		again := false;
    	end
    	else if(MyArmy_X[4] = MyArmy_X[3]) and (MyArmy_Y[4] = MyArmy_Y[3]) then
    	begin
    		writeln('Cari tempat lain...');
    		writeln('Posisi telah ditempati oleh tentara sebelumnya !!!');
    		again := false;
    	end;
    end
    until again = true;
  5. Kelima, coding berikut akan mencetak layout Area User dan layout Area Musuh.
    (*Cetak layout area user dan area musuh*)
    	while((user <> 'win') and (com <> 'win')) do
    	begin
    		clrscr;
    		writeln('Tebak posisi koordinat tentara musuh yang bersembunyi');
    		
    		(*Cetak Header Layout area user dan area musuh*)
    		gotoxy(wherex, wherey+1);
    		write('==Area User==');
    		gotoxy(20, wherey);
    		write('=Area Musuh=');
    		
    		(*Cetak Angka Koordinat X di Area User*)
    		gotoxy(3, wherey+1);
    		for x := 1 to 4 do
    		begin
    			write(x);
    			gotoxy(wherex+2, wherey);
    		end;
    		
    		(*Cetak Angka Koordinat X di Area Musuh*)
    		gotoxy(22, wherey);
    		for x := 1 to 4 do
    		begin
    			write(x);
    			gotoxy(wherex+2, wherey);
    		end;
    		
    		(*Cetak Angka Koordinat Y di Area User*)
    		gotoxy(1, wherey+2);
    		for x := 1 to 4 do
    		begin
    			write(x);
    			gotoxy(1, wherey+2);
    		end;
    		
    		(*Cetak Angka Koordinat Y di Area Musuh*)
    		gotoxy(20, wherey-8);
    		for x := 1 to 4 do
    		begin
    			write(x);
    			gotoxy(20, wherey+2);
    		end;
    		
    		(*Cetak Kotak Persembunyian di Area User*)
    		gotoxy(3, wherey-8);
    		for x := 1 to 4 do
    		begin
    			for y := 1 to 4 do
    			begin
    				(*Cek status tiap kotak persembunyian untuk Area User*)
    				if(Kondisi_MyArmy_XY[y, x] = 'tutup') then
    				begin
    					write(chr(219));
    				end
    				else if(Kondisi_MyArmy_XY[y, x] = 'buka_salah') then
    				begin
    					write('X');
    				end
    				else if(Kondisi_MyArmy_XY[y, x] = 'buka_benar') then
    				begin
    					write(chr(258));
    				end;
    				gotoxy(wherex+2, wherey);
    			end;
    			gotoxy(3, wherey+2);
    		end;
    		
    		(*Cetak Kotak Persembunyian di Area Musuh*)
    		gotoxy(22, wherey-8);
    		for x := 1 to 4 do
    		begin
    			for y := 1 to 4 do
    			begin
    				(*Cek status tiap kotak persembunyian untuk Area Musuh*)
    				if(Kondisi_ComArmy_XY[y, x] = 'tutup') then
    				begin
    					write(chr(219));
    				end
    				else if(Kondisi_ComArmy_XY[y, x] = 'buka_salah') then
    				begin
    					write('X');
    				end
    				else if(Kondisi_ComArmy_XY[y, x] = 'buka_benar') then
    				begin
    					write(chr(258));
    				end;
    				gotoxy(wherex+2, wherey);
    			end;
    			gotoxy(22, wherey+2);
    		end;
    	end;
  6. Dan coding berikut, akan menampilkan skor si user dan si computer. Letakkan setelah coding diatas dan di dalam blok statement looping repeat - until.
    (*Cetak Skor si User*)
    gotoxy(1, wherey+1);
    write('Skor User : ', skor_user);
    	
    (*Cetak Skor si Com*)
    gotoxy(20, wherey);
    write('Skor Musuh : ', skor_com);
  7. Dan yang terakhir, coding ini akan menanyakan si user untuk menebak kira - kira dimana posisi tentara musuh bersembunyi.
    (*Masukan untuk menebak Koordinat dimana posisi tentara musuh berada*)
    gotoxy(1, wherey+2);
    write('Masukkan Koordinat X untuk Musuh [1..4] : ');	readln(tebak_x_user);
    gotoxy(1, wherey+1);
    write('Masukkan Koordinat Y untuk Musuh [1..4] : ');	readln(tebak_y_user);

Dan berikut ialah source code lengkapnya, untuk tahap bagian 1.

(*
	Author Yudi Setiawan
*)

program TebakTentara;
uses crt;

{Deklarasi Variable dan Array}
var
	nama_user		    :string;
	MyArmy_X		    :array[1..4] of integer;
	MyArmy_Y		    :array[1..4] of integer;
	ComArmy_X		    :array[1..4] of integer;
	ComArmy_Y		    :array[1..4] of integer;
	Kondisi_MyArmy_XY	:array[1..4, 1..4] of string;
	Kondisi_ComArmy_XY	:array[1..4, 1..4] of string;
	user, com		    :string;
	tebak_x_user		:integer;
	tebak_y_user		:integer;
	tebak_x_com		    :integer;
	tebak_y_com		    :integer;
	benar			    :boolean;
	again			    :boolean;
	skor_user		    :integer;
	skor_com		    :integer;
	x, y, z			    :integer;
	
{Prosedur Inisialisasi Kondisi MyArmy XY dan Kondisi ComArmy XY}
procedure InitKondisiMyArmyComArmy;
var
	a, b, c		:integer;
begin
	for a := 1 to 4 do
	begin
		for b := 1 to 4 do
		begin
			Kondisi_MyArmy_XY[a, b] := 'tutup';
			Kondisi_ComArmy_XY[a, b] := 'tutup';
		end;
	end;
end;

{Main}
begin
	(*Panggil prosedur*)
	InitKondisiMyArmyComArmy;
	
	(*Clear Screen*)
	clrscr;
	
	(*Set status si user dan com masih natural*)
	user := 'natural';
	com := 'natural';
	
	(*Set Skor user dan Skor com masih nol*)
	skor_user := 0;
	skor_com := 0;
	
	(*Tanya nama si user*)
	write('Masukkan Nama Anda : ');	readln(nama_user);
	
	(*Buat inputan untuk menanyakan mau diposisikan dimana tentara si user*)
	gotoxy(1, wherey+1);
	write('Posisikan tentara kamu pada Koordinat berikut');

	(*Posisi semua tentara tidak boleh ada yang sama*)
	(*Tentara 1*)
	again := false;
	repeat
	begin
		gotoxy(1, wherey+1);
		write('Tentara 1, Koordinat X [1..4] : ');	readln(MyArmy_X[1]);
		write('Tentara 1, Koordinat Y [1..4] : ');	readln(MyArmy_Y[1]);
		again := true;

		(*Posisi tentara harus berada diantara 1 sampai 4*)
		if(MyArmy_X[1] < 1) or (MyArmy_Y[1] < 1) or (MyArmy_X[1] > 4) or (MyArmy_Y[1] > 4) then
		begin
			writeln('Koordinat harus diantara 1 - 4 !!!');
			again := false;
		end;
	end
	until again = true;

	(*Tentara 2*)
	again := false;
	repeat
	begin
		gotoxy(wherex, wherey+1);
		write('Tentara 2, Koordinat X [1..4] : ');	readln(MyArmy_X[2]);
		write('Tentara 2, Koordinat Y [1..4] : ');	readln(MyArmy_Y[2]);
		again := true;

		if(MyArmy_X[2] < 1) or (MyArmy_Y[2] < 1) or (MyArmy_X[2] > 4) or (MyArmy_Y[2] > 4) then
		begin
			writeln('Koordinat harus diantara 1 - 4 !!!');
			again := false;
		end;
		
		(*Cek apakah posisi tentara 2 sudah ditempati oleh tentara 1*)
		if(MyArmy_X[2] = MyArmy_X[1]) and (MyArmy_Y[2] = MyArmy_Y[1]) then
		begin
			writeln('Cari tempat lain...');
			writeln('Posisi telah ditempati oleh tentara sebelumnya !!!');
			again := false;
		end;
	end
	until again = true;
	
	(*Tentara 3*)
	again := false;
	repeat
	begin
		gotoxy(wherex, wherey+1);
		write('Tentara 3, Koordinat X [1..4] : ');	readln(MyArmy_X[3]);
		write('Tentara 3, Koordinat Y [1..4] : ');	readln(MyArmy_Y[3]);
                again := true;
		
		if(MyArmy_X[3] < 1) or (MyArmy_Y[3] < 1) or (MyArmy_X[3] > 4) or (MyArmy_Y[3] > 4) then
		begin
			writeln('Koordinat harus diantara 1 - 4 !!!');
			again := false;
		end;
		
		(*Cek apakah posisi tentara 3 sudah ditempati oleh tentara 1 atau 2*)
		if(MyArmy_X[3] = MyArmy_X[1]) and (MyArmy_Y[3] = MyArmy_Y[1]) then
		begin
			writeln('Cari tempat lain...');
			writeln('Posisi telah ditempati oleh tentara sebelumnya !!!');
			again := false;
		end
		else if(MyArmy_X[3] = MyArmy_X[2]) and (MyArmy_Y[3] = MyArmy_Y[2]) then
		begin
			writeln('Cari tempat lain...');
			writeln('Posisi telah ditempati oleh tentara sebelumnya !!!');
			again := false;
		end;
	end
	until again = true;
	
	(*Tentara 4*)
	again := false;
	repeat
	begin
		gotoxy(wherex, wherey+1);
		write('Tentara 4, Koordinat X[1..4] : ');	readln(MyArmy_X[4]);
		write('Tentara 4, Koordinat Y[1..4] : ');	readln(MyArmy_Y[4]);
		again := true;
		
		if(MyArmy_X[4] < 1) or (MyArmy_Y[4] < 1) or (MyArmy_X[4] > 4) or (MyArmy_Y[4] > 4) then
		begin
			writeln('Koodinat harus diantara 1 - 4 !!!');
			again := false;
		end;
		
		(*Cek apakah posisi tentara sudah ditempati oleh tentara 1, 2 atau 3*)
		if(MyArmy_X[4] = MyArmy_X[1]) and (MyArmy_Y[4] = MyArmy_Y[1]) then
		begin
			writeln('Cari tempat lain...');
			writeln('Posisi telah ditempati oleh tentara sebelumnya !!!');
			again := false;
		end
		else if(MyArmy_X[4] = MyArmy_X[2]) and (MyArmy_Y[4] = MyArmy_Y[2]) then
		begin
			writeln('Cari tempat lain...');
			writeln('Posisi telah ditempati oleh tentara sebelumnya !!!');
			again := false;
		end
		else if(MyArmy_X[4] = MyArmy_X[3]) and (MyArmy_Y[4] = MyArmy_Y[3]) then
		begin
			writeln('Cari tempat lain...');
			writeln('Posisi telah ditempati oleh tentara sebelumnya !!!');
			again := false;
		end;
	end
	until again = true;
		
	(*Cetak layout area user dan area musuh*)
	while((user <> 'win') and (com <> 'win')) do
	begin
		clrscr;
		writeln('Tebak posisi koordinat tentara musuh yang bersembunyi');
		
		(*Cetak Header Layout area user dan area musuh*)
		gotoxy(wherex, wherey+1);
		write('==Area User==');
		gotoxy(20, wherey);
		write('=Area Musuh=');
		
		(*Cetak Angka Koordinat X di Area User*)
		gotoxy(3, wherey+1);
		for x := 1 to 4 do
		begin
			write(x);
			gotoxy(wherex+2, wherey);
		end;
		
		(*Cetak Angka Koordinat X di Area Musuh*)
		gotoxy(22, wherey);
		for x := 1 to 4 do
		begin
			write(x);
			gotoxy(wherex+2, wherey);
		end;
		
		(*Cetak Angka Koordinat Y di Area User*)
		gotoxy(1, wherey+2);
		for x := 1 to 4 do
		begin
			write(x);
			gotoxy(1, wherey+2);
		end;
		
		(*Cetak Angka Koordinat Y di Area Musuh*)
		gotoxy(20, wherey-8);
		for x := 1 to 4 do
		begin
			write(x);
			gotoxy(20, wherey+2);
		end;
		
		(*Cetak Kotak Persembunyian di Area User*)
		gotoxy(3, wherey-8);
		for x := 1 to 4 do
		begin
			for y := 1 to 4 do
			begin
				(*Cek status tiap kotak persembunyian untuk Area User*)
				if(Kondisi_MyArmy_XY[y, x] = 'tutup') then
				begin
					write(chr(219));
				end
				else if(Kondisi_MyArmy_XY[y, x] = 'buka_salah') then
				begin
					write('X');
				end
				else if(Kondisi_MyArmy_XY[y, x] = 'buka_benar') then
				begin
					write(chr(258));
				end;
				gotoxy(wherex+2, wherey);
			end;
			gotoxy(3, wherey+2);
		end;
		
		(*Cetak Kotak Persembunyian di Area Musuh*)
		gotoxy(22, wherey-8);
		for x := 1 to 4 do
		begin
			for y := 1 to 4 do
			begin
				(*Cek status tiap kotak persembunyian untuk Area Musuh*)
				if(Kondisi_ComArmy_XY[y, x] = 'tutup') then
				begin
					write(chr(219));
				end
				else if(Kondisi_ComArmy_XY[y, x] = 'buka_salah') then
				begin
					write('X');
				end
				else if(Kondisi_ComArmy_XY[y, x] = 'buka_benar') then
				begin
					write(chr(258));
				end;
				gotoxy(wherex+2, wherey);
			end;
			gotoxy(22, wherey+2);
		end;
		
		(*Cetak Skor si User*)
		gotoxy(1, wherey+1);
		write('Skor User : ', skor_user);
		
		(*Cetak Skor si Com*)
		gotoxy(20, wherey);
		write('Skor Musuh : ', skor_com);
		
		(*Masukan untuk menebak Koordinat dimana posisi tentara musuh berada*)
		gotoxy(1, wherey+2);
		write('Masukkan Koordinat X untuk Musuh [1..4] : ');	readln(tebak_x_user);
		gotoxy(1, wherey+1);
		write('Masukkan Koordinat Y untuk Musuh [1..4] : ');	readln(tebak_y_user);
	end;
	
	readln;
end.

 

Berikut hasil dari tahap pertama ini. Untuk latar belakangnya bisa berwarna, itu saya menggunakan textBackground. Bisa Anda cari di google. Dan mungkin untuk tahap pertama ini Anda bisa bereksperimen sendiri untuk mewarnai latar belakangnya ataupun warna teksnya.

 

 

Sekian untuk tutorial tahap pertama ini. Tunggu tutorial tahap keduanya ya.


About Author

Yudi Setiawan


Comment & Discussions

    Please LOGIN before if you want to give the comment.