DIBUAT OLEH:
UNTUK
INSTITUT TEKNOLOGI DEL
LAGUBOTI
Game Tebak Angka
1. Deskripsi dan Design Game
Game yang dibuat terdiri dari board 5x5, yang berisi angka 1-25 yang disebut
sebagai sel. Di dalam setiap sel terdapat angka 1-13, dimana setiap angka tersebut
memiliki pasangan disetiap angka tersebut memiliki pasangan pada setiap sel yang
berbeda, dan aka nada sel yang tidak memiliki pasangan. Game ini akan dimainkan
oleh dua orang pemain. Pada saat pertama kali mulai, maka board yang akan tampil
adalah sebagai berikut:
1 2 3 4 5
1
2
3
4
5
Setelah permainan ini berjalan, pemain pertama akan mengisi angka disembarang
sel berserta pasangan dari angka yang di masukkan. Begitu juga dengan pemain
kedua akan melalukan hal yang sama dan akan bergantian-gantian menebak letak
dari pasangan angka yang dimasukkan. Jika berhasil menebak, maka point akan
bertambah 1. Dan kemungkinan permainan seri dapat terjadi pada permainan ini.
Dan tampilan dari board pada permainan ini setelah board terisi adalah sebagai
berikut:
1 2 3 4 5
1 1 5 6 7 13
2 3 1 7 11 14
3 5 3 8 10 13
4 9 9 6 12
5 8 10 12 11 14
2. Source code
a. Header.h
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <signal.h>
#include<sys/shm.h>
#include<unistd.h>
#include <pthread.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <semaphore.h>
struct shared_st {
char player1[15];
char player2[15];
int hasInit;
int guessedIndex[5][5];
int number[5][5];
int turn1,turn2;
int player1quit, player2quit;
int score1, score2;
int input[2][2];
};
struct message{
int long msg_type;
char data[MAX_DATA];
};
do {
rnd = rand();
}
while (rnd >= limit);
return rnd % n;
}
shuffle(num, 26);
for(i=0;i<5;i++){
for(j=0;j<5; j++){
Strct->number[i][j]=num[k++];
}
}
Strct->hasInit=1;
return Strct;
}
if(Strct->guessedIndex[j][i] == 0){
if(showClue){
if((j == Strct->input[0][0] && i==Strct->input[0][1] ) || (j == Strct->input[1][0]
&& i==Strct->input[1][1])){
if(Strct->number[j][i] < 10)
printf("| %d ", Strct->number[j][i]);
else
printf("| %d ", Strct->number[j][i]);
}
else
printf("| ");
}
else
printf("| ");
}
else{
if(Strct->number[j][i] < 10)
printf("| %d ", Strct->number[j][i]);
else
printf("| %d ", Strct->number[j][i]);
}
}
puts("|");
}
printf(" ");
for(i=0; i<5;i++){
printf("+----");
}
puts("+");
Strct->input[0][0] = data[0]-1;
Strct->input[0][1] = data[1]-1;
Strct->input[1][0] = data[2]-1;
Strct->input[1][1] = data[3]-1;
if(Strct->number[data[0]-1][data[1]-1] == Strct->number[data[2]-1][data[3]-1]){
Strct->guessedIndex[data[0]-1][data[1]-1] = 1;
Strct->guessedIndex[data[2]-1][data[3]-1] = 1;
switch(player){
case 1:
Strct->score1+=1;
break;
case 2:
Strct->score2+=1;
}
}
}
if(Strct->guessedIndex[data[0]-1][data[1]-1] == 1 || Strct->guessedIndex[data[2]-1][data[3]-1] ==
1){
printf("Number has taken\n");
return 0;
}
return 1;
}
return 0;
}
b. Player1.c
#include "Header.h"
//fungsi yang digunakan untuk menginisiasi message queue dan mendapatkan message queue ID
void initMessage(){
msgid = msgget(key, 0666 | IPC_CREAT);
if(msgid == -1){
fprintf(stderr, "msgget failed with error : %d\n", errno);
exit(EXIT_FAILURE);
}
}
//fungsi yang dijalankan oleh thread untuk melakukan scanning input dari user
void *thread_scan(void *arg){
printf("Input coordinat 1 \n");
printf("x = "); scanf("%d", &guessNumber[0]);
printf("y = "); scanf("%d", &guessNumber[1]);
printf("Input coordinat 2 \n");
printf("x = "); scanf("%d", &guessNumber[2]);
printf("y = "); scanf("%d", &guessNumber[3]);
//mengubah nilai runScan menjadi 0, yang mengindikasikan bahwa thread_scan sudah selesai
dieksekusi
runScan = 0;
}
}
fflush(stdin);
fflush(stdout);
if(msgsnd(msgid, (void *)&send, 100, 0) == -1){
fprintf(stderr, "msgsnd failed\n");
}
sem_wait(&sem);
}
exit(EXIT_SUCCESS);
}
exit(EXIT_SUCCESS);
}
int main(){
int res;
void *shared_mem=(void*)0;
int shmid;
sem_init(&sem, 0, 0);
if((shmid=shmget(key,sizeof(1024),IPC_CREAT|0666))<0){
printf("Error in shmget()\n");
exit(1);
}
shared_mem=shmat(shmid,(void*)0,0);
shared_board=(struct shared_st*)shared_mem;
else{
printf("Welcome %s, %s has wait for you, Enjoy the game\n", shared_board->player1,
shared_board->player2);
}
sleep(3);
while(!completed(shared_board->score1, shared_board->score2)){
system("clear");
render_board(shared_board, 0);
if(shared_board->turn1 == 1){
printf("Your turn\n");
do{
runScan = 1;
pthread_create(&th_scan, NULL, thread_scan, (void *)NULL);
while(runScan){
//sleep(1);
}
pthread_join(th_scan, &th_res);
}
while(!is_input_valid(shared_board, guessNumber));
}
else{
printf("%s turn, please wait a moment\n", shared_board->player2);
while(shared_board->turn2)
sleep(1);
}
system("clear");
render_board(shared_board, 1);
sleep(2);
}
finish = 1;
sem_post(&sem);
check_result(shared_board);
if(res!=0){
perror("Thread join failed\n");
exit(EXIT_FAILURE);
}
sem_destroy(&sem);
shmdt(shared_mem);
shmctl(shmid,IPC_RMID,0);
return 0;
}
c. Player2.c
#include "library_008_022.h"
void initMessage(){
msgid = msgget(key, 0666 | IPC_CREAT);
if(msgid == -1){
fprintf(stderr, "msgget failed with error : %d\n", errno);
exit(EXIT_FAILURE);
}
}
}
fflush(stdin);
fflush(stdout);
if(msgsnd(msgid, (void *)&send, 100, 0) == -1){
fprintf(stderr, "msgsnd failed\n");
}
sem_wait(&sem);
}
exit(EXIT_SUCCESS);
}
exit(EXIT_SUCCESS);
int main(){
int res;
void *shared_mem=(void*)0;
int shmid;
sem_init(&sem, 0, 0);
if((shmid=shmget(key,sizeof(1024),IPC_CREAT|0666))<0){
printf("Error in shmget()\n");
exit(1);
}
shared_mem=shmat(shmid,(void*)0,0);
shared_board=(struct shared_st*)shared_mem;
else{
printf("Welcome %s, %s has wait for you, Enjoy the game\n", shared_board->player2,
shared_board->player1);
}
sleep(3);
while(!completed(shared_board->score1, shared_board->score2)){
system("clear");
render_board(shared_board, 0);
if(shared_board->turn2 == 1){
printf("Your turn\n");
do{
runScan = 1;
pthread_create(&th_scan, NULL, thread_scan, (void *)NULL);
while(runScan){
//sleep(1);
}
pthread_join(th_scan, &th_res);
}
while(!is_input_valid(shared_board, guessNumber));
}
else{
printf("%s turn, please wait a moment\n", shared_board->player1);
while(shared_board->turn1)
sleep(1);
}
system("clear");
render_board(shared_board, 1);
sleep(2);
}
finish = 1;
sem_post(&sem);
check_result(shared_board);
if(res!=0){
perror("Thread join failed\n");
exit(EXIT_FAILURE);
}
sem_destroy(&sem);
shmdt(shared_mem);
shmctl(shmid,IPC_RMID,0);
return 0;
}
3. Tampilan Game Tebak Angka dan Cara Memainkan Game
a. Cara Memainkan :
1. Buka 2 terminal putty
2. Compile kedua player dengan cara :
• gcc Playerr1.c -o Playerr1 -lpthread
./Playerr1.c
• gcc Player2.c -o Player2.c -lpthread
./Player2
3. Selesai
b. Tampilan pertama ketika pemain pertama (Yenni) berhasil menebak pada game Tebak Angka
c. Tampilan ketika pemain kedua (Melda) berhasil menebak pada game Tebak Angka
d. Ketika kedua pemain saling mengirim pesan