static gboolean do_computer_turns (void) { if (!players[CurrentPlayer].comp) { last_timeout = 0; return FALSE; } if (ready_to_advance_player) { NextPlayer (); return TRUE; } if (players[CurrentPlayer].finished) { NextPlayer (); return TRUE; } ComputerRolling (CurrentPlayer); if (NoDiceSelected () || (NumberOfRolls >= NUM_ROLLS)) { ComputerScoring (CurrentPlayer); ready_to_advance_player = TRUE; } else { RollSelectedDice (); UpdateRollLabel (); } if (!DoDelay) do_computer_turns (); return TRUE; }
static void roll (void) { if (!players[CurrentPlayer].comp) { RollSelectedDice (); if (NumberOfRolls > 1) FreeUndoRedoLists (); UpdateRollLabel (); LastHumanNumberOfRolls = NumberOfRolls; } }
/* Callback on Roll! button press */ gint roll_dice (GtkWidget * widget, GdkEvent * event, gpointer data) { if (!players[CurrentPlayer].comp) { RollSelectedDice (); if (NumberOfRolls > 1) FreeUndoRedoLists(); UpdateRollLabel (); LastHumanNumberOfRolls = NumberOfRolls; } return FALSE; }
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 (); }
/* Must be called after window system is initted */ void NewGame (void) { int i, j; if (game_type == GAME_YAHTZEE) { FieldLabels = FieldLabelsYahtzee; NUM_FIELDS = NUM_FIELDS_YAHTZEE; NUM_LOWER = NUM_LOWER_YAHTZEE; } else if (game_type == GAME_KISMET) { FieldLabels = FieldLabelsKismet; NUM_FIELDS = NUM_FIELDS_KISMET; NUM_LOWER = NUM_LOWER_KISMET; } CurrentPlayer = 0; NumberOfRolls = 0; LastHumanNumberOfRolls = 0; FreeUndoRedoLists (); NumberOfPlayers = NumberOfComputers + NumberOfHumans; for (i = 0; i < MAX_NUMBER_OF_PLAYERS; ++i) { players[i].finished = 0; players[i].comp = 1; for (j = 0; j < NUM_FIELDS; ++j) { players[i].score[j] = 0; players[i].used[j] = 0; } } /* Possibly 0 humans? */ for (i = 0; i < NumberOfHumans; i++) players[i].comp = 0; SelectAllDice (); RollSelectedDice (); }
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); }