static void do_setup (GtkWidget * widget, gpointer data) { const gchar *type_name = NULL; int i; char **player_names; gsize n_player_names; NumberOfComputers = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (ComputerSpinner)); NumberOfHumans = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (HumanSpinner)); if (tmpDoDelay == -1) tmpDoDelay = DoDelay; else DoDelay = tmpDoDelay; DisplayComputerThoughts = tmpDisplayComputerThoughts; for (i = 0; i < MAX_NUMBER_OF_PLAYERS; i++) { if (players[i].name != _(DefaultPlayerNames[i])) g_free (players[i].name); players[i].name = g_strdup (gtk_entry_get_text (GTK_ENTRY (PlayerNames[i]))); if (i < NumberOfPlayers) score_list_set_column_title (ScoreList, i + 1, players[i].name); } setupdialog_destroy (setupdialog, 1); n_player_names = MAX_NUMBER_OF_PLAYERS; player_names = g_newa (char *, n_player_names + 1); for (i = 0; i < MAX_NUMBER_OF_PLAYERS; ++i) { player_names[i] = players[i].name; } player_names[i] = NULL; g_settings_set_strv (settings, "player-names", (const gchar *const *) player_names); g_settings_set_int (settings, "number-of-computer-opponents", NumberOfComputers); g_settings_set_int (settings, "number-of-human-opponents", NumberOfHumans); g_settings_set_boolean (settings, "delay-between-rolls", DoDelay); type_name = game_type_name (NewGameType); if (type_name) { g_settings_set_string (settings, "game-type", type_name); } g_settings_set_int (settings, "monte-carlo-trials", NUM_TRIALS); if (((NumberOfComputers != OriginalNumberOfComputers) || (NumberOfHumans != OriginalNumberOfHumans) || (NewGameType != game_type)) && !GameIsOver ()) WarnNumPlayersChanged (); }
static void update_roll_button_sensitivity (void) { gboolean state = FALSE; gint i; for (i = 0; i < NUMBER_OF_DICE; i++) state |= gtk_toggle_tool_button_get_active (GTK_TOGGLE_TOOL_BUTTON (diceBox[i])); if(!state){ gtk_button_set_label (GTK_BUTTON (mbutton), _("Roll all!")); state = TRUE; } else { gtk_button_set_label (GTK_BUTTON (mbutton), _("Roll!")); state = TRUE; } state &= NumberOfRolls < 3; state &= !players[CurrentPlayer].comp; if(GameIsOver ()){ state = FALSE; } gtk_widget_set_sensitive (GTK_WIDGET (mbutton), state); }
void NextPlayer (void) { if (GameIsOver ()) { if (last_timeout) { g_source_remove (last_timeout); last_timeout = 0; } if (DoDelay && NumberOfComputers > 0) NumberOfRolls = NUM_ROLLS; else NumberOfRolls = LastHumanNumberOfRolls; /* update_roll_button_sensitivity() needs to be called in this context however UpdateRollLabel() also calls that method */ UpdateRollLabel (); CheerWinner (); return; } NumberOfRolls = 0; ready_to_advance_player = FALSE; ShowoffPlayer (ScoreList, CurrentPlayer, 0); /* Find the next player with rolls left */ do { CurrentPlayer = (CurrentPlayer + 1) % NumberOfPlayers; } while (players[CurrentPlayer].finished); DisplayCurrentPlayer(); SelectAllDice (); RollSelectedDice (); FreeRedoList(); /* Remember the roll count if this turn is for a human player for display at the end of the game */ if (!players[CurrentPlayer].comp) LastHumanNumberOfRolls = NumberOfRolls; if (players[CurrentPlayer].comp) { if (DoDelay) { if (!last_timeout) last_timeout = g_timeout_add (DELAY_MS, (GSourceFunc) do_computer_turns, NULL); } else { do_computer_turns (); } } /* Only update the roll label if we are running in delay mode or if this turn is for a human player */ if (DoDelay || (!players[CurrentPlayer].comp)) UpdateRollLabel (); }
static void do_setup (GtkWidget * widget, gpointer data) { const gchar *type_name = NULL; int i; char **player_names; gsize n_player_names; NumberOfComputers = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (ComputerSpinner)); NumberOfHumans = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (HumanSpinner)); if (tmpDoDelay == -1) tmpDoDelay = DoDelay; else DoDelay = tmpDoDelay; DisplayComputerThoughts = tmpDisplayComputerThoughts; for (i = 0; i < MAX_NUMBER_OF_PLAYERS; i++) { if (players[i].name != _(DefaultPlayerNames[i])) g_free (players[i].name); players[i].name = g_strdup (gtk_entry_get_text (GTK_ENTRY (PlayerNames[i]))); if (i < NumberOfPlayers) score_list_set_column_title (ScoreList, i + 1, players[i].name); } setupdialog_destroy (setupdialog, 1); n_player_names = MAX_NUMBER_OF_PLAYERS; player_names = g_newa (char *, n_player_names); for (i = 0; i < MAX_NUMBER_OF_PLAYERS; ++i) { player_names[i] = players[i].name; } games_conf_set_string_list (NULL, KEY_PLAYER_NAMES, (const char * const *) player_names, n_player_names); games_conf_set_integer (NULL, KEY_NUMBER_OF_COMPUTERS, NumberOfComputers); games_conf_set_integer (NULL, KEY_NUMBER_OF_HUMANS, NumberOfHumans); games_conf_set_boolean (NULL, KEY_DELAY_BETWEEN_ROLLS, DoDelay); type_name = game_type_name(NewGameType); if (type_name) { games_conf_set_string (NULL, KEY_GAME_TYPE, type_name); } games_conf_set_integer (NULL, KEY_NUMTRIALS, NUM_TRIALS); if (((NumberOfComputers != OriginalNumberOfComputers) || (NumberOfHumans != OriginalNumberOfHumans) || (NewGameType != game_type)) && !GameIsOver ()) WarnNumPlayersChanged (); }
int main (int argc, char *argv[]) { char **player_names; gsize n_player_names; guint i; GOptionContext *context; gboolean retval; GError *error = NULL; setlocale (LC_ALL, ""); bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); application = gtk_application_new ("org.gnome.gtali", 0); g_signal_connect (application, "activate", G_CALLBACK (GyahtzeeCreateMainWindow), NULL); games_scores_startup (); /* Reset all yahtzee variables before parsing args */ YahtzeeInit (); context = g_option_context_new (NULL); g_option_context_add_group (context, gtk_get_option_group (TRUE)); g_option_context_add_main_entries (context, yahtzee_options, GETTEXT_PACKAGE); retval = g_option_context_parse (context, &argc, &argv, &error); g_option_context_free (context); if (!retval) { g_print ("%s", error->message); g_error_free (error); exit (1); } settings = g_settings_new ("org.gnome.gtali"); g_set_application_name (_(appName)); games_stock_init (); /* If we're in computer test mode, just run some tests, no GUI */ if (test_computer_play > 0) { gint ii, jj, kk; gdouble sum_scores = 0.0; game_type = GAME_YAHTZEE; if (game_type_string) game_type = game_type_from_string(game_type_string); g_message("In test computer play section - Using %d trials for simulation", NUM_TRIALS); for (ii = 0; ii < test_computer_play; ii++) { int num_rolls = 0; NumberOfHumans = 0; NumberOfComputers = 1; NewGame (); while (!GameIsOver() && num_rolls < 100) { ComputerRolling (CurrentPlayer); if (NoDiceSelected () || (NumberOfRolls >= NUM_ROLLS)) { ComputerScoring (CurrentPlayer); NumberOfRolls = 0; SelectAllDice (); RollSelectedDice (); } else { RollSelectedDice (); } num_rolls++; } for (kk = NumberOfHumans; kk < NumberOfPlayers; kk++) { printf("Computer score: %d\n", total_score(kk)); sum_scores += total_score(kk); if (num_rolls > 98) { for (jj = 0; jj < NUM_FIELDS; jj++) g_message("Category %d is score %d", jj, players[kk].score[jj]); } } } printf("Computer average: %.2f for %d trials\n", sum_scores / test_computer_play, NUM_TRIALS); exit(0); } highscores = games_scores_new ("gtali", category_array, G_N_ELEMENTS (category_array), "game type", NULL, 0 /* default category */, GAMES_SCORES_STYLE_PLAIN_DESCENDING); gtk_window_set_default_icon_name ("gtali"); if (NumberOfComputers == 0) /* Not set on the command-line. */ NumberOfComputers = g_settings_get_int (settings, "number-of-computer-opponents"); if (NumberOfHumans == 0) /* Not set on the command-line. */ NumberOfHumans = g_settings_get_int (settings, "number-of-human-opponents"); if (NumberOfHumans < 1) NumberOfHumans = 1; if (NumberOfComputers < 0) NumberOfComputers = 0; if (NumberOfHumans > MAX_NUMBER_OF_PLAYERS) NumberOfHumans = MAX_NUMBER_OF_PLAYERS; if ((NumberOfHumans + NumberOfComputers) > MAX_NUMBER_OF_PLAYERS) NumberOfComputers = MAX_NUMBER_OF_PLAYERS - NumberOfHumans; if (game_type_string) game_type = game_type_from_string(game_type_string); else { char *type; type = g_settings_get_string (settings, "game-type"); game_type = game_type_from_string(type); } set_new_game_type(game_type); if (NUM_TRIALS <= 0) NUM_TRIALS = g_settings_get_int (settings, "monte-carlo-trials"); if (DoDelay == 0) /* Not set on the command-line */ DoDelay = g_settings_get_boolean (settings, "delay-between-rolls"); if (DisplayComputerThoughts == 0) /* Not set on the command-line */ DisplayComputerThoughts = g_settings_get_boolean (settings, "display-computer-thoughts"); /* Read in new player names */ player_names = g_settings_get_strv (settings, "player-names"); n_player_names = g_strv_length (player_names); if (player_names) { n_player_names = MIN (n_player_names, MAX_NUMBER_OF_PLAYERS); for (i = 0; i < n_player_names; ++i) { if (i == 0 && strcasecmp (player_names[i], _("Human")) == 0) { const char *realname; realname = g_get_real_name (); if (realname && realname[0] && strcmp (realname, "Unknown") != 0) { players[i].name = g_locale_to_utf8 (realname, -1, NULL, NULL, NULL); } if (!players[i].name) { players[i].name = g_strdup (player_names[i]); } } else { players[i].name = g_strdup (player_names[i]); } } g_strfreev (player_names); } g_application_run (G_APPLICATION (application), argc, argv); exit(0); }