Initialization
This commit is contained in:
		
							parent
							
								
									50f4be2f43
								
							
						
					
					
						commit
						cc5cf12df7
					
				
							
								
								
									
										136
									
								
								a2/snake.c
									
									
									
									
									
								
							
							
						
						
									
										136
									
								
								a2/snake.c
									
									
									
									
									
								
							@ -1,58 +1,110 @@
 | 
			
		||||
#include "snake.h"
 | 
			
		||||
#include "world.h"
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <curses.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include "snake.h"
 | 
			
		||||
// This file contains functions for drawing the the game and changing the state
 | 
			
		||||
 | 
			
		||||
struct snake* add_snake(struct snake* snake,int x,int y){
 | 
			
		||||
    struct snake* head = calloc(1,sizeof(struct snake));
 | 
			
		||||
    head->x = x;
 | 
			
		||||
    head->y = y;
 | 
			
		||||
    head->next = snake;
 | 
			
		||||
    return head;
 | 
			
		||||
// Start is called one in the beginning
 | 
			
		||||
void* init_game(){
 | 
			
		||||
    // Allocate memory for the state
 | 
			
		||||
    struct state* st = calloc(1,(sizeof(struct state)));
 | 
			
		||||
    return st;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct snake* remove_snake(struct snake* snake) {
 | 
			
		||||
    if (snake == NULL) {
 | 
			
		||||
        return NULL;
 | 
			
		||||
// The first event
 | 
			
		||||
// Initialize game state
 | 
			
		||||
// - borders
 | 
			
		||||
// - snake position
 | 
			
		||||
// - food position
 | 
			
		||||
void init_snake(struct event* world, struct state* st){
 | 
			
		||||
    int cy = world->height/2;
 | 
			
		||||
    int cx = world->width/2 - 5;
 | 
			
		||||
    for (int i = 0; i < 5; i++){
 | 
			
		||||
        st->snake = add_snake(st->snake,cx + i ,cy);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (snake->next == NULL) {
 | 
			
		||||
        free(snake);
 | 
			
		||||
        return NULL;
 | 
			
		||||
    int h = world->height;
 | 
			
		||||
    int w = world->width;
 | 
			
		||||
    for (int i = 0; i < 5; i++){
 | 
			
		||||
        st->foodx[i] = rand() % w;
 | 
			
		||||
        st->foody[i] = rand() % h;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    struct snake* current = snake;
 | 
			
		||||
    while (current->next->next != NULL) {
 | 
			
		||||
        current = current->next;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    free(current->next);
 | 
			
		||||
    current->next = NULL;
 | 
			
		||||
 | 
			
		||||
    return snake;
 | 
			
		||||
    // Initial game vector
 | 
			
		||||
    st->sx = 1;
 | 
			
		||||
    st->sy = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void free_snake(struct snake* sn) {
 | 
			
		||||
    struct snake* current = sn;
 | 
			
		||||
    struct snake* next;
 | 
			
		||||
 | 
			
		||||
    while (current!= NULL) {
 | 
			
		||||
        next = current->next;
 | 
			
		||||
        free(current);
 | 
			
		||||
        current = next;
 | 
			
		||||
// Step is called in a loop once in interval.
 | 
			
		||||
// It should modify the state and draw it.
 | 
			
		||||
int world_event(struct event* w,void* game){
 | 
			
		||||
    // Get state pointer
 | 
			
		||||
    struct state* st = game;
 | 
			
		||||
    if (w->type == EVENT_START){
 | 
			
		||||
        // Called on beginning
 | 
			
		||||
        init_snake(w,st);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int is_snake(struct snake* snake,int x,int y){
 | 
			
		||||
    while (snake != NULL) {
 | 
			
		||||
        if (snake->x == x && snake->y == y) {
 | 
			
		||||
            return 1;
 | 
			
		||||
    // Called on key press
 | 
			
		||||
    else if (w->type == EVENT_KEY){
 | 
			
		||||
        int key = w->key;
 | 
			
		||||
        // Modifies vector of snake movement
 | 
			
		||||
        if (key == KEY_RIGHT){
 | 
			
		||||
           st->sx = 1;
 | 
			
		||||
           st->sy = 0;
 | 
			
		||||
        }
 | 
			
		||||
        else if (key == KEY_LEFT){
 | 
			
		||||
            st->sx = -1;
 | 
			
		||||
            st->sy = 0;
 | 
			
		||||
        }
 | 
			
		||||
        else if (key == KEY_DOWN){
 | 
			
		||||
            st->sx = 0;
 | 
			
		||||
            st->sy = 1;
 | 
			
		||||
        }
 | 
			
		||||
        else if (key == KEY_UP){
 | 
			
		||||
            st->sx = 0;
 | 
			
		||||
            st->sy = -1;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    // Called on esc key
 | 
			
		||||
    else if (w->type == EVENT_ESC){
 | 
			
		||||
            // Non zero means finish the loop and stop the game.
 | 
			
		||||
            return 1;
 | 
			
		||||
    }
 | 
			
		||||
    // Called on interval timeout
 | 
			
		||||
    else if (w->type == EVENT_TIMEOUT){
 | 
			
		||||
        clear_screen();
 | 
			
		||||
        // Copy screen size
 | 
			
		||||
        st->width = w->width;
 | 
			
		||||
        st->height = w->height;
 | 
			
		||||
        // Change game state
 | 
			
		||||
        int r = step_state(st);
 | 
			
		||||
        char ms[200];
 | 
			
		||||
        sprintf(ms,"r %d\n",r);
 | 
			
		||||
        set_message(ms,9,9);
 | 
			
		||||
        // Draw snake
 | 
			
		||||
        struct snake* sn = st->snake;
 | 
			
		||||
        while (sn != NULL){
 | 
			
		||||
            set_cell('x',sn->x,sn->y);
 | 
			
		||||
            sn = sn->next;
 | 
			
		||||
        }
 | 
			
		||||
        // Draw food
 | 
			
		||||
        for (int i = 0 ; i < FOOD_COUNT; i++){
 | 
			
		||||
            if (st->foodx[i] >= 0 && st->foody[i] >= 0){
 | 
			
		||||
                set_cell('*',st->foodx[i],st->foody[i]);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        // Stop the game
 | 
			
		||||
        if (r){
 | 
			
		||||
            char message[] = "Koniec";
 | 
			
		||||
            set_message(message,10,10);
 | 
			
		||||
        }
 | 
			
		||||
        snake = snake->next;
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int step_state(struct state* st){
 | 
			
		||||
	int nx = (st->snake->x + st->sx);
 | 
			
		||||
    int ny = (st->snake->y + st->sy);
 | 
			
		||||
    return END_CONTINUE;
 | 
			
		||||
 | 
			
		||||
int main(int argc, char** argv){
 | 
			
		||||
    start_world(init_game,world_event,free);
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user