Συντονιστής: konnn

pc_magas έγραψε:Καλό είναι να κάνεις UML διάγραμμα ροής με σενάρια και κανά UML καταστάσεων

look, shoot, help, exit4 animals | 0:wolf, 1:racoon, 2:rabbit, 3:duck0:Wolf (health=100, distance=200 meters, mood=neutral )
migf1 έγραψε:Έχεις παίξει ποτέ text-adventure, Ηλία (εννοώ για να δεις περίπου πως πάει το πράγμα );

#define MAX_CMD_ALIASES 4
#define MAX_CMD_PARAMS 2
enum ComTypeId {
CMDID_INVALID = -1,
CMDID_EXIT,
CMDID_HELP,
CMDID_LOOK,
CMDID_GO,
CMDID_SHOOT,
CMDID_GET,
CMDID_DROP,
MAX_COMMANDS
};
typedef struct CommandType {
enum ComTypeId id;
char *aliases[ MAX_CMD_ALIASES ]; /* array of char ptrs (μπορείς να το κάνεις στατικό πίνακα αν σε βολεύει καλύτερα) */
int nparams; /* */
char *params[ MAX_CMD_PARAMS ]; /* array of char ptrs (κι αυτό μπορείς να το κάνεις στατικό πίνακα) */
} CommandType;
...
int main( void )
{
CommandType cmdtable[ MAX_COMMANDS ] = {
/* .id .aliases .nparams .params */
{ CMDID_EXIT, {"exit", "x", "quit", "q"}, 0, {NULL, NULL} },
{ CMDID_HELP, {"help", "h", "?", NULL}, 0, {NULL, NULL} },
{ CMDID_LOOK, {"look", NULL, NULL, NULL}, 1, {NULL, NULL} },
{ CMDID_GO, {"go", "walk", NULL, NULL}, 0, {NULL, NULL} },
{ CMDID_SHOOT, {"shoot", "hit", NULL, NULL}, 1, {NULL, NULL} },
{ CMDID_GET, {"get", "pick", NULL, NULL}, 1, {NULL, NULL} },
{ CMDID_DROP, {"drop", NULL, NULL, NULL}, 2, {NULL, NULL} }
};
CommandType command = { CMDID_INVALID, {NULL, NULL, NULL, NULL}, 0, {NULL, NULL} };
...
enum ComTypeId cmdtable_lookup_alias( const CommandType cmdtable[], const char *alias );
cmdtable[found].id (όπου found, η τιμή του μετρητή από το loop που σκανάρει τις γραμμές του πίνακα)
parser( char *input, Command *command )
{
...
ComTypeId try = cmdtable_lookup_alias( cmdtable, token1st );
if ( CMDID_INVALID != try )
memcpy( command, &cmdtable[ try ], sizeof(Command) );
...
}
...
for (int i=0; i < command->nparams && more_stuff_in_stdin; i++ )
strncpy( command->params[ i ], next_token_from_stdin, MAXLEN_PARAM];
...
...
get_input( input );
parse_input( input, cmdtable, &command);
switch ( command.id )
{
case CMDID_LOOK:
do_cmd_lookup( command );
break;
case CMDID_HELP:
do_cmd_help( command );
break;
...
}
...
get_input( input );
parse_input( input, cmdtable, &command);
if ( CMDID_INVALID == command.id )
/* handle error here */
else
command.funcptr( command );
#define MAX_CMD_ALIASES 4
#define MAX_CMD_PARAMS 2
typedef struct CommandType {
enum ComTypeId id;
char *aliases[ MAX_CMD_ALIASES ]; /* array of char ptrs (μπορείς να το κάνεις στατικό πίνακα αν σε βολεύει καλύτερα) */
int nparams; /* */
char *params[ MAX_CMD_PARAMS ]; /* array of char ptrs (κι αυτό μπορείς να το κάνεις στατικό πίνακα) */
void (*funcptr)( struct CommandType command );
} CommandType;
...
int main( void )
{
CommandType cmdtable[ MAX_COMMANDS ] = {
/* .id .aliases .nparams .params */
{ CMDID_EXIT, {"exit", "x", "quit", "q"}, 0, {NULL, NULL}, &do_exit },
{ CMDID_HELP, {"help", "h", "?", NULL}, 0, {NULL, NULL} &do_help },
{ CMDID_LOOK, {"look", NULL, NULL, NULL}, 1, {NULL, NULL}, &do_look },
{ CMDID_GO, {"go", "walk", NULL, NULL}, 0, {NULL, NULL}, &do_go },
{ CMDID_SHOOT, {"shoot", "hit", NULL, NULL}, 1, {NULL, NULL}, &do_shoot },
{ CMDID_GET, {"get", "pick", NULL, NULL}, 1, {NULL, NULL}, &do_get },
{ CMDID_DROP, {"drop", NULL, NULL, NULL}, 2, {NULL, NULL}, &do_drop }
};
CommandType command = { CMDID_INVALID, {NULL, NULL, NULL, NULL}, 0, {NULL, NULL}, NULL };
...

command.funcptr( command );
cmdtable[ command.id ].funcptr( command );



migf1 έγραψε:Νομίζω έχεις βάλει πάρα πολλά πράγματα για αρχή! Αλλά μιλάμε για πάααρα πολλά

