Anda di halaman 1dari 17

LAPORAN PROYEK GAME PEMOGRAMAN SISTEM

GAME Tebak Angka

DIBUAT OLEH:

1. YENNI JULIANA SIBARANI (13316002)


2. MELDA RINA MANIK (13316007)
3. APRILDA PANJAITAN (13316028)

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>

#define MAX_DATA 512

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];
};

static int rand_int(int n) {


int limit = RAND_MAX - RAND_MAX % n;
int rnd;

do {
rnd = rand();
}
while (rnd >= limit);
return rnd % n;
}

void shuffle(int *array, int n) {


int i, j, tmp;

for (i = n - 1; i > 0; i--) {


j = rand_int(i + 1);
tmp = array[j];
array[j] = array[i];
array[i] = tmp;
}
}

struct shared_st* initBoardData(struct shared_st* Strct){

int i, j, k=0, l=1;


Strct->score1 = 0;
Strct->score2 = 0;
time_t t;
srand((unsigned) time(&t));
int num[26];
for(i=0; i<26; i+=2){
num[i] = l;
num[i+1] = l;
l++;
}

for(i=0; i<5; i++){


for(j=0; j<5; j++){
Strct->guessedIndex[i][j] = 0;
}
}

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;
}

void render_board(struct shared_st* Strct, int showClue){


fflush(stdout);
fflush(stdin);
int i, j, k=1;
printf(" ");
for(i=1; i<=5;i++){
printf(" %d", i);
}
printf("\n");
for(j=0; j<5; j++){
printf(" ");
for(i=1; i<=5;i++){
printf("+----");
}
puts("+");
printf(" %d ", k++);
for(i=0; i<5;i++){

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("+");

printf("==== Score Board ====\n");


printf("%s\t : %d\n", Strct->player1, Strct->score1);
printf("%s\t : %d\n\n", Strct->player2, Strct->score2);
printf("Press ctrl+C to send message \n\n");

void check(struct shared_st* Strct, int* data, int player){

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;
}
}
}

int is_input_valid(struct shared_st *Strct, int *data){


int i, sameinput=0;
if(data[0] == data[2] && data[1] == data[3]){ //check if input is same
printf("Coordinats cannot same!!!\n");
return 0;
}

for(i=0;i<4;i++){ // check if input is out of range


if(data[i] > 5){
printf("Coordinats out of range(only input between 1 - 5 is accepted)!!!\n");
return 0;
}
}

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;
}

int completed(int sc1, int sc2){


if(sc1+sc2 == 12)
return 1;

return 0;
}

void check_result(struct shared_st* Strct){


if(Strct->player1quit)
printf("%s has quit from game, %s win the game\n", Strct->player1, Strct->player2);
else if(Strct->player2quit)
printf("%s has quit from game, %s win the game\n", Strct->player2, Strct->player1);
else if(Strct->score1 > Strct->score2)
printf("%s Win the game, with score %d\n", Strct->player1, Strct->score1);
else if(Strct->score1 < Strct->score2)
printf("%s Win the game, with score %d\n", Strct->player2, Strct->score2);
else if(Strct->score1 == Strct->score2)
printf("No winner, score draw\n");

b. Player1.c
#include "Header.h"

struct shared_st *shared_board;


struct message send;
struct message receive;
key_t key = 5678;
int msgid;
int finish = 0;
int runScan;
int guessNumber[4];
sem_t sem;
pthread_t th1, th2, th_scan;
void *th_res;

//fungsi yang digunakan untuk memulai chatting


void interrupt(int sig){
//mengecek apakah thread_scan sedang berjalan atau tidak, jika iya maka thread akan
diberhentikan
if(runScan)
pthread_cancel(th_scan);

//menaikkan nilai semaphore dengan sem_post sehingga thread_send akan berjalan


sem_post(&sem);
}

//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;
}

void *thread_send(void *arg){


sem_wait(&sem);
send.msg_type = 2;
char tmp[100];
while(!finish){

printf("Enter your message : ");


//scanf("%[^\n]s",tmp);
fgets(tmp, 100, stdin);
strcpy(send.data, tmp);
if(runScan){
pthread_create(&th_scan, NULL, thread_scan, (void *)NULL);

}
fflush(stdin);
fflush(stdout);
if(msgsnd(msgid, (void *)&send, 100, 0) == -1){
fprintf(stderr, "msgsnd failed\n");
}
sem_wait(&sem);
}
exit(EXIT_SUCCESS);

void *thread_receive(void *arg){


while(!finish){
if(msgrcv(msgid, (void *)&receive, 100, 1, 0) == -1){
fprintf(stderr, "msgrcv failed\n");
exit(EXIT_FAILURE);
}

printf("\n%s : %s",shared_board->player2, receive.data);

}
exit(EXIT_SUCCESS);

}
int main(){

int res;
void *shared_mem=(void*)0;
int shmid;

sem_init(&sem, 0, 0);

//inisiasi thread dan message queue untuk menangani chating


initMessage();
res = pthread_create(&th1, NULL, thread_send, (void *)NULL);
res = pthread_create(&th2, NULL, thread_receive, (void *)NULL);

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;

printf("Enter your name : ");


scanf ("%[^\n]s", shared_board->player1);
(void)signal(SIGINT, interrupt);
if(shared_board->hasInit==0){
shared_board = initBoardData(shared_board);
shared_board->turn1 = 1;
shared_board->turn2 = 0;
printf("Welcome %s, you just start the Tebak Angka Game, please wait a moment while your
opponent to log in\n", shared_board->player1);
while(strlen(shared_board->player2) == 0){
sleep(1);
}
printf("%s has logged in, Let the Tebak Angka Game Begin!!!\n",shared_board-
>player2);
}

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));

check(shared_mem, guessNumber, 1);


shared_board->turn2 = 1;
shared_board->turn1 = 0;

}
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);

res = pthread_join(th1, &th_res);


res = pthread_join(th2, &th_res);

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"

struct shared_st *shared_board;


struct message send;
struct message receive;
key_t key = 5678;
int msgid;
int finish = 0;
int runScan;
int guessNumber[4];
sem_t sem;
pthread_t th1, th2, th_scan;
void *th_res;

void interrupt(int sig){


if(runScan)
pthread_cancel(th_scan);
sem_post(&sem);
}

void initMessage(){
msgid = msgget(key, 0666 | IPC_CREAT);
if(msgid == -1){
fprintf(stderr, "msgget failed with error : %d\n", errno);
exit(EXIT_FAILURE);
}
}

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]);
runScan = 0;
}

void *thread_send(void *arg){


sem_wait(&sem);
send.msg_type = 1;
char tmp[100];
while(!finish){

printf("Enter your message : ");


//scanf("%[^\n]s",tmp);
fgets(tmp, 100, stdin);
strcpy(send.data, tmp);
if(runScan){
pthread_create(&th_scan, NULL, thread_scan, (void *)NULL);

}
fflush(stdin);
fflush(stdout);
if(msgsnd(msgid, (void *)&send, 100, 0) == -1){
fprintf(stderr, "msgsnd failed\n");
}
sem_wait(&sem);
}
exit(EXIT_SUCCESS);

void *thread_receive(void *arg){


while(!finish){
if(msgrcv(msgid, (void *)&receive, 100, 2, 0) == -1){
fprintf(stderr, "msgrcv failed\n");
exit(EXIT_FAILURE);
}

printf("\n%s : %s",shared_board->player1, receive.data);

}
exit(EXIT_SUCCESS);

int main(){

int res;
void *shared_mem=(void*)0;
int shmid;

sem_init(&sem, 0, 0);

//inisiasi thread dan message queue untuk menangani chating


initMessage();
res = pthread_create(&th1, NULL, thread_send, (void *)NULL);
res = pthread_create(&th2, NULL, thread_receive, (void *)NULL);

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;

printf("Enter your name : ");


scanf ("%[^\n]s", shared_board->player2);
(void)signal(SIGINT, interrupt);
if(shared_board->hasInit==0){
shared_board = initBoardData(shared_board);
shared_board->turn1 = 0;
shared_board->turn2 = 1;
printf("Welcome %s, you just start the Tebak Angka Game, please wait a moment while your
opponent to log in\n", shared_board->player2);
while(strlen(shared_board->player1) == 0){
sleep(1);
}
printf("%s has logged in, Let the Tebak Angka Game Begin!!!\n",shared_board-
>player1);
}

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));

check(shared_mem, guessNumber, 2);


shared_board->turn2 = 0;
shared_board->turn1 = 1;

}
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);

res = pthread_join(th1, &th_res);


res = pthread_join(th2, &th_res);

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

a. Tampilan awal game Tebak Angka ketika pertama kali dijalankan:

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

e. Tampilan ketika permainan berakhir dan pemain pertama (Melda) Menang


f. Permainan Seri

Anda mungkin juga menyukai