/* testgame.c test spell game * Copyright (c) 2004 by SmartLu All Rights Reserved * Distributed under the terms of the GNU General Public License (GPL) * See the GNU Library General Public License for more details. */ #include "srecite.h" static void test_start();//test start static void test_input_entry();//test user's input,check, and call test_start() static void test_over();//test counter over,show result //build prompt word example: a***e(apple) static void build_prompt(gchar origin[256],gchar prompt[256]); static void compute_right_percent(gchar str[10]);//compute right percent static GtkWidget *test_win,*question_label,*prompt_label,*input_entry; static GtkWidget *r_label,*w_label,*t_label,*rp_label; static GtkWidget *feedback_label,*answer_label; static GtkWidget *quit_button,*start_button,*over_button; static int r_num,w_num,t_num; static int counter; //gchar english[256]; static int old_word_index; static void test_quit() { gtk_grab_remove(test_win); gtk_widget_destroy(test_win); show_play(); S_state.word_index = old_word_index; gtk_widget_show(window); } /* window of test game */ void testgame_window() { GtkWidget *vbox,*hbox,*h_line; GtkWidget *text_label,*xpm_label; gchar temp[10]; // init r_num=0;w_num=0;t_num=0; counter = S_conf.test_counter; /* test window */ test_win = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(test_win),"Test Game"); gtk_widget_set_usize(test_win,480,350); gtk_widget_set_uposition(test_win,280,200); // gtk_window_set_policy(GTK_WINDOW(test_win),FALSE,FALSE,FALSE); gtk_container_border_width(GTK_CONTAINER(test_win),0); gtk_signal_connect (GTK_OBJECT (test_win), "delete_event", GTK_SIGNAL_FUNC(test_quit), test_win); /* vbox */ vbox = gtk_vbox_new(TRUE,0); gtk_container_add(GTK_CONTAINER(test_win),vbox); gtk_widget_show(vbox); /* hbox */ hbox = gtk_hbox_new(TRUE,0); gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,0); gtk_widget_show(hbox); /* counter */ text_label = gtk_label_new("Total:"); gtk_box_pack_start(GTK_BOX(hbox),text_label,FALSE,FALSE,0); gtk_widget_show(text_label); sprintf(temp,"%d",counter-t_num); t_label = gtk_label_new(temp); gtk_box_pack_start(GTK_BOX(hbox),t_label,FALSE,FALSE,0); gtk_widget_show(t_label); /* text_label = gtk_label_new("Right:"); gtk_box_pack_start(GTK_BOX(hbox),text_label,FALSE,FALSE,0); gtk_widget_show(text_label); */ xpm_label = create_img_box(PRE_DIR"icon/right.png","Right:"); gtk_box_pack_start(GTK_BOX(hbox),xpm_label,FALSE,FALSE,0); gtk_widget_show(xpm_label); r_label = gtk_label_new("0"); gtk_box_pack_start(GTK_BOX(hbox),r_label,FALSE,FALSE,0); gtk_widget_show(r_label); /* text_label = gtk_label_new("Wrong:"); gtk_box_pack_start(GTK_BOX(hbox),text_label,FALSE,FALSE,0); gtk_widget_show(text_label); */ xpm_label = create_img_box(PRE_DIR"icon/wrong.png","Wrong:"); gtk_box_pack_start(GTK_BOX(hbox),xpm_label,FALSE,FALSE,0); gtk_widget_show(xpm_label); w_label = gtk_label_new("0"); gtk_box_pack_start(GTK_BOX(hbox),w_label,FALSE,FALSE,0); gtk_widget_show(w_label); hbox = gtk_hbox_new(TRUE,0); gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,0); gtk_widget_show(hbox); text_label = gtk_label_new("Right Percent:"); gtk_box_pack_start(GTK_BOX(hbox),text_label,FALSE,FALSE,0); gtk_widget_show(text_label); rp_label = gtk_label_new("0.00"); gtk_box_pack_start(GTK_BOX(hbox),rp_label,FALSE,FALSE,0); gtk_widget_show(rp_label); text_label = gtk_label_new("%"); gtk_box_pack_start(GTK_BOX(hbox),text_label,FALSE,FALSE,0); gtk_widget_show(text_label); /* h_line */ h_line = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vbox),h_line,FALSE,FALSE,0); gtk_widget_show(h_line); /* question */ hbox = gtk_hbox_new(TRUE,0); gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,0); gtk_widget_show(hbox); text_label = gtk_label_new("Question :"); gtk_box_pack_start(GTK_BOX(hbox),text_label,FALSE,FALSE,0); gtk_widget_show(text_label); //font gtk_widget_modify_font((GtkWidget *) text_label, font); question_label = gtk_label_new("*******"); gtk_box_pack_start(GTK_BOX(hbox),question_label,FALSE,FALSE,0); gtk_widget_show(question_label); //font gtk_widget_modify_font((GtkWidget *) question_label, font); /* prompt */ hbox = gtk_hbox_new(TRUE,0); gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,0); gtk_widget_show(hbox); text_label = gtk_label_new(" Prompt :"); gtk_box_pack_start(GTK_BOX(hbox),text_label,FALSE,FALSE,0); gtk_widget_show(text_label); //font gtk_widget_modify_font((GtkWidget *) text_label, font); prompt_label = gtk_label_new("*******"); gtk_box_pack_start(GTK_BOX(hbox),prompt_label,FALSE,FALSE,0); gtk_widget_show(prompt_label); //font gtk_widget_modify_font((GtkWidget *) prompt_label, font); /* input answer editor */ input_entry = gtk_entry_new(); gtk_entry_set_max_length (GTK_ENTRY(input_entry), 50); g_signal_connect (G_OBJECT(input_entry), "activate", G_CALLBACK (test_input_entry),input_entry); gtk_box_pack_start(GTK_BOX(vbox),input_entry,FALSE,FALSE,0); gtk_widget_show(input_entry); // font gtk_widget_modify_font((GtkWidget *) input_entry, font); /* last question's answer label */ feedback_label = gtk_label_new("Good Good Study Study !!! "); gtk_box_pack_start(GTK_BOX(vbox),feedback_label,FALSE,FALSE,0); gtk_widget_show(feedback_label); answer_label = gtk_label_new("Day Day UP UP UP !!! "); gtk_box_pack_start(GTK_BOX(vbox),answer_label,FALSE,FALSE,0); gtk_widget_show(answer_label); //font gtk_widget_modify_font((GtkWidget *) feedback_label, font); gtk_widget_modify_font((GtkWidget *) answer_label, font2); /* h_line */ h_line = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vbox),h_line,FALSE,FALSE,0); gtk_widget_show(h_line); /* button */ hbox = gtk_hbox_new(TRUE,0); gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,0); gtk_widget_show(hbox); /* start_button = gtk_button_new_with_label("Test Start"); quit_button = gtk_button_new_with_label("Test Quit"); over_button = gtk_button_new_with_label("Game Over"); g_signal_connect (G_OBJECT (start_button), "clicked", G_CALLBACK (test_start), NULL); g_signal_connect (G_OBJECT (quit_button), "clicked", G_CALLBACK (test_quit), NULL); g_signal_connect (G_OBJECT (over_button), "clicked", G_CALLBACK (test_over), NULL); */ // !!!!!!!!!!!!!! start_button = create_img_button(PRE_DIR"icon/test.png", "Test Start", "Test Start", test_start, start_button); quit_button = create_img_button(PRE_DIR"icon/exit.png", "Test Quit", "Test Quit", test_quit, quit_button); over_button = create_img_button(PRE_DIR"icon/over.png", "Game Over", "Game Over", test_over, over_button); gtk_box_pack_start(GTK_BOX(hbox),start_button,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(hbox),over_button,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(hbox),quit_button,FALSE,FALSE,0); gtk_widget_show(start_button); gtk_widget_show(quit_button); gtk_widget_show(over_button); gtk_widget_set_sensitive(input_entry,0); gtk_widget_set_sensitive(over_button,0); /* show all!over! */ show_stop(); old_word_index = S_state.word_index; gtk_widget_hide(window); gtk_widget_show(test_win); } //test start static void test_start() { // clean up //gtk_entry_set_text(GTK_ENTRY(input_entry),""); int randnum; //gchar temp[10]; gchar prompt_str[256]; g_print("start button clicked!\n"); randnum = rand() % word_count;// 0< random num < word_count S_state.word_index = randnum; read_line();//load in S_line struct; gtk_label_set(GTK_LABEL(question_label),S_line.CH_word); g_print("English word = \"%s\"!\n",S_line.EN_word); //translate prompt build_prompt(S_line.EN_word,prompt_str); gtk_label_set(GTK_LABEL(prompt_label),prompt_str); gtk_widget_set_sensitive(start_button,0); gtk_widget_set_sensitive(over_button,1); gtk_widget_set_sensitive(input_entry,1); } //build prompt word example: "a _ _ _e"(apple) static void build_prompt(gchar origin[256],gchar prompt[256]) { int i; prompt[0] = origin[0]; //g_print("%s string length = %d",origin,strlen(origin)); for(i=1;i<(strlen(origin)-1);i++) { prompt[2*i-1]=' '; prompt[2*i] = '_'; } prompt[2*strlen(origin)-3] = origin[strlen(origin)-1]; prompt[2*strlen(origin)-2] = '\0'; } //test user's input,check, and call test_start() static void test_input_entry() { gchar answer[256],temp[10]; gchar an_str[256],feed_str[256]; gchar rp_str[10];//right percent string g_print("input enter!\n"); strcpy(answer,gtk_entry_get_text(GTK_ENTRY(input_entry))); if((strncmp(answer,S_line.EN_word,strlen(S_line.EN_word)-1))==0) { //right! r_num = r_num + 1; sprintf(temp,"%d",r_num); gtk_label_set(GTK_LABEL(r_label),temp); strcpy(feed_str,"You are RIGHT !! :)\n"); } else { //wrong! w_num = w_num + 1; sprintf(temp,"%d",w_num); gtk_label_set(GTK_LABEL(w_label),temp); strcpy(feed_str,"You are WRONG !! :(\n"); } //show total num t_num = t_num+1; sprintf(temp,"%d",counter-t_num); gtk_label_set(GTK_LABEL(t_label),temp); //show right percent compute_right_percent(rp_str); g_print("right percent string = %s\n",rp_str); gtk_label_set(GTK_LABEL(rp_label),rp_str); //select input entry gtk_editable_select_region(GTK_EDITABLE (input_entry), 0,GTK_ENTRY(input_entry)->text_length); strcpy(an_str,""); strcat(an_str,"your input answer : "); strcat(an_str,answer); strcat(an_str,"\n"); strcat(an_str,"Right answer : "); strcat(an_str,S_line.EN_word); strcat(an_str,S_line.TK_word); strcat(an_str,"\n"); strcat(an_str," "); strcat(an_str,S_line.CH_word); gtk_label_set(GTK_LABEL(feedback_label),feed_str); gtk_label_set(GTK_LABEL(answer_label),an_str); // if(t_num == counter) test_over(); else test_start(); } //compute right percent static void compute_right_percent(gchar str[10]) { float fl; if(t_num == 0) fl=0.0000; else { fl = (float)r_num / t_num; } sprintf(str,"%.2f",fl*100); } //test counter over,show result static void test_over() { gchar str[256]; gchar temp[256]; float percent; g_print("counter over!\n"); if(t_num == 0) percent = 0.0000; else percent = (float)r_num/t_num; strcpy(str,""); if(percent >= 0.85) strcat(str,"Perfect!!^o^ "); else if(percent >= 0.6) strcat(str,"Common ! ^-^ "); else if(percent >= 0.30) strcat(str,"ai~~ ! *_* "); else strcat(str,"ft !!! -_- "); sprintf(temp,"%.2f",percent*100); strcat(str,"Right Percent:"); strcat(str,temp); strcat(str,"% "); sprintf(temp,"%d",r_num); strcat(str,"("); strcat(str,temp); strcat(str,"/"); sprintf(temp,"%d",t_num); strcat(str,temp); strcat(str,")"); gtk_entry_set_text((GtkEntry *)input_entry,str); r_num=0;w_num=0;t_num=0; sprintf(temp,"%d",counter-t_num); gtk_label_set(GTK_LABEL(r_label),"0"); gtk_label_set(GTK_LABEL(t_label),temp); gtk_label_set(GTK_LABEL(w_label),"0"); gtk_label_set(GTK_LABEL(rp_label),"0.00"); gtk_widget_set_sensitive(start_button,1); gtk_widget_set_sensitive(over_button,0); gtk_widget_set_sensitive(input_entry,0); }