diff --git a/star.c b/star.c index 6dba4d1..1a7838f 100644 --- a/star.c +++ b/star.c @@ -13,56 +13,121 @@ char* levels[] = { "WWWWWWWWWWWWWWWWWBWWVVVVVVVVGWCWWVVVVVVVVVVGVWWWWVVVVVVVWWGVVVVWWVVVWWVGVVVVVVWWWWVGVVGVVVVVGVVWWVGVVVVVVGWWVGVWWVVVVVWWGVVVVVGWWWWWWWWWWWWWWWWW" }; -struct { +typedef struct { char level[ LEVEL_HEIGHT * LEVEL_WIDTH ]; + char moving; + int moves; } state; -int count_gifts( char* lvl ) +int count_gifts( state *s ) { int i, n = 0; for( i = 0 ; i < LEVEL_HEIGHT * LEVEL_WIDTH ; i++ ) { - if ( lvl[ i ] == GIFT ) { + if ( s->level[ i ] == GIFT ) { n++; } } return n; } -void get_pos( char* lvl, char item, int* pos ) +void get_pos( state *s, int* pos ) { int p; - p = (int)( strchr( lvl, item ) - lvl ); - fprintf( stderr, "### %i\n", p ); + p = (int)( strchr( s->level, s->moving ) - s->level ); pos[ 1 ] = p / LEVEL_WIDTH; pos[ 0 ] = p - ( pos[ 1 ] * LEVEL_WIDTH ); } -char get_cell( char* lvl, int x, int y ) +char get_cell( state *s, int x, int y ) { - return lvl[ y * LEVEL_WIDTH + x ]; + return s->level[ y * LEVEL_WIDTH + x ]; } -void load_level( char* lvl ) +void set_cell( state *s, int x, int y, char item ) { - strncpy( state.level, lvl, LEVEL_HEIGHT * LEVEL_WIDTH ); + s->level[ y * LEVEL_WIDTH + x ] = item; } -void display_level( char* lvl ) +void load_level( state *s, char* lvl ) +{ + strncpy( s->level, lvl, LEVEL_HEIGHT * LEVEL_WIDTH ); + s->moving = BALL; + s->moves = 0; +} + +void switch_actor( state *s ) +{ + s->moving = (s->moving == BALL) ? CUBE : BALL; +} + +int won_or_not( state *s ) +{ + return( count_gifts( s ) == 0 ); +} + +void move( state *s, int direction ) +{ + int dx = 0, dy = 0, tmpx, tmpy, *item_coord; + item_coord = malloc( sizeof( int ) * 2 ); + get_pos( s, item_coord ); + tmpx = item_coord[ 0 ]; + tmpy = item_coord[ 1 ]; + + switch( direction ) { + case 'u': + dy--; + break; + case 'd': + dy++; + break; + case 'l': + dx--; + break; + case 'r': + dx++; + break; + default: break; + } + + /* Calculating arrival coordinates */ + while ( + ( ( tmpx + dx >= 0 ) && ( tmpx + dx < LEVEL_WIDTH ) ) && + ( ( tmpy + dy >= 0 ) && ( tmpy + dy < LEVEL_HEIGHT ) ) && + ( get_cell( s, tmpx + dx, tmpy + dy ) == VOID ) + || ( s->moving == BALL && ( get_cell( s, tmpx + dx, tmpy + dy ) == GIFT ) ) + ) { + tmpx += dx; + tmpy += dy; + + if ( s->moving == BALL && get_cell( s, tmpx, tmpy ) == GIFT ) { + set_cell( s, tmpx, tmpy, VOID ); + } + } + + /* Moving to arrival coordinates */ + set_cell( s, item_coord[ 0 ], item_coord[ 1 ], VOID ); + set_cell( s, tmpx, tmpy, s->moving ); + + free( item_coord ); +} + +void display_level( state *s ) { int i, j, *ball, *cube; - ball = malloc( sizeof( int ) * 2 ); - cube = malloc( sizeof( int ) * 2 ); - printf( "%i gifts\n", count_gifts( lvl ) ); - get_pos( lvl, BALL, ball ); - get_pos( lvl, CUBE, cube ); - printf( "Ball: ( %i, %i) ; Cube: ( %i, %i)\n", ball[ 0 ], ball[ 1 ], cube[ 0 ], cube[ 1 ] ); + printf( "%i gifts left", count_gifts( s ) ); + if ( won_or_not( s ) ) { + printf( ", You WON !\n"); + } + else { + printf( ", go on.\n"); + } for( i = 0 ; i < LEVEL_HEIGHT ; i++ ) { for( j = 0 ; j < LEVEL_WIDTH ; j++ ) { - switch( get_cell( lvl, j, i ) ) { + switch( get_cell( s, j, i ) ) { case WALL: printf( "##" ); break; @@ -83,15 +148,25 @@ void display_level( char* lvl ) } printf( "\n" ); } - - free( ball ); - free( cube ); } int main( int argc, char* argv[] ) { - load_level( levels[ 0 ] ); + int i = 0; + state *s = malloc( sizeof( state ) ); - display_level( state.level ); + load_level( s, levels[ 0 ] ); + + display_level( s ); + fprintf( stderr, "starting to move\n" ); + char* moves = "drdluruldrdlrulurudlurdul"; + do { + fprintf( stderr, "move %c\n", moves[ i ]); + move( s, moves[ i ] ); + display_level( s ); + i++; + } while( ( ! won_or_not( s ) ) && ( moves[ i ] != '\0' ) ); + display_level( s ); + return 0; }