domaca_uloha_7
This commit is contained in:
		
							parent
							
								
									7b1bae7de2
								
							
						
					
					
						commit
						2e2720ce15
					
				
							
								
								
									
										14
									
								
								du7/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								du7/Makefile
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,14 @@
 | 
			
		||||
CFLAGS=-std=c99 -Wall -g
 | 
			
		||||
 | 
			
		||||
all: game
 | 
			
		||||
 | 
			
		||||
%.o: %.c
 | 
			
		||||
	gcc $(CFLAGS) -c $< -o $@
 | 
			
		||||
 | 
			
		||||
clean:
 | 
			
		||||
	rm *.o
 | 
			
		||||
	rm game
 | 
			
		||||
 | 
			
		||||
game: main.o world.o snake.o
 | 
			
		||||
	gcc -rdynamic -g main.o world.o snake.o -lcurses -lm -o game
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										16
									
								
								du7/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								du7/README.md
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,16 @@
 | 
			
		||||
# Snake Master
 | 
			
		||||
 | 
			
		||||
Implement Snake game.
 | 
			
		||||
 | 
			
		||||
Make the game to pass the automatic tests and make the game to be nice.
 | 
			
		||||
 | 
			
		||||
## Files
 | 
			
		||||
 | 
			
		||||
Please do not change file names.
 | 
			
		||||
 | 
			
		||||
- `snake.h`: you implementation should follow this header.
 | 
			
		||||
- `snake.c`: implemement the game according to the documentation in header file  in this file to pass automatic tests.
 | 
			
		||||
- `Makefile`: rules to build the game.
 | 
			
		||||
- `main.c`: trivial main function that runs the game, modify this file to change the appereance of the game and the initial state.
 | 
			
		||||
- `world.c`: world game loop and ASCII graphics library (do not change).
 | 
			
		||||
- `world.h`: world library interface (do not change).
 | 
			
		||||
							
								
								
									
										110
									
								
								du7/main.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								du7/main.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,110 @@
 | 
			
		||||
#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
 | 
			
		||||
 | 
			
		||||
// 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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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;
 | 
			
		||||
    }
 | 
			
		||||
    // Initial game vector
 | 
			
		||||
    st->sx = 1;
 | 
			
		||||
    st->sy = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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);
 | 
			
		||||
    }
 | 
			
		||||
    // 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);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int main(int argc, char** argv){
 | 
			
		||||
    start_world(init_game,world_event,free);
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										37
									
								
								du7/snake.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								du7/snake.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,37 @@
 | 
			
		||||
#include "snake.h"
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
 | 
			
		||||
struct snake* add_snake(struct snake* snake,int x,int y){
 | 
			
		||||
	if (snake == NULL) return NULL;
 | 
			
		||||
	
 | 
			
		||||
	struct snake* novyZaciatok;
 | 
			
		||||
	novyZaciatok->x = x;
 | 
			
		||||
	novyZaciatok->y = y;
 | 
			
		||||
	snake->next = novyZaciatok;
 | 
			
		||||
	
 | 
			
		||||
    return novyZaciatok;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct snake* remove_snake(struct snake* snake){
 | 
			
		||||
    return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void free_snake(struct snake* sn){
 | 
			
		||||
	struct snake* nasledujuci;
 | 
			
		||||
	
 | 
			
		||||
	while (sn != NULL) {
 | 
			
		||||
		nasledujuci = sn->next;
 | 
			
		||||
		free(sn);
 | 
			
		||||
		sn = nasledujuci;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int is_snake(struct snake* snake,int x,int y){
 | 
			
		||||
    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;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										114
									
								
								du7/snake.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								du7/snake.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,114 @@
 | 
			
		||||
#ifndef snake_h_INCLUDED
 | 
			
		||||
#define snake_h_INCLUDED
 | 
			
		||||
 | 
			
		||||
// Number of food items on the plane
 | 
			
		||||
#define FOOD_COUNT 5
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * One part of the snake;
 | 
			
		||||
 * 
 | 
			
		||||
 * The snake is a linked list;
 | 
			
		||||
 */
 | 
			
		||||
 
 | 
			
		||||
struct snake {
 | 
			
		||||
    // x position of the snake part
 | 
			
		||||
    int x;
 | 
			
		||||
    // y position of the snake part
 | 
			
		||||
    int y;
 | 
			
		||||
    // Pointer to the next snake part.
 | 
			
		||||
    // The last part of the snake has NULL pointer to the next part.
 | 
			
		||||
    struct snake* next;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// End game reason constants, return value of step_state
 | 
			
		||||
enum endgame {
 | 
			
		||||
    // Continue the game
 | 
			
		||||
    END_CONTINUE = 0,
 | 
			
		||||
    // Snake hit a wall
 | 
			
		||||
    END_WALL,
 | 
			
		||||
    // Snake hit itself
 | 
			
		||||
    END_SNAKE,
 | 
			
		||||
    // No food left
 | 
			
		||||
    END_FOOD,
 | 
			
		||||
    // Other reason to end
 | 
			
		||||
    END_USER
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * State of the game.
 | 
			
		||||
 * 
 | 
			
		||||
 * The state consists of the snake, its speed and food on the plane.
 | 
			
		||||
 * 
 | 
			
		||||
 * The snake is a linked list of snake parts.
 | 
			
		||||
 * 
 | 
			
		||||
 * Speed vector is a vector added to the last head position to create a new head.
 | 
			
		||||
 * 
 | 
			
		||||
 * Food are points on the plane. Food with negative coordinates meads food is already eaten.
 | 
			
		||||
 */
 | 
			
		||||
 
 | 
			
		||||
struct state {
 | 
			
		||||
    // Snake as a linked list
 | 
			
		||||
    struct snake* snake;
 | 
			
		||||
    // X of the food positions
 | 
			
		||||
    int foodx[FOOD_COUNT];
 | 
			
		||||
    // Y of the food positions
 | 
			
		||||
    int foody[FOOD_COUNT];
 | 
			
		||||
    int sx;
 | 
			
		||||
    int sy;
 | 
			
		||||
    int width;
 | 
			
		||||
    int height;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Add a new snake part with given position. The new snake part becomes the new head.
 | 
			
		||||
 *
 | 
			
		||||
 * @param head of the snake.
 | 
			
		||||
 * @param x coordinate of the new head;
 | 
			
		||||
 * @param y coordinate of the new head.
 | 
			
		||||
 * @return new head of the snake.
 | 
			
		||||
 */
 | 
			
		||||
struct snake* add_snake(struct snake* snake,int x,int y);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Remove the last snake part.
 | 
			
		||||
 * The last snake part  should always have NULL next pointer.
 | 
			
		||||
 *
 | 
			
		||||
 * @param head of the snake.
 | 
			
		||||
 * @return new head of the snake.
 | 
			
		||||
 */
 | 
			
		||||
struct snake* remove_snake(struct snake* snake);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Finds out if given coordinates are part of the snake.
 | 
			
		||||
 * @param snake
 | 
			
		||||
 * @param x coordinate to search in snake
 | 
			
		||||
 * @param y coordinate to search in snake
 | 
			
		||||
 * @return True, if there is a snake part with coordinates x,y. False otherwise
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
int is_snake(struct snake* snake,int x, int y);
 | 
			
		||||
/**
 | 
			
		||||
 * Remove and free each snake part;
 | 
			
		||||
 * @param head of the snake.
 | 
			
		||||
 */
 | 
			
		||||
void free_snake(struct snake* sn);
 | 
			
		||||
/**
 | 
			
		||||
 * Change game state.
 | 
			
		||||
 *
 | 
			
		||||
 * The function shoud calculate new posision of the snake head
 | 
			
		||||
 * from the current position and speed vector.
 | 
			
		||||
 * Then it should modify snake parst  or food coordinates according to the rules:
 | 
			
		||||
 * 
 | 
			
		||||
 * - If the new position is on the snake, end the game, return END_SNAKE.
 | 
			
		||||
 * - If the new position is on the food, mark food as eaten
 | 
			
		||||
 *   (set its coordinates to -1) and add new snake part on the position of the food. If there is no food left, return END_FOOD. else return END_CONTINUE.
 | 
			
		||||
 * - If the new position is on the plane, add new snake part on the new position and remove the last part of the snake, return END_CONTINUE.
 | 
			
		||||
 * 
 | 
			
		||||
 * @param current state of the game
 | 
			
		||||
 * @return reason to end the game according to enum endgame.
 | 
			
		||||
 */
 | 
			
		||||
int step_state(struct state* state);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif // snake_h_INCLUDED
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										198
									
								
								du7/world.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										198
									
								
								du7/world.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,198 @@
 | 
			
		||||
#include "world.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <time.h>
 | 
			
		||||
 | 
			
		||||
int TIMEOUT;
 | 
			
		||||
 | 
			
		||||
void abort_game(const char* message){
 | 
			
		||||
    endwin();
 | 
			
		||||
    puts(message);
 | 
			
		||||
    exit(1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void check_bounds(const char* source,int x, int y){
 | 
			
		||||
    char msg[200];
 | 
			
		||||
    if (x < 0 || x >= COLS){
 | 
			
		||||
        sprintf(msg,"%s:: width %d is out of bounds (0,%d)",source,x,COLS);
 | 
			
		||||
        abort_game(msg);
 | 
			
		||||
    }
 | 
			
		||||
    if (y < 0 || y >= LINES){
 | 
			
		||||
        sprintf(msg,"%s:: height %d is out of bounds (0,%d)",source,y,LINES);
 | 
			
		||||
        abort_game(msg);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void clear_screen(){
 | 
			
		||||
    // Clear screen
 | 
			
		||||
    mvaddch(0,0,' ');
 | 
			
		||||
    int screenchars = LINES*COLS;
 | 
			
		||||
    for (int j = 1; j < screenchars;j++ ){
 | 
			
		||||
        addch(' ');
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void game_speed(int value){
 | 
			
		||||
    if (value < 0){
 | 
			
		||||
        abort_game("world_seed:: cannot be negative\n");
 | 
			
		||||
    }
 | 
			
		||||
    TIMEOUT =value;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void set_message(const char* message,int x,int y) {
 | 
			
		||||
    int l = strlen(message);
 | 
			
		||||
    for (int i = 0; i < l; i++){
 | 
			
		||||
        check_bounds("set_message",x+i,y);
 | 
			
		||||
        set_cell(message[i],x+i,y);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void assert_message(int event,const char* message){
 | 
			
		||||
    if (event == 0){
 | 
			
		||||
        abort_game(message);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void set_cell(int character,int x,int y) {
 | 
			
		||||
    check_bounds("set_cell",x,y);
 | 
			
		||||
    set_color_cell(character,x,y,COLOR_WHITE,COLOR_BLACK);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void set_color_cell(int character,int x,int y,short front_color,short back_color){
 | 
			
		||||
    check_bounds("set_color_cell",x,y);
 | 
			
		||||
    if (has_colors()){
 | 
			
		||||
        int pair = COLOR_COUNT * front_color + back_color; 
 | 
			
		||||
        attron(COLOR_PAIR(pair));
 | 
			
		||||
        mvaddch(y,x,character);
 | 
			
		||||
        attroff(COLOR_PAIR(pair));
 | 
			
		||||
    }
 | 
			
		||||
    else{
 | 
			
		||||
        mvaddch(y,x,character);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int start_world(void* (*init_game)(),int (*world_event)(struct event* event,void* game),void (*destroy_game)(void*)){
 | 
			
		||||
    srand(time(NULL));
 | 
			
		||||
    int r = 1;
 | 
			
		||||
    // Speed global variable
 | 
			
		||||
    TIMEOUT = 100;
 | 
			
		||||
    if (initscr() == NULL){
 | 
			
		||||
        // TODO Which Error?
 | 
			
		||||
        puts("Curses Error.");
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
    noecho(); // Nevypisuj vstup na obrazovku
 | 
			
		||||
    cbreak(); // Zabudni starý vstup
 | 
			
		||||
    nodelay(stdscr,TRUE); // Nečakaj na stlačenie
 | 
			
		||||
    keypad(stdscr,TRUE); // Aktivuje šípky
 | 
			
		||||
    curs_set(FALSE); // Neviditeľný kurzor
 | 
			
		||||
    /* Get all the mouse events */
 | 
			
		||||
    mousemask(ALL_MOUSE_EVENTS, NULL);
 | 
			
		||||
    MEVENT mouse_event;
 | 
			
		||||
    if (has_colors()){ // Zistenie či terminál podporuje farby
 | 
			
		||||
        start_color();
 | 
			
		||||
        for (int i = 0; i < COLOR_COUNT;i++){
 | 
			
		||||
            for (int j = 0; j < COLOR_COUNT;j++){
 | 
			
		||||
                init_pair(i * COLOR_COUNT + j, i,j);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        puts("No colors!\n");
 | 
			
		||||
    }
 | 
			
		||||
    void* game = NULL;
 | 
			
		||||
    if (init_game != NULL){
 | 
			
		||||
         game = init_game();
 | 
			
		||||
         assert_message(game != NULL,"init_game:: should return non null pointer");
 | 
			
		||||
    }
 | 
			
		||||
    timeout(TIMEOUT);
 | 
			
		||||
    // Initial step
 | 
			
		||||
    struct event event;
 | 
			
		||||
    memset(&event,0,sizeof(struct event));
 | 
			
		||||
    event.height = LINES;
 | 
			
		||||
    event.width = COLS;
 | 
			
		||||
    event.type = EVENT_START;
 | 
			
		||||
    clock_t start_time = clock();
 | 
			
		||||
    clock_t last_timeout = start_time;
 | 
			
		||||
    clock_t next_timeout = last_timeout + TIMEOUT;
 | 
			
		||||
    event.time_ms = start_time;
 | 
			
		||||
    // Start event
 | 
			
		||||
    r = world_event(&event,game);
 | 
			
		||||
    refresh();
 | 
			
		||||
    while (!r) {
 | 
			
		||||
        memset(&event,0,sizeof(struct event));
 | 
			
		||||
        event.height = LINES;
 | 
			
		||||
        event.width = COLS;
 | 
			
		||||
        event.key = getch();
 | 
			
		||||
        // No key was pressed
 | 
			
		||||
        if (event.key == ERR){
 | 
			
		||||
            event.type = EVENT_TIMEOUT;
 | 
			
		||||
            last_timeout = clock();
 | 
			
		||||
            next_timeout = last_timeout + TIMEOUT;
 | 
			
		||||
        }
 | 
			
		||||
        // Mouse event
 | 
			
		||||
        else if (event.key == KEY_MOUSE ){
 | 
			
		||||
            event.type = EVENT_MOUSE;
 | 
			
		||||
            if(getmouse(&mouse_event) == OK){
 | 
			
		||||
                event.mouse_x = mouse_event.x;
 | 
			
		||||
                event.mouse_y = mouse_event.y;
 | 
			
		||||
                if(mouse_event.bstate & BUTTON1_PRESSED){
 | 
			
		||||
                    event.mouse_left = 1;
 | 
			
		||||
                }
 | 
			
		||||
                if(mouse_event.bstate & BUTTON2_PRESSED){
 | 
			
		||||
                    event.mouse_middle = 1;
 | 
			
		||||
                }
 | 
			
		||||
                if(mouse_event.bstate & BUTTON3_PRESSED){
 | 
			
		||||
                    event.mouse_right = 1;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        else if (event.key == KEY_RESIZE) {
 | 
			
		||||
            event.type = EVENT_RESIZE;
 | 
			
		||||
        }
 | 
			
		||||
        else{
 | 
			
		||||
            event.type = EVENT_KEY;
 | 
			
		||||
            if (event.key == 27){
 | 
			
		||||
                int k = getch();
 | 
			
		||||
                if (k == -1){
 | 
			
		||||
                    // Esc Was pressed
 | 
			
		||||
                    event.type = EVENT_ESC;
 | 
			
		||||
                }
 | 
			
		||||
                else {
 | 
			
		||||
                    // Alt was pressed
 | 
			
		||||
                    event.key = k;
 | 
			
		||||
                    event.alt_key = 1;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        // Draw new world
 | 
			
		||||
        event.time_ms = clock();
 | 
			
		||||
        r = world_event(&event,game);
 | 
			
		||||
        refresh();
 | 
			
		||||
        event.time_ms = clock();
 | 
			
		||||
        // set new timeout
 | 
			
		||||
        int nt = next_timeout - event.time_ms;
 | 
			
		||||
        //printf("%d\n",nt);
 | 
			
		||||
        if (nt > 0){
 | 
			
		||||
            timeout(nt);
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            timeout(TIMEOUT);
 | 
			
		||||
            next_timeout = event.time_ms + TIMEOUT;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    memset(&event,0,sizeof(struct event));
 | 
			
		||||
    event.height = LINES;
 | 
			
		||||
    event.width = COLS;
 | 
			
		||||
    event.type = EVENT_END;
 | 
			
		||||
    event.time_ms = clock();
 | 
			
		||||
    world_event(&event,game);
 | 
			
		||||
    if (destroy_game != NULL){
 | 
			
		||||
        destroy_game(game);
 | 
			
		||||
    }
 | 
			
		||||
    endwin();
 | 
			
		||||
    return r;
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										122
									
								
								du7/world.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								du7/world.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,122 @@
 | 
			
		||||
#ifndef _WORLD_H_
 | 
			
		||||
#define _WORLD_H_
 | 
			
		||||
 | 
			
		||||
#include <curses.h>
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * World represented as a rectangular matrix of colorful characters.
 | 
			
		||||
 * 
 | 
			
		||||
 * Point [0,0] is displayed the upper left corner of the screen.
 | 
			
		||||
 * 
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
enum event_type {
 | 
			
		||||
    EVENT_START,
 | 
			
		||||
    EVENT_TIMEOUT,
 | 
			
		||||
    EVENT_KEY,
 | 
			
		||||
    EVENT_MOUSE,
 | 
			
		||||
    EVENT_RESIZE,
 | 
			
		||||
    EVENT_ESC,
 | 
			
		||||
    EVENT_END,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct event {
 | 
			
		||||
    /**
 | 
			
		||||
     * Last width of the screen.
 | 
			
		||||
     */
 | 
			
		||||
    int width;
 | 
			
		||||
    /**
 | 
			
		||||
     * Last height of the screen.
 | 
			
		||||
     */
 | 
			
		||||
    int height;
 | 
			
		||||
    /**
 | 
			
		||||
     * Last pressed key or Curses event.
 | 
			
		||||
     *
 | 
			
		||||
     * Special event  values:
 | 
			
		||||
     * ERR if timeout,
 | 
			
		||||
     * KEY_RESIZE if screen resize
 | 
			
		||||
     * KEY_EVENT, other event,
 | 
			
		||||
     * KEY_MOUSE, mouse clicked
 | 
			
		||||
     *
 | 
			
		||||
     * Key values:
 | 
			
		||||
     *
 | 
			
		||||
     * ' ' Space
 | 
			
		||||
     * KEY_DOWN Arrow down
 | 
			
		||||
     * KEY_UP Arrow up
 | 
			
		||||
     * KEY_LEFT Arrow left
 | 
			
		||||
     * KEY_RIGHT Arrow right
 | 
			
		||||
     * KEY_A1 Upper left of keypad
 | 
			
		||||
     * KEY_A3 Upper right of keypad
 | 
			
		||||
     * KEY_B2 Center of keypad
 | 
			
		||||
     * KEY_C1 Lower left of keypad
 | 
			
		||||
     * KEY_C3 Lower right of keypad
 | 
			
		||||
     *
 | 
			
		||||
     * KEY_ENTER
 | 
			
		||||
     * KEY_BACKSPACE
 | 
			
		||||
     */
 | 
			
		||||
    int key;
 | 
			
		||||
    int alt_key;
 | 
			
		||||
    enum event_type type;
 | 
			
		||||
    int mouse_x;
 | 
			
		||||
    int mouse_y;
 | 
			
		||||
    int mouse_left;
 | 
			
		||||
    int mouse_right;
 | 
			
		||||
    int mouse_middle;
 | 
			
		||||
    long int time_ms;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Sets cell to a state.
 | 
			
		||||
 * @param event 
 | 
			
		||||
 * @param x coordinate of cell
 | 
			
		||||
 * @param y coordinate of cell
 | 
			
		||||
 * @param new state of the cell
 | 
			
		||||
 */
 | 
			
		||||
void set_cell(int character,int x,int y);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * COLOR_BLACK   0
 | 
			
		||||
 * COLOR_RED     1
 | 
			
		||||
 * COLOR_GREEN   2
 | 
			
		||||
 * COLOR_YELLOW  3
 | 
			
		||||
 * COLOR_BLUE    4
 | 
			
		||||
 * COLOR_MAGENTA 5
 | 
			
		||||
 * COLOR_CYAN    6
 | 
			
		||||
 * COLOR_WHITE   7
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define COLOR_COUNT 8
 | 
			
		||||
 | 
			
		||||
void set_color_cell(int character,int x,int y,short front_color,short back_color);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *
 | 
			
		||||
 * @param event
 | 
			
		||||
 * @param number of commandline arguments
 | 
			
		||||
 * @param init_world
 | 
			
		||||
 * @param destroy_world
 | 
			
		||||
 *
 | 
			
		||||
 * void init_world(struct event* w);
 | 
			
		||||
 * Initializes user state.
 | 
			
		||||
 * Free user state.
 | 
			
		||||
 * @param event
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
int start_world(void* (*init_game)(),int (*world_event)(struct event* event,void* game),void (*destroy_game)(void* game));
 | 
			
		||||
/**
 | 
			
		||||
 * Set timeout interval in miliseconds
 | 
			
		||||
 */
 | 
			
		||||
void game_speed(int value);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Prints a message in screen on a position x,y
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
void set_message(const char* message,int x,int y);
 | 
			
		||||
/*
 | 
			
		||||
 * Clears screen
 | 
			
		||||
 */
 | 
			
		||||
void clear_screen();
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user