int find_free(point_t pos, point_t *free) { int cnt; point_t p; int i = rand() % DELTA_FIELDS; for (cnt = 0; cnt < DELTA_FIELDS; cnt++) { if (i >= DELTA_FIELDS) { i = 0; } p.x = pos.x + delta_pos[i].x; p.y = pos.y + delta_pos[i].y; if (p.x < 0 || p.y < 0 || p.x >= field_count_x || p.y >= field_count_y) { i++; continue; } if (check_food(p) == NULL) { *free = p; return 0; } i++; } return -1; }
int snake_start() { restart: score = 0; init_snake(); init_map(); clear(); refresh(); draw_score(); draw_help(); draw_box(0, 1, LINES-2, COLS-2); draw_snake(); draw_map(); gen_food(); if ((pthread_create(&thread_input, NULL, get_input, NULL)) != 0) exit(1); while (1) { usleep(speed); check_input(); if (exit_flag) { pthread_cancel(thread_input); exit_snake(); break; } if (pause_flag) { pthread_cancel(thread_input); getch(); pause_flag = 0; if ((pthread_create(&thread_input, NULL, get_input, NULL)) != 0) exit(1); } move_snake(); if (check_dead()) { pthread_cancel(thread_input); if (snake_dead_exit()) { exit_snake(); break; } goto restart; } if (check_food()) { inc_score(); draw_score(); snake_grow_one(); gen_food(); } }; return 0; }
Collision find_collision(Snake* snake, FoodList* food_list, Screen* screen) { if (!within_screen(snake, screen)) { return SCREEN; } if (check_autophagy(snake)) { return SNAKE; } if (check_food(snake, food_list)) { return FOOD; } return NONE; }