mirror of
https://git.zap.org.au/git/trader.git
synced 2024-12-04 14:46:45 -05:00
Implement the end_game() function: display the winner of the game
This commit is contained in:
parent
f24eead880
commit
36c9a57db0
121
src/game.c
121
src/game.c
@ -135,6 +135,7 @@ static const int game_file_crypt_key[] = {
|
|||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
int cmp_game_move (const void *a, const void *b);
|
int cmp_game_move (const void *a, const void *b);
|
||||||
|
int cmp_player (const void *a, const void *b);
|
||||||
|
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
@ -492,17 +493,98 @@ void init_game (void)
|
|||||||
Returns: (nothing)
|
Returns: (nothing)
|
||||||
|
|
||||||
This function displays every player's status before declaring the
|
This function displays every player's status before declaring the
|
||||||
winner of the game.
|
winner of the game. Note that turn_number is used instead of max_turns
|
||||||
|
as select_moves() may terminate the game earlier.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void end_game (void)
|
void end_game (void)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
|
char *buf;
|
||||||
|
|
||||||
|
|
||||||
if (abort_game) {
|
if (abort_game) {
|
||||||
// init_game() was cancelled by user
|
// init_game() was cancelled by user
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// @@@ To be written
|
buf = malloc(BUFSIZE);
|
||||||
|
if (buf == NULL) {
|
||||||
|
err_exit("out of memory");
|
||||||
|
}
|
||||||
|
|
||||||
|
newtxwin(7, 40, LINE_OFFSET + 9, COL_CENTER(40));
|
||||||
|
wbkgd(curwin, ATTR_ERROR_WINDOW);
|
||||||
|
box(curwin, 0, 0);
|
||||||
|
|
||||||
|
center(curwin, 1, ATTR_ERROR_TITLE, " Game Over ");
|
||||||
|
center(curwin, 3, ATTR_ERROR_STR, "The game is over after %d turns",
|
||||||
|
turn_number - 1);
|
||||||
|
|
||||||
|
wait_for_key(curwin, 5, ATTR_WAITERROR_STR);
|
||||||
|
deltxwin();
|
||||||
|
|
||||||
|
for (i = 0; i < number_players; i++) {
|
||||||
|
show_status(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (number_players == 1) {
|
||||||
|
strfmon(buf, BUFSIZE, "%1n", total_value(0));
|
||||||
|
|
||||||
|
newtxwin(9, 60, LINE_OFFSET + 8, COL_CENTER(60));
|
||||||
|
wbkgd(curwin, ATTR_NORMAL_WINDOW);
|
||||||
|
box(curwin, 0, 0);
|
||||||
|
|
||||||
|
center(curwin, 1, ATTR_WINDOW_TITLE, " Total Value ");
|
||||||
|
center2(curwin, 4, ATTR_NORMAL_WINDOW, ATTR_HIGHLIGHT_STR,
|
||||||
|
"Your total value was ", "%s", buf);
|
||||||
|
|
||||||
|
wait_for_key(curwin, 7, ATTR_WAITNORMAL_STR);
|
||||||
|
deltxwin();
|
||||||
|
} else {
|
||||||
|
// Handle the locale's currency symbol
|
||||||
|
struct lconv *lc = localeconv();
|
||||||
|
assert(lc != NULL);
|
||||||
|
|
||||||
|
// Sort players on the basis of total value
|
||||||
|
for (i = 0; i < number_players; i++) {
|
||||||
|
player[i].sort_value = total_value(i);
|
||||||
|
}
|
||||||
|
qsort(player, number_players, sizeof(player_info_t), cmp_player);
|
||||||
|
|
||||||
|
newtxwin(number_players + 10, 70, LINE_OFFSET + 3, COL_CENTER(70));
|
||||||
|
wbkgd(curwin, ATTR_NORMAL_WINDOW);
|
||||||
|
box(curwin, 0, 0);
|
||||||
|
|
||||||
|
center(curwin, 1, ATTR_WINDOW_TITLE, " Game Winner ");
|
||||||
|
center2(curwin, 3, ATTR_NORMAL_WINDOW, ATTR_HIGHLIGHT_STR,
|
||||||
|
"The winner is ", "%s", player[0].name);
|
||||||
|
if (player[0].sort_value == 0.0) {
|
||||||
|
center2(curwin, 4, ATTR_NORMAL_WINDOW, ATTR_STANDOUT_STR,
|
||||||
|
"who is ", "%s", "*** BANKRUPT ***");
|
||||||
|
} else {
|
||||||
|
strfmon(buf, BUFSIZE, "%1n", player[0].sort_value);
|
||||||
|
center2(curwin, 4, ATTR_NORMAL_WINDOW, ATTR_HIGHLIGHT_STR,
|
||||||
|
"with a value of ", "%s", buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
snprintf(buf, BUFSIZE, "Total Value (%s)", lc->currency_symbol);
|
||||||
|
|
||||||
|
wattrset(curwin, ATTR_WINDOW_SUBTITLE);
|
||||||
|
mvwprintw(curwin, 6, 2, "%5s %-37.37s %18s ", "", "Player", buf);
|
||||||
|
wattrset(curwin, ATTR_NORMAL_WINDOW);
|
||||||
|
|
||||||
|
for (i = 0; i < number_players; i++) {
|
||||||
|
strfmon(buf, BUFSIZE, "%!18n", player[i].sort_value);
|
||||||
|
mvwprintw(curwin, i + 7, 2, "%5s %-37.37s %18s ",
|
||||||
|
ordinal[i + 1], player[i].name, buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
wait_for_key(curwin, getmaxy(curwin) - 2, ATTR_WAITNORMAL_STR);
|
||||||
|
deltxwin();
|
||||||
|
}
|
||||||
|
|
||||||
|
free(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1336,12 +1418,12 @@ double total_value (int num)
|
|||||||
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------
|
/*-----------------------------------------------------------------------
|
||||||
Function: cmp_game_move - Compare two game_move elements
|
Function: cmp_game_move - Compare two game_move[] elements
|
||||||
Arguments: a, b - Elements to compare
|
Arguments: a, b - Elements to compare
|
||||||
Returns: int - Comparison of a and b
|
Returns: int - Comparison of a and b
|
||||||
|
|
||||||
This function compares two game_move elements (of type move_rec_t) and
|
This function compares two game_move[] elements (of type move_rec_t)
|
||||||
returns -1 if a < b, 0 if a == b and 1 if a > b. It is used for
|
and returns -1 if a < b, 0 if a == b and 1 if a > b. It is used for
|
||||||
sorting game moves into ascending order.
|
sorting game moves into ascending order.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -1365,3 +1447,32 @@ int cmp_game_move (const void *a, const void *b)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------
|
||||||
|
Function: cmp_player - Compare two player[] elements
|
||||||
|
Arguments: a, b - Elements to compare
|
||||||
|
Returns: int - Comparison of a and b
|
||||||
|
|
||||||
|
This function compares two player[] elements (of type player_info_t) on
|
||||||
|
the basis of total value, and returns -1 if a > b, 0 if a == b and 1 if
|
||||||
|
a < b (note the change from the usual order!). It is used for sorting
|
||||||
|
players into descending total value order. Note that the sort_value
|
||||||
|
field MUST be computed before calling qsort()!
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
int cmp_player (const void *a, const void *b)
|
||||||
|
{
|
||||||
|
const player_info_t *aa = (const player_info_t *) a;
|
||||||
|
const player_info_t *bb = (const player_info_t *) b;
|
||||||
|
|
||||||
|
|
||||||
|
if (aa->sort_value > bb->sort_value) {
|
||||||
|
return -1;
|
||||||
|
} else if (aa->sort_value < bb->sort_value) {
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -47,6 +47,19 @@ const char *company_name[MAX_COMPANIES] = {
|
|||||||
"Hercules and Co"
|
"Hercules and Co"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Ordinal strings
|
||||||
|
const char *ordinal[MAX_PLAYERS + 1] = {
|
||||||
|
"0th",
|
||||||
|
"1st",
|
||||||
|
"2nd",
|
||||||
|
"3rd",
|
||||||
|
"4th",
|
||||||
|
"5th",
|
||||||
|
"6th",
|
||||||
|
"7th",
|
||||||
|
"8th"
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Global variable definitions *
|
* Global variable definitions *
|
||||||
|
@ -94,6 +94,7 @@ typedef struct player_info {
|
|||||||
double debt; // Amount of debt
|
double debt; // Amount of debt
|
||||||
long stock_owned[MAX_COMPANIES]; // How much stock is owned
|
long stock_owned[MAX_COMPANIES]; // How much stock is owned
|
||||||
bool in_game; // True if still in the game
|
bool in_game; // True if still in the game
|
||||||
|
double sort_value; // Total value (only used in end_game())
|
||||||
} player_info_t;
|
} player_info_t;
|
||||||
|
|
||||||
|
|
||||||
@ -138,6 +139,9 @@ typedef enum sel_val {
|
|||||||
// Company names
|
// Company names
|
||||||
extern const char *company_name[MAX_COMPANIES];
|
extern const char *company_name[MAX_COMPANIES];
|
||||||
|
|
||||||
|
// Ordinal strings
|
||||||
|
extern const char *ordinal[MAX_PLAYERS + 1];
|
||||||
|
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Global variable declarations *
|
* Global variable declarations *
|
||||||
|
Loading…
Reference in New Issue
Block a user