1
0
mirror of https://git.zap.org.au/git/trader.git synced 2024-11-03 17:27:29 -05:00

Add the init_game() function that initialises the actual game

This commit is contained in:
John Zaitseff 2011-07-11 16:14:07 +10:00
parent 2a3ed550ad
commit cdaeb2e869
4 changed files with 437 additions and 7 deletions

View File

@ -28,11 +28,423 @@
*/
#include "system.h"
#include "globals.h"
#include "game.h"
#include "trader.h"
/************************************************************************
* Game function definitions *
************************************************************************/
/*-----------------------------------------------------------------------
Function: init_game - Initialise a new game or load an old one
Arguments: (none)
Returns: (nothing)
This function initialises all game variables and structures, either by
creating a new game or by loading an old one from disk. In particular,
if a new game is to be created, it asks how many people will play, and
what their names are. If needed, instructions on how to play the game
are also displayed.
On entry to this function, the "game_num" global variable determines
whether an old game is loaded (if possible). On exit, all global
variables in globals.h are initialised, apart from game_move[].
*/
void init_game (void)
{
int i, j, x, y;
int key, ret;
bool done, modified, entered[MAX_PLAYERS];
// Try to load an old game, if possible
if (game_num != 0) {
newtxwin(5, 30, LINE_OFFSET + 6, COL_CENTER(30));
wbkgd(curwin, ATTR_STATUS_WINDOW);
box(curwin, 0, 0);
center(curwin, 2, ATTR_STATUS_WINDOW, "Loading game %d... ", game_num);
wrefresh(curwin);
game_loaded = load_game(game_num);
deltxwin();
txrefresh();
}
// Initialise game data, if not already loaded
if (! game_loaded) {
number_players = 0;
while (number_players == 0) {
// Ask for the number of players
newtxwin(5, 62, LINE_OFFSET + 3, COL_CENTER(62));
wbkgd(curwin, ATTR_NORMAL_WINDOW);
box(curwin, 0, 0);
mvwaddstr(curwin, 2, 2, "Enter number of players ");
waddstr(curwin, "[");
attrpr(curwin, ATTR_KEYCODE_STR, "1");
waddstr(curwin, "-");
attrpr(curwin, ATTR_KEYCODE_STR, "%d", MAX_PLAYERS);
waddstr(curwin, "]");
waddstr(curwin, " or ");
attrpr(curwin, ATTR_KEYCODE_STR, "<C>");
waddstr(curwin, " to continue a game: ");
curs_set(CURS_ON);
wrefresh(curwin);
do {
key = toupper(gettxchar(curwin));
done = ((key >= '1') && (key <= (MAX_PLAYERS + '0'))) || (key == 'C');
if (! done) {
beep();
}
} while (! done);
curs_set(CURS_OFF);
wechochar(curwin, key | A_BOLD);
if (key != 'C') {
number_players = key - '0';
} else {
// Ask which game to load
newtxwin(5, 49, LINE_OFFSET + 6, COL_CENTER(49));
wbkgd(curwin, ATTR_NORMAL_WINDOW);
box(curwin, 0, 0);
mvwaddstr(curwin, 2, 2, "Enter game number ");
waddstr(curwin, "[");
attrpr(curwin, ATTR_KEYCODE_STR, "1");
waddstr(curwin, "-");
attrpr(curwin, ATTR_KEYCODE_STR, "9");
waddstr(curwin, "]");
waddstr(curwin, " or ");
attrpr(curwin, ATTR_KEYCODE_STR, "<ESC>");
waddstr(curwin, " to cancel: ");
curs_set(CURS_ON);
wrefresh(curwin);
do {
key = toupper(gettxchar(curwin));
done = ((key >= '1') && (key <= '9')) || (key == KEY_ESC);
if (! done) {
beep();
}
} while (! done);
curs_set(CURS_OFF);
if (key != KEY_ESC) {
game_num = key - '0';
wechochar(curwin, key | A_BOLD);
// Try to load the game, if possible
newtxwin(5, 30, LINE_OFFSET + 9, COL_CENTER(30));
wbkgd(curwin, ATTR_STATUS_WINDOW);
box(curwin, 0, 0);
center(curwin, 2, ATTR_STATUS_WINDOW,
"Loading game %d... ", game_num);
wrefresh(curwin);
game_loaded = load_game(game_num);
deltxwin();
txrefresh();
}
deltxwin(); // "Enter game number" window
deltxwin(); // "Number of players" window
txrefresh();
}
}
if (! game_loaded) {
if (number_players == 1) {
// Ask for the player name
newtxwin(5, 76, LINE_OFFSET + 9, COL_CENTER(76));
wbkgd(curwin, ATTR_NORMAL_WINDOW);
box(curwin, 0, 0);
mvwaddstr(curwin, 2, 2, "Please enter your name: ");
player[0].name = NULL;
do {
ret = gettxstring(curwin, &player[0].name, false, 2, 26,
48, ATTR_INPUT_FIELD, NULL);
done = ((ret == OK) && (strlen(player[0].name) != 0));
if (! done) {
beep();
}
} while (! done);
newtxwin(5, 44, LINE_OFFSET + 6, COL_CENTER(44));
wbkgd(curwin, ATTR_NORMAL_WINDOW);
box(curwin, 0, 0);
mvwaddstr(curwin, 2, 2, "Do you need any instructions? ");
waddstr(curwin, "[");
attrpr(curwin, ATTR_KEYCODE_STR, "Y");
waddstr(curwin, "/");
attrpr(curwin, ATTR_KEYCODE_STR, "N");
waddstr(curwin, "] ");
if (answer_yesno(curwin)) {
show_help();
}
deltxwin(); // "Do you need instructions?" window
deltxwin(); // "Enter your name" window
deltxwin(); // "Number of players" window
txrefresh();
} else {
// Ask for all of the player names
newtxwin(number_players + 5, 76, LINE_OFFSET + 9, COL_CENTER(76));
wbkgd(curwin, ATTR_NORMAL_WINDOW);
box(curwin, 0, 0);
center(curwin, 1, ATTR_WINDOW_TITLE, " Enter player names ");
for (i = 0; i < number_players; i++) {
player[i].name = NULL;
entered[i] = false;
mvwprintw(curwin, i + 3, 2, "Player %d:", i + 1);
}
i = 0;
done = false;
while (! done) {
ret = gettxstring(curwin, &player[i].name, true, 3 + i, 12,
62, ATTR_INPUT_FIELD, &modified);
switch (ret) {
case OK:
// Make sure name is not an empty string
j = strlen(player[i].name);
entered[i] = (j != 0);
if (j == 0) {
beep();
}
// Make sure name has not been entered already
for (j = 0; j < number_players; j++) {
if ((i != j) && (player[j].name != NULL) &&
(strcmp(player[i].name, player[j].name) == 0)) {
entered[i] = false;
beep();
break;
}
}
// Move to first name for which ENTER has not been pressed
done = true;
for (i = 0; i < number_players; i++) {
if (! entered[i]) {
done = false;
break;
}
}
break;
case ERR:
beep();
break;
case KEY_UP:
if (modified) {
entered[i] = false;
}
if (i == 0) {
i = number_players - 1;
} else {
i--;
}
break;
case KEY_DOWN:
if (modified) {
entered[i] = false;
}
if (i == number_players - 1) {
i = 0;
} else {
i++;
}
break;
default:
beep();
break;
}
}
newtxwin(5, 50, LINE_OFFSET + 6, COL_CENTER(50));
wbkgd(curwin, ATTR_NORMAL_WINDOW);
box(curwin, 0, 0);
mvwaddstr(curwin, 2, 2, "Does any player need instructions? ");
waddstr(curwin, "[");
attrpr(curwin, ATTR_KEYCODE_STR, "Y");
waddstr(curwin, "/");
attrpr(curwin, ATTR_KEYCODE_STR, "N");
waddstr(curwin, "] ");
if (answer_yesno(curwin)) {
show_help();
}
deltxwin(); // "Need instructions?" window
deltxwin(); // "Enter player names" window
deltxwin(); // "Number of players" window
txrefresh();
}
// Initialise player data (other than names)
for (i = 0; i < number_players; i++) {
player[i].cash = INITIAL_CASH;
player[i].debt = 0.0;
player[i].in_game = true;
for (j = 0; j < MAX_COMPANIES; j++) {
player[i].stock_owned[j] = 0;
}
}
// Initialise company data
for (i = 0; i < MAX_COMPANIES; i++) {
company[i].name = company_name[i];
company[i].share_price = 0.0;
company[i].share_return = INITIAL_RETURN;
company[i].stock_issued = 0;
company[i].max_stock = 0;
company[i].on_map = false;
}
// Initialise galaxy map
for (x = 0; x < MAX_X; x++) {
for (y = 0; y < MAX_Y; y++) {
galaxy_map[x][y] = (randf() < STAR_RATIO) ?
MAP_STAR : MAP_EMPTY;
}
}
// Miscellaneous initialisation
interest_rate = INITIAL_INTEREST_RATE;
max_turn = DEFAULT_MAX_TURN;
turn_number = 1;
// Select who is to go first
if (number_players == 1) {
first_player = 0;
current_player = 0;
} else {
first_player = randi(number_players);
current_player = first_player;
newtxwin(7, 50, LINE_OFFSET + 8, COL_CENTER(50));
wbkgd(curwin, ATTR_NORMAL_WINDOW);
box(curwin, 0, 0);
center(curwin, 2, ATTR_NORMAL_WINDOW,
"The first player to go is");
center(curwin, 3, ATTR_HIGHLIGHT_STR, "%1.46s",
player[first_player].name);
wait_for_key(curwin, 5);
deltxwin();
txrefresh();
}
}
}
quit_selected = false;
}
/*-----------------------------------------------------------------------
Function: end_game - Finish playing the current game
Arguments: (none)
Returns: (nothing)
This function displays every player's status before declaring the
winner of the game.
*/
void end_game (void)
{
// @@@ To be written
}
/*-----------------------------------------------------------------------
Function: load_game - Load a saved game from disk
Arguments: num - Game number to load (1-9)
Returns: bool - True if game loaded successfully, else false
This function loads a previously-saved game from disk. True is
returned if this could be done successfully.
*/
bool load_game (int num)
{
assert((num >= 1) && (num <= 9));
// @@@ To be written
return false;
}
/*-----------------------------------------------------------------------
Function: save_game - Save the current game to disk
Arguments: num - Game number to use (1-9)
Returns: bool - True if game saved successfully, else false
This function saves the current game to disk. True is returned if this
could be done successfully.
*/
bool save_game (int num)
{
assert((num >= 1) && (num <= 9));
// @@@ To be written
return true;
}
void select_moves (void)
{
// @@@ To be written
}
void get_move (void)
{
// @@@ To be written
}
void process_move (void)
{
// @@@ To be written
}
void exchange_stock (void)
{
// @@@ To be written
}
void next_player (void)
{
// @@@ To be written
quit_selected = true;
}

View File

@ -32,4 +32,24 @@
#define included_GAME_H 1
#include <stdbool.h>
/************************************************************************
* Game function declarations *
************************************************************************/
void init_game (void);
void end_game (void);
bool load_game (int num);
bool save_game (int num);
void select_moves (void);
void get_move (void);
void process_move (void);
void exchange_stock (void);
void next_player (void);
#endif /* included_GAME_H */

View File

@ -87,7 +87,7 @@ typedef struct company_info {
// Information about each player
typedef struct player_info {
const char *name; // Player name
char *name; // Player name
double cash; // Cash available
double debt; // Amount of debt
long stock_owned[MAX_COMPANIES]; // How much stock is owned

View File

@ -69,7 +69,6 @@ int main (int argc, char *argv[])
// Play the actual game
/* @@@ to be completed
init_game();
while ((! quit_selected) && (turn_number <= max_turn)) {
select_moves();
@ -79,7 +78,6 @@ int main (int argc, char *argv[])
next_player();
}
end_game();
*/
// Finish up...
end_program();
@ -269,7 +267,7 @@ void init_program (void)
init_screen();
// Initialise signal-handling functions
// @@@ to be completed
// @@@ To be completed
}