void run_game() { // Create player 1 std::list<Link> player1; Link p1start = {5, MAX_BOARD_Y / 2, 'X', 1}; player1.push_back(p1start); // Create player 2 std::list<Link> player2; Link p2start = {MAX_BOARD_X - 5, MAX_BOARD_Y / 2, 'O', 2}; player2.push_back(p2start); clear(); print_board(); print_snake(player1); print_snake(player2); // Wait for initial direction input int p1direction; int p2direction; bool p1sel = false; bool p2sel = false; while(!(p1sel && p2sel)) { if (kbhit()) { int input = getch(); if (!p1sel) { p1sel = get_init_dir(p1direction, input, 1); } if (!p2sel) { p2sel = get_init_dir(p2direction, input, 2); } } } int loser = 0; while(loser == 0) { game_frame(player1, p1direction, player2, p2direction); loser = check_collisions(player1, player2); if (loser == 0) { loser = check_collisions(player2, player1); } } if (!play_again(loser)) { return; } else { run_game(); } }
void game_frame(std::list<Link>& player1, int& p1direction, std::list<Link>& player2, int& p2direction) { // Wait and accept up to 1 direction change clock_t start = clock(); bool p1changed = false; bool p2changed = false; while( ((clock()-start) / (double) CLOCKS_PER_SEC) < (1 / FRAMES_PER_SEC)) { if (kbhit()) { int input = getch(); if (!p1changed) { p1changed = get_dir(p1direction, input, 1); } if (!p2changed) { p2changed = get_dir(p2direction, input, 2); } } } move_snek(player1, p1direction); move_snek(player2, p2direction); print_snake(player1); print_snake(player2); }
bool snake_valid( cube_t *cube, position_t *position, char *binary_string) { int i; position_t * position_; bool valid_snake; printf( "%s\n", binary_string); print_snake( position); if( strlen( binary_string) == 1) { return true; } if( binary_string[0] == '0') { position_ = position_append( position, position->d); if( position_valid( cube, position_)) { valid_snake = snake_valid( cube, position_, binary_string + 1); free_position( position_); return valid_snake; } else { free_position( position_); return false; } } else { for( i = 1; i <= 3; i++) { if( abs( position->d ) != abs( i)) { position_ = position_append( position, i ); if( position_valid( cube, position_)){ valid_snake = snake_valid( cube, position_, binary_string + 1); free_position(position_); if( valid_snake) return true; } } } for( i = -1; i >= -3; i--) { if( abs( position->d ) != abs( i)) { position_ = position_append( position, i ); if( position_valid( cube, position_)){ valid_snake = snake_valid( cube, position_, binary_string + 1); free_position(position_); if( valid_snake) return true; } } } return false; } }
void restart_game(int *sx, int *sy, int len) { int i = 5; while(i--) { print_snake(sx, sy, len); usleep(1000*500); erase_snake(sx,sy, len); usleep(1000*500); } memset(fb_v.memo, 0, fb_v.w*fb_v.h*fb_v.bpp/8); barriar(); for(i=0; i<len; i++) { sx[i] = 250-i*50; sy[i] = 300; } }