mirror of
https://github.com/gwenhael-le-moine/c-urs_-toil-s.git
synced 2024-12-27 09:58:44 +01:00
phew, working...
This commit is contained in:
parent
538de01186
commit
d8c2f3114f
1 changed files with 98 additions and 23 deletions
121
star.c
121
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 ) );
|
||||
|
||||
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 );
|
||||
|
||||
display_level( state.level );
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue