LoneWolfJack
June 13th, 2008, 02:12 PM
I have a little program here (written in C) that I wrote ages ago:
Put it in a new text file and run the following command on your shell:
gcc -Wall -g yourprogramname.c -o outputfilename `pkg-config --cflags gtk+-2.0` `pkg-config --libs gtk+-2.0`
The run it by typing this on your shell:
./outputfilename
Like I said, it is a C program, but most C programs work with C++ as well and gcc can handle both, C and C++ so this should get you started.
#include <gtk/gtk.h>
#include <string.h>
#include <stdlib.h>
struct tictacstruct
{
char *user;
GtkWidget *sbar;
int context_id;
char *TicTacToe;
int button_id;
int turn_id;
};
char *my_itoa(int a,char *buffer, int buff_size)
{
char *temp;
int b;
temp = buffer;
b = a;
if(buffer == NULL)
{return NULL;}
while(a>0)
{
if(buff_size < 1)
{return NULL;}
b = a%10;
*temp = b + '0' ;
temp++;
a = a/10;
buff_size--;
}
*temp = '\0';
return buffer;
}
static char return_winner(char *tictactoe)
{
char *winner = ".";
if(!strncmp(&tictactoe[0],"X",1) && !strncmp(&tictactoe[1],"X",1) && !strncmp(&tictactoe[2],"X",1))
{winner = "X";}
if(!strncmp(&tictactoe[3],"X",1) && !strncmp(&tictactoe[4],"X",1) && !strncmp(&tictactoe[5],"X",1))
{winner = "X";}
if(!strncmp(&tictactoe[6],"X",1) && !strncmp(&tictactoe[7],"X",1) && !strncmp(&tictactoe[8],"X",1))
{winner = "X";}
if(!strncmp(&tictactoe[0],"X",1) && !strncmp(&tictactoe[3],"X",1) && !strncmp(&tictactoe[6],"X",1))
{winner = "X";}
if(!strncmp(&tictactoe[1],"X",1) && !strncmp(&tictactoe[4],"X",1) && !strncmp(&tictactoe[7],"X",1))
{winner = "X";}
if(!strncmp(&tictactoe[2],"X",1) && !strncmp(&tictactoe[5],"X",1) && !strncmp(&tictactoe[8],"X",1))
{winner = "X";}
if(!strncmp(&tictactoe[0],"X",1) && !strncmp(&tictactoe[4],"X",1) && !strncmp(&tictactoe[8],"X",1))
{winner = "X";}
if(!strncmp(&tictactoe[2],"X",1) && !strncmp(&tictactoe[4],"X",1) && !strncmp(&tictactoe[6],"X",1))
{winner = "X";}
if(!strncmp(&tictactoe[0],"O",1) && !strncmp(&tictactoe[1],"O",1) && !strncmp(&tictactoe[2],"O",1))
{winner = "O";}
if(!strncmp(&tictactoe[3],"O",1) && !strncmp(&tictactoe[4],"O",1) && !strncmp(&tictactoe[5],"O",1))
{winner = "O";}
if(!strncmp(&tictactoe[6],"O",1) && !strncmp(&tictactoe[7],"O",1) && !strncmp(&tictactoe[8],"O",1))
{winner = "O";}
if(!strncmp(&tictactoe[0],"O",1) && !strncmp(&tictactoe[3],"O",1) && !strncmp(&tictactoe[6],"O",1))
{winner = "O";}
if(!strncmp(&tictactoe[1],"O",1) && !strncmp(&tictactoe[4],"O",1) && !strncmp(&tictactoe[7],"O",1))
{winner = "O";}
if(!strncmp(&tictactoe[2],"O",1) && !strncmp(&tictactoe[5],"O",1) && !strncmp(&tictactoe[8],"O",1))
{winner = "O";}
if(!strncmp(&tictactoe[0],"O",1) && !strncmp(&tictactoe[4],"O",1) && !strncmp(&tictactoe[8],"O",1))
{winner = "O";}
if(!strncmp(&tictactoe[2],"O",1) && !strncmp(&tictactoe[4],"O",1) && !strncmp(&tictactoe[6],"O",1))
{winner = "O";}
return *winner;
}
static void tictac(GtkWidget *widget,struct tictacstruct *ttpass,int button_id)
{
char *output, *a, *b;
char *c = " (turn ";
char *d = ")";
b = (char *)malloc(100);
char winner = return_winner(ttpass->TicTacToe);
if(!strncmp(gtk_button_get_label(GTK_BUTTON(widget ))," ",1) && !strncmp(&winner,".",1))
{
if(!strncmp(ttpass->user,"X",1))
{ttpass->user = "O";}
else
{ttpass->user = "X";}
gtk_button_set_label(GTK_BUTTON(widget),ttpass->user);
if(!strncmp(ttpass->user,"X",1))
{
a = "put an O ";
b = my_itoa(ttpass->turn_id,b,100);
output = (char *)calloc(strlen(a)+strlen(b)+strlen(c)+strlen(d)+1 ,sizeof(char));
strcpy(output,a);
strcat(output,c);
strcat(output,b);
strcat(output,d);
gtk_statusbar_push(GTK_STATUSBAR(ttpass->sbar),ttpass->context_id,output);
ttpass->TicTacToe[button_id] = 'X';
}
else
{
ttpass->turn_id = ttpass->turn_id+1;
a = "put an X ";
b = my_itoa(ttpass->turn_id,b,100);
output = (char *)calloc(strlen(a)+strlen(b)+strlen(c)+strlen(d)+1 ,sizeof(char));
strcpy(output,a);
strcat(output,c);
strcat(output,b);
strcat(output,d);
gtk_statusbar_push(GTK_STATUSBAR(ttpass->sbar),ttpass->context_id,output);
ttpass->TicTacToe[button_id] = 'O';
}
winner = return_winner(ttpass->TicTacToe);
if(!strncmp(&winner,"X",1))
{gtk_statusbar_push(GTK_STATUSBAR(ttpass->sbar),ttpass->context_id,"Player X has won!");}
if(!strncmp(&winner,"O",1))
{gtk_statusbar_push(GTK_STATUSBAR(ttpass->sbar),ttpass->context_id,"Player O has won!");}
// free(output);
}
g_print("(tictac): button_id: %i\n",button_id);
g_print("(tictac): %c\n",ttpass->TicTacToe[0]);
g_print("(tictac): %c\n",ttpass->TicTacToe[1]);
g_print("(tictac): %c\n",ttpass->TicTacToe[2]);
g_print("(tictac): %c\n",ttpass->TicTacToe[3]);
g_print("(tictac): %c\n",ttpass->TicTacToe[5]);
g_print("(tictac): %c\n",ttpass->TicTacToe[6]);
g_print("(tictac): %c\n",ttpass->TicTacToe[7]);
g_print("(tictac): %c\n",ttpass->TicTacToe[8]);
}
static void tictac_1(GtkWidget *widget,struct tictacstruct *ttpass)
{tictac(widget,ttpass,0);}
static void tictac_2(GtkWidget *widget,struct tictacstruct *ttpass)
{tictac(widget,ttpass,1);}
static void tictac_3(GtkWidget *widget,struct tictacstruct *ttpass)
{tictac(widget,ttpass,2);}
static void tictac_4(GtkWidget *widget,struct tictacstruct *ttpass)
{tictac(widget,ttpass,3);}
static void tictac_5(GtkWidget *widget,struct tictacstruct *ttpass)
{tictac(widget,ttpass,4);}
static void tictac_6(GtkWidget *widget,struct tictacstruct *ttpass)
{tictac(widget,ttpass,5);}
static void tictac_7(GtkWidget *widget,struct tictacstruct *ttpass)
{tictac(widget,ttpass,6);}
static void tictac_8(GtkWidget *widget,struct tictacstruct *ttpass)
{tictac(widget,ttpass,7);}
static void tictac_9(GtkWidget *widget,struct tictacstruct *ttpass)
{tictac(widget,ttpass,8);}
static gboolean delete_event(GtkWidget *widget,GdkEvent *event,gpointer data)
{
gtk_main_quit();
return FALSE;
}
int main(int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *button1, *button2, *button3, *button4, *button5, *button6, *button7, *button8, *button9;
GtkWidget *box, *box_line1, *box_line2, *box_line3;
GtkWidget *sbar;
guint context_id;
struct tictacstruct ttpass;
char *user = "O";
char TicTacToe[9] = {' ',' ',' ',' ',' ',' ',' ',' ',' '};
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window),"Tic Tac Toe");
gtk_container_set_border_width(GTK_CONTAINER (window),10);
sbar = gtk_statusbar_new();
context_id = gtk_statusbar_get_context_id(GTK_STATUSBAR(sbar),"foo");
gtk_statusbar_push(GTK_STATUSBAR(sbar),context_id,"put an X (turn 1)");
ttpass.turn_id = 1;
ttpass.user = user;
ttpass.sbar = sbar;
ttpass.context_id = context_id;
ttpass.TicTacToe =& TicTacToe[0];
//g_print("(main): ttpass address %p\n",&ttpass);
g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(delete_event),NULL);
box = gtk_vbox_new(FALSE, 0);
box_line1 = gtk_hbox_new(FALSE, 0);
box_line2 = gtk_hbox_new(FALSE, 0);
box_line3 = gtk_hbox_new(FALSE, 0);
button1 = gtk_button_new_with_label(" ");
button2 = gtk_button_new_with_label(" ");
button3 = gtk_button_new_with_label(" ");
button4 = gtk_button_new_with_label(" ");
button5 = gtk_button_new_with_label(" ");
button6 = gtk_button_new_with_label(" ");
button7 = gtk_button_new_with_label(" ");
button8 = gtk_button_new_with_label(" ");
button9 = gtk_button_new_with_label(" ");
gtk_box_pack_start(GTK_BOX(box_line1),button1,TRUE ,TRUE,20);
gtk_box_pack_start(GTK_BOX(box_line1),button2,TRUE ,TRUE,20);
gtk_box_pack_start(GTK_BOX(box_line1),button3,TRUE ,TRUE,20);
gtk_box_pack_start(GTK_BOX(box_line2),button4,TRUE ,TRUE,20);
gtk_box_pack_start(GTK_BOX(box_line2),button5,TRUE ,TRUE,20);
gtk_box_pack_start(GTK_BOX(box_line2),button6,TRUE ,TRUE,20);
gtk_box_pack_start(GTK_BOX(box_line3),button7,TRUE ,TRUE,20);
gtk_box_pack_start(GTK_BOX(box_line3),button8,TRUE ,TRUE,20);
gtk_box_pack_start(GTK_BOX(box_line3),button9,TRUE ,TRUE,20);
gtk_box_pack_start(GTK_BOX(box),box_line1,TRUE,TRU E,0);
gtk_box_pack_start(GTK_BOX(box),box_line2,TRUE,TRU E,0);
gtk_box_pack_start(GTK_BOX(box),box_line3,TRUE,TRU E,0);
gtk_box_pack_start(GTK_BOX(box),sbar,TRUE,TRUE,0);
gtk_container_add(GTK_CONTAINER (window),box);
g_signal_connect(G_OBJECT(button1),"clicked",G_CALLBACK(tictac_1),&ttpass);
g_signal_connect(G_OBJECT(button2),"clicked",G_CALLBACK(tictac_2),&ttpass);
g_signal_connect(G_OBJECT(button3),"clicked",G_CALLBACK(tictac_3),&ttpass);
g_signal_connect(G_OBJECT(button4),"clicked",G_CALLBACK(tictac_4),&ttpass);
g_signal_connect(G_OBJECT(button5),"clicked",G_CALLBACK(tictac_5),&ttpass);
g_signal_connect(G_OBJECT(button6),"clicked",G_CALLBACK(tictac_6),&ttpass);
g_signal_connect(G_OBJECT(button7),"clicked",G_CALLBACK(tictac_7),&ttpass);
g_signal_connect(G_OBJECT(button8),"clicked",G_CALLBACK(tictac_8),&ttpass);
g_signal_connect(G_OBJECT(button9),"clicked",G_CALLBACK(tictac_9),&ttpass);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
Powered by vBulletin® Version 4.2.2 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.