Sunday, 1 December 2013

Membuat game tic tac toe 3x3 menggunakan c dan GTK+ pada linux ubuntu

kesempatan kali ini karena ada tugas pemrograman yang inti dari tugasnya ialah implemntasi array maka saya akan coba untuk membuatnya dengan menggunakan bahasa c dan library GTK+.

GTK saya gunakan untuk membuat interfacenya agar lebih mudah.
1. buka text editor
2. simpan dengan nama 3x3tictac.c
3. kopikan source codenya(terlampir)
4. buka terminal
5. kemudian kompile dengan perintah
     gcc -o 3x3tictac 3x3tictac.c `pkg-config gtk+-2.0 --libs --cflags`
6. kemudian periksa file executablenya dengan perintah ls
7. jika ada file "3x3tictac" berarti sukses dikompile
8. running program dengan perintah ./3x3tictac
9. selamat mencoba
lampiran source codenya


#include<gtk/gtk.h>
#include<string.h>
int turn=0;
GtkWidget *mark[3][3];
GtkWidget *turn_info;

void check()
{
   
int i,j,count=0;
    char m[3][3];
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            char *tmp=(char *)gtk_label_get_label(GTK_LABEL(mark[i][j]));
            m[i][j]=tmp[0];
            if(strlen(tmp)>0)
            {
                count++;
            }
        }
    }
    //menentukan menang
    if(((m[0][0]=='X'&&m[0][1]=='X'&&m[0][2]=='X')||(m[0][0]=='X'&&m[1][0]=='X'&&m[2][0]=='X')||(m[0][0]=='X'&&m[1][1]=='X'&&m[2][2]=='X')||(m[1][0]=='X'&&m[1][1]=='X'&&m[1][2]=='X')||(m[2][0]=='X'&&m[2][1]=='X'&&m[2][2]=='X')||(m[0][1]=='X'&&m[1][1]=='X'&&m[2][1]=='X')||(m[0][2]=='X'&&m[1][2]=='X'&&m[2][2]=='X')||(m[2][0]=='X'&&m[1][1]=='X'&&m[0][2]=='X'))||((m[0][0]=='0'&&m[0][1]=='0'&&m[0][2]=='0')||(m[0][0]=='0'&&m[1][0]=='0'&&m[2][0]=='0')||(m[0][0]=='0'&&m[1][1]=='0'&&m[2][2]=='0')||(m[1][0]=='0'&&m[1][1]=='0'&&m[1][2]=='0')||(m[2][0]=='0'&&m[2][1]=='0'&&m[2][2]=='0')||(m[0][1]=='0'&&m[1][1]=='0'&&m[2][1]=='0')||(m[0][2]=='0'&&m[1][2]=='0'&&m[2][2]=='0')||(m[2][0]=='0'&&m[1][1]=='0'&&m[0][2]=='0')))
    {
        GtkWidget *message,*label,*vbox,*frame;
        char string[25];
        sprintf(string,"pemain %d menang",2-turn);
        message=gtk_window_new(GTK_WINDOW_POPUP);
        gtk_window_set_position(GTK_WINDOW(message),GTK_WIN_POS_CENTER);
        gtk_window_resize(GTK_WINDOW(message),200,70);
        gtk_window_set_modal(GTK_WINDOW(message),TRUE);
        frame=gtk_frame_new(NULL);
        label=gtk_label_new(string);
        vbox=gtk_vbox_new(0,0);
        gtk_container_add(GTK_CONTAINER(message),frame);
        gtk_container_add(GTK_CONTAINER(frame),vbox);
        gtk_box_pack_start(GTK_BOX(vbox),label,0,0,0);
        gtk_widget_show_all(message);
    }
    //terjadi draw
    else if(count==9)
    {
        GtkWidget *message,*label,*vbox,*frame;
        message=gtk_window_new(GTK_WINDOW_POPUP);
        gtk_window_set_position(GTK_WINDOW(message),GTK_WIN_POS_CENTER);
        gtk_window_resize(GTK_WINDOW(message),200,70);
        gtk_window_set_modal(GTK_WINDOW(message),TRUE);
        frame=gtk_frame_new(NULL);
        label=gtk_label_new("permainan imbang");
        vbox=gtk_vbox_new(0,0);
        gtk_container_add(GTK_CONTAINER(message),frame);
        gtk_container_add(GTK_CONTAINER(frame),vbox);
        gtk_box_pack_start(GTK_BOX(vbox),label,0,0,0);
        gtk_widget_show_all(message);
    }
}
       
void markit(GtkWidget *button,GtkWidget *label)
{
    char *str=(char *)gtk_label_get_label(GTK_LABEL(label));
    //menentukan pemain 1   
    if(turn==0&&str[0]==0)
    {
        char turns[25];
        gtk_label_set(GTK_LABEL(label),"X");
        turn=1;
        //pindah pemain ke 2       
        sprintf(turns,"Giliran pemain ke %d",turn+1);
        gtk_label_set(GTK_LABEL(turn_info),turns);
    }
    //menentukan pemain 2
    else if(turn==1&&str[0]==0)
    {    char turns[25];
        gtk_label_set(GTK_LABEL(label),"0");
        turn=0;
        //pindah pemain ke 1       
        sprintf(turns,"Giliran pemain ke %d",turn+1);
        gtk_label_set(GTK_LABEL(turn_info),turns);
    }
    check();
}

int main(int argc,char *argv[])
{
    GtkWidget *window, *button[3][3], *vbox, *hbox[3], *frame, *separator;
    GtkWidget *menubar,*file_menu,*file,*quit,*Reset,*keluar;
    char turns[15];
    int i,j;
    //initialize();
    gtk_init(&argc,&argv);
    window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
    //nama bar file atas
    gtk_window_set_title(GTK_WINDOW(window),"TIC TAC TOE ");
    //posisi ketika main pertama di tengah layar   
    gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
    //default ukuran window   
    gtk_window_set_default_size(GTK_WINDOW(window),300,350);
    frame=gtk_frame_new(NULL);
    separator=gtk_hseparator_new();
    vbox=gtk_vbox_new(0,0);
    gtk_container_add(GTK_CONTAINER(window),frame);
    gtk_container_add(GTK_CONTAINER(frame),vbox);
   
   
    ///////////////////////////////
    //Packing
    ///////////////////////////////
    sprintf(turns,"Giliran pemain ke %d",turn+1);
    turn_info=gtk_label_new(turns);
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            button[i][j]=gtk_button_new_with_label(NULL);
            mark[i][j]=gtk_label_new("");
            gtk_container_add(GTK_CONTAINER(button[i][j]),mark[i][j]);
        }
    }
   
    for(i=0;i<3;i++)
    {
        hbox[i]=gtk_hbox_new(0,0);
    }
   
    gtk_box_pack_start(GTK_BOX(vbox),separator,0,0,0);
    gtk_box_pack_start(GTK_BOX(vbox),turn_info,0,0,0);
    for(i=0;i<3;i++)
    {
        gtk_box_pack_start(GTK_BOX(vbox),hbox[i],1,1,0);
    }
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            gtk_box_pack_start(GTK_BOX(hbox[i]),button[i][j],1,1,0);
        }
    }
    //g_signal_connect(GTK_OBJECT(window),"destroy",gtk_main_quit,NULL);
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            g_signal_connect(GTK_OBJECT(button[i][j]),"clicked",GTK_SIGNAL_FUNC(markit),mark[i][j]);
        }
    }
    gtk_widget_show_all(window);
    gtk_main();
}
   

No comments:

Post a Comment