Adding source files
This commit is contained in:
parent
ffcbb893de
commit
0305d80f7e
54
.gitignore
vendored
Normal file
54
.gitignore
vendored
Normal file
@ -0,0 +1,54 @@
|
||||
# ---> C
|
||||
# Prerequisites
|
||||
*.d
|
||||
|
||||
# Object files
|
||||
*.o
|
||||
*.ko
|
||||
*.obj
|
||||
*.elf
|
||||
|
||||
# Linker output
|
||||
*.ilk
|
||||
*.map
|
||||
*.exp
|
||||
|
||||
# Precompiled Headers
|
||||
*.gch
|
||||
*.pch
|
||||
|
||||
# Libraries
|
||||
*.lib
|
||||
*.a
|
||||
*.la
|
||||
*.lo
|
||||
|
||||
# Shared objects (inc. Windows DLLs)
|
||||
*.dll
|
||||
*.so
|
||||
*.so.*
|
||||
*.dylib
|
||||
|
||||
# Executables
|
||||
*.exe
|
||||
*.out
|
||||
*.app
|
||||
*.i*86
|
||||
*.x86_64
|
||||
*.hex
|
||||
|
||||
# Debug files
|
||||
*.dSYM/
|
||||
*.su
|
||||
*.idb
|
||||
*.pdb
|
||||
|
||||
# Kernel Module Compile Results
|
||||
*.mod*
|
||||
*.cmd
|
||||
.tmp_versions/
|
||||
modules.order
|
||||
Module.symvers
|
||||
Mkfile.old
|
||||
dkms.conf
|
||||
|
28
Makefile
Normal file
28
Makefile
Normal file
@ -0,0 +1,28 @@
|
||||
CC = gcc
|
||||
FLAGS = -Wall -g
|
||||
LFLAGS = -lcatwalk
|
||||
|
||||
all: bin/catwalk
|
||||
|
||||
bin/catwalk: obj/main.o obj/interact.o obj/print.o obj/simplegen.o
|
||||
@mkdir -p $(@D)
|
||||
$(CC) $(FLAGS) -o $@ $(LFLAGS) $^
|
||||
|
||||
obj/%.o: src/%.c
|
||||
@mkdir -p $(@D)
|
||||
$(CC) $(FLAGS) -o $@ -c $<
|
||||
|
||||
obj/main.o: src/main.c
|
||||
obj/interact.o: src/interact.c
|
||||
obj/print.o: src/print.c
|
||||
obj/simplegen.o: src/simplegen.c
|
||||
|
||||
.PHONY: clean mrproper install
|
||||
clean:
|
||||
rm -rf obj
|
||||
mrproper: clean
|
||||
rm -rf bin
|
||||
|
||||
install: bin/catwalk
|
||||
@mkdir -p /usr/local/bin/
|
||||
cp bin/catwalk /usr/local/bin/
|
BIN
bin/catwalk
Executable file
BIN
bin/catwalk
Executable file
Binary file not shown.
307
src/interact.c
Normal file
307
src/interact.c
Normal file
@ -0,0 +1,307 @@
|
||||
/* CATWALK - Test your logic
|
||||
Copyright (C) 2021 Valentin Moguerou
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULIAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/> */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <catwalk/grid.h>
|
||||
#include <catwalk/route.h>
|
||||
|
||||
#include "print.h"
|
||||
#include "interact.h"
|
||||
|
||||
#define COMMAND_MAX_SIZE 100
|
||||
#define STR_STARTS_WITH(s1, s2) (strncmp(s1, s2, strlen(s2)) == 0)
|
||||
|
||||
void print_help()
|
||||
{
|
||||
printf(" | [l]eft, [r]ight - move towards the specified direction\n");
|
||||
printf(" | [u]p, [d]own - move towards the specified direction\n");
|
||||
printf(" | undo, z - undo the last move\n");
|
||||
printf(" | [r]eset - reset the grid\n");
|
||||
printf(" | help, ? - show this help\n");
|
||||
printf(" | [s]how - show the current grid\n");
|
||||
printf(" | exit, [q]uit - exit the program\n");
|
||||
}
|
||||
|
||||
void clear_buffer()
|
||||
{
|
||||
int c = 0;
|
||||
while (c != '\n' && c != EOF)
|
||||
{
|
||||
c = getchar();
|
||||
}
|
||||
}
|
||||
|
||||
int is_whitespace(char *str)
|
||||
{
|
||||
if (*str == '\0')
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
for (char *chr=str; *chr; chr++)
|
||||
{
|
||||
if (*chr != ' ' && *chr != '\t')
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
void ltrim(char *dest, char *src)
|
||||
{
|
||||
char *ch = src;
|
||||
while (*ch)
|
||||
{
|
||||
if (*ch != ' ' && *ch != '\t')
|
||||
{
|
||||
break;
|
||||
}
|
||||
ch++;
|
||||
}
|
||||
strcpy(dest, ch);
|
||||
}
|
||||
|
||||
int read_from_stdin(char *str, int length)
|
||||
{
|
||||
char *entry_position = NULL;
|
||||
|
||||
if (fgets(str, length, stdin) != NULL)
|
||||
{
|
||||
entry_position = strchr(str, '\n');
|
||||
if (entry_position != NULL)
|
||||
{
|
||||
*entry_position = '\0';
|
||||
}
|
||||
else
|
||||
{
|
||||
clear_buffer();
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
clear_buffer();
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
void interact(int width)
|
||||
{
|
||||
grid *gd = init_grid(width);
|
||||
|
||||
printf("Welcome to Catwalk CLI. Type 'help' or '?' to see all available commands.\n");
|
||||
char prompt[COMMAND_MAX_SIZE] = "";
|
||||
char buffer[COMMAND_MAX_SIZE] = "";
|
||||
|
||||
refresh_grid(gd);
|
||||
init_player_route(gd);
|
||||
|
||||
for(;;)
|
||||
{
|
||||
if (is_whitespace(prompt))
|
||||
{
|
||||
printf("catwalk> ");
|
||||
read_from_stdin(prompt, COMMAND_MAX_SIZE);
|
||||
ltrim(buffer, prompt);
|
||||
strcpy(prompt, buffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
if STR_STARTS_WITH(prompt, "help")
|
||||
{
|
||||
print_help();
|
||||
strcpy(buffer, prompt+strlen("help"));
|
||||
ltrim(prompt, buffer);
|
||||
}
|
||||
else if STR_STARTS_WITH(prompt, "?")
|
||||
{
|
||||
print_help();
|
||||
strcpy(buffer, prompt+strlen("?"));
|
||||
ltrim(prompt, buffer);
|
||||
}
|
||||
else if STR_STARTS_WITH(prompt, "show")
|
||||
{
|
||||
print_interactive_grid(gd);
|
||||
strcpy(buffer, prompt+strlen("show"));
|
||||
ltrim(prompt, buffer);
|
||||
}
|
||||
else if STR_STARTS_WITH(prompt, "reset")
|
||||
{
|
||||
if (gd->player_route->first->next == NULL)
|
||||
{
|
||||
printf("Play first!\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
delete_element(gd->player_route->first->next);
|
||||
gd->player_route->first->next = NULL;
|
||||
gd->player_route->last = gd->player_route->first;
|
||||
}
|
||||
strcpy(buffer, prompt+strlen("reset"));
|
||||
ltrim(prompt, buffer);
|
||||
}
|
||||
else if STR_STARTS_WITH(prompt, "route")
|
||||
{
|
||||
print_route(gd->player_route);
|
||||
strcpy(buffer, prompt+strlen("route"));
|
||||
ltrim(prompt, buffer);
|
||||
}
|
||||
else if (STR_STARTS_WITH(prompt, "exit") || STR_STARTS_WITH(prompt, "quit") || STR_STARTS_WITH(prompt, "q"))
|
||||
{
|
||||
break;
|
||||
}
|
||||
else if STR_STARTS_WITH(prompt, "undo")
|
||||
{
|
||||
if (gd->player_route->first->next == NULL)
|
||||
{
|
||||
printf("Can't undo! (single element)\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
pop_back(gd->player_route);
|
||||
}
|
||||
strcpy(buffer, prompt+strlen("z"));
|
||||
ltrim(prompt, buffer);
|
||||
}
|
||||
else if STR_STARTS_WITH(prompt, "left")
|
||||
{
|
||||
switch (move_left(gd->player_route))
|
||||
{
|
||||
case 1: puts("Cannot move: border of the grid"); break;
|
||||
case 2: puts("Cannot move: already went there"); break;
|
||||
}
|
||||
strcpy(buffer, prompt+strlen("left"));
|
||||
ltrim(prompt, buffer);
|
||||
}
|
||||
else if STR_STARTS_WITH(prompt, "right")
|
||||
{
|
||||
switch (move_right(gd->player_route))
|
||||
{
|
||||
case 1: puts("Cannot move: border of the grid"); break;
|
||||
case 2: puts("Cannot move: already went there"); break;
|
||||
}
|
||||
strcpy(buffer, prompt+strlen("right"));
|
||||
ltrim(prompt, buffer);
|
||||
}
|
||||
else if STR_STARTS_WITH(prompt, "up")
|
||||
{
|
||||
switch (move_up(gd->player_route))
|
||||
{
|
||||
case 1: puts("Cannot move: border of the grid"); break;
|
||||
case 2: puts("Cannot move: already went there"); break;
|
||||
}
|
||||
strcpy(buffer, prompt+strlen("up"));
|
||||
ltrim(prompt, buffer);
|
||||
}
|
||||
else if STR_STARTS_WITH(prompt, "down")
|
||||
{
|
||||
switch (move_down(gd->player_route))
|
||||
{
|
||||
case 1: puts("Cannot move: border of the grid"); break;
|
||||
case 2: puts("Cannot move: already went there"); break;
|
||||
}
|
||||
strcpy(buffer, prompt+strlen("down"));
|
||||
ltrim(prompt, buffer);
|
||||
}
|
||||
else if STR_STARTS_WITH(prompt, "s")
|
||||
{
|
||||
print_interactive_grid(gd);
|
||||
strcpy(buffer, prompt+strlen("s"));
|
||||
ltrim(prompt, buffer);
|
||||
}
|
||||
else if STR_STARTS_WITH(prompt, "l")
|
||||
{
|
||||
switch (move_left(gd->player_route))
|
||||
{
|
||||
case 1: puts("Cannot move: border of the grid"); break;
|
||||
case 2: puts("Cannot move: already went there"); break;
|
||||
}
|
||||
strcpy(buffer, prompt+strlen("l"));
|
||||
ltrim(prompt, buffer);
|
||||
}
|
||||
else if STR_STARTS_WITH(prompt, "r")
|
||||
{
|
||||
switch (move_right(gd->player_route))
|
||||
{
|
||||
case 1: puts("Cannot move: border of the grid"); break;
|
||||
case 2: puts("Cannot move: already went there"); break;
|
||||
}
|
||||
strcpy(buffer, prompt+strlen("r"));
|
||||
ltrim(prompt, buffer);
|
||||
}
|
||||
else if STR_STARTS_WITH(prompt, "u")
|
||||
{
|
||||
switch (move_up(gd->player_route))
|
||||
{
|
||||
case 1: puts("Cannot move: border of the grid"); break;
|
||||
case 2: puts("Cannot move: already went there"); break;
|
||||
}
|
||||
strcpy(buffer, prompt+strlen("u"));
|
||||
ltrim(prompt, buffer);
|
||||
}
|
||||
else if STR_STARTS_WITH(prompt, "d")
|
||||
{
|
||||
if (gd->player_route->first->next == NULL)
|
||||
{
|
||||
printf("Can't undo! (single element)\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
pop_back(gd->player_route);
|
||||
}
|
||||
strcpy(buffer, prompt+strlen("undo"));
|
||||
ltrim(prompt, buffer);
|
||||
}
|
||||
else if STR_STARTS_WITH(prompt, "z")
|
||||
{
|
||||
switch (move_down(gd->player_route))
|
||||
{
|
||||
case 1: puts("Cannot move: border of the grid"); break;
|
||||
case 2: puts("Cannot move: already went there"); break;
|
||||
}
|
||||
strcpy(buffer, prompt+strlen("d"));
|
||||
ltrim(prompt, buffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Unrecognized command : '%s'!\n", prompt);
|
||||
prompt[0] = '\0';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (gd->player_route->last->x == gd->end[0] && gd->player_route->last->y == gd->end[1])
|
||||
{
|
||||
print_interactive_grid(gd);
|
||||
if (verify(gd))
|
||||
{
|
||||
printf("You won!\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("You lost!\n");
|
||||
}
|
||||
|
||||
random_start(gd);
|
||||
refresh_grid(gd);
|
||||
reset_player_route(gd);
|
||||
}
|
||||
}
|
||||
|
||||
delete_grid(gd);
|
||||
}
|
32
src/interact.h
Normal file
32
src/interact.h
Normal file
@ -0,0 +1,32 @@
|
||||
/* CATWALK - Test your logic
|
||||
Copyright (C) 2021 Valentin Moguerou
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULIAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/> */
|
||||
|
||||
#ifndef INTERACT_H_INCLUDED
|
||||
#define INTERACT_H_INCLUDED
|
||||
|
||||
#include <catwalk/grid.h>
|
||||
|
||||
void print_help();
|
||||
|
||||
void clear_buffer();
|
||||
|
||||
int is_whitespace(char *str);
|
||||
|
||||
int read_from_stdin(char *str, int length);
|
||||
|
||||
void interact(int width);
|
||||
|
||||
#endif /* INTERACT_H_INCLUDED */
|
100
src/main.c
Normal file
100
src/main.c
Normal file
@ -0,0 +1,100 @@
|
||||
/* CATWALK - Test your logic
|
||||
Copyright (C) 2021 Valentin Moguerou
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULIAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/> */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <catwalk/grid.h>
|
||||
|
||||
#include "interact.h"
|
||||
#include "simplegen.h"
|
||||
|
||||
#define PROGRAM_VERSION "1.0"
|
||||
|
||||
void help(char *program_name)
|
||||
{
|
||||
printf("\
|
||||
Usage : %s [parameters]\n",
|
||||
program_name);
|
||||
puts("\n\
|
||||
-h, --help Print this help.\n\
|
||||
-v, --version Print version info.\n\
|
||||
-i, --interactive Launch catwalk-cli in interactive mode (default\n\
|
||||
-s, --simple Create a grid, without permitting to play.\n\
|
||||
-w, --width <width> Create a grid with the given width.\n\
|
||||
--interactive, --simple, --help and --version are mutually exclusive: the last argument is kept.\n\n\
|
||||
This program was made with love by Valentin Moguerou <valentin@moguerou.net>.");
|
||||
}
|
||||
|
||||
void version()
|
||||
{
|
||||
printf("Catwalk CLI version 1.0\n");
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int width = 4;
|
||||
char mode = 'i';
|
||||
for (int i=1; i<argc; i++)
|
||||
{
|
||||
if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0)
|
||||
{
|
||||
mode = 'h';
|
||||
}
|
||||
else if (strcmp(argv[i], "-i") == 0 || strcmp(argv[i], "--interactive") == 0)
|
||||
{
|
||||
mode = 'i';
|
||||
}
|
||||
else if (strcmp(argv[i], "-s") == 0 || strcmp(argv[i], "--simple") == 0)
|
||||
{
|
||||
mode = 's';
|
||||
}
|
||||
else if (strcmp(argv[i], "-v") == 0 || strcmp(argv[i], "--version") == 0)
|
||||
{
|
||||
mode = 'v';
|
||||
}
|
||||
else if (strcmp(argv[i], "-w") == 0 || strcmp(argv[i], "--width") == 0)
|
||||
{
|
||||
if (i+1==argc)
|
||||
{
|
||||
fprintf(stderr, "Please do specify a width.\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
else
|
||||
{
|
||||
width = strtol(argv[i+1], NULL, 10); // base 10
|
||||
if (width<2)
|
||||
{
|
||||
fprintf(stderr, "Width is too low (<2).\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
srand(time(NULL));
|
||||
|
||||
switch (mode)
|
||||
{
|
||||
case 'i': interact(width); break;
|
||||
case 'h': help(argv[0]); break;
|
||||
case 's': simple_generation(width); break;
|
||||
case 'v': version(); break;
|
||||
}
|
||||
return 0;
|
||||
}
|
299
src/print.c
Normal file
299
src/print.c
Normal file
@ -0,0 +1,299 @@
|
||||
/* CATWALK - Test your logic
|
||||
Copyright (C) 2021 Valentin Moguerou
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULIAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/> */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <catwalk/grid.h>
|
||||
#include <catwalk/route.h>
|
||||
|
||||
#include "print.h"
|
||||
|
||||
//#define COLORED_PATH
|
||||
#ifdef COLORED_PATH
|
||||
# define KNRM "\e[0m"
|
||||
# define KRED "\e[31m"
|
||||
#endif
|
||||
|
||||
const char ASCII_START[GRID_CELL_H][GRID_CELL_W]
|
||||
= {
|
||||
{' ', ' ', '/', '\\', ' ', ' ', ' '},
|
||||
{' ', '/', '\\', ' ', '\\', '/', ' '},
|
||||
{' ', ' ', ' ', '\\', '/', ' ', ' '}
|
||||
};
|
||||
|
||||
const char ASCII_CAT[GRID_CELL_H][GRID_CELL_W]
|
||||
= {
|
||||
{' ', '/', '\\', '_', '/', '\\', ' '},
|
||||
{'(', ' ', 'o', '.', 'o', ' ', ')'},
|
||||
{' ', '>', ' ', '^', ' ', '<', ' '}
|
||||
};
|
||||
|
||||
const char ASCII_MILK[GRID_CELL_H][GRID_CELL_W]
|
||||
= {
|
||||
{' ', ' ', '=', '=', ' ', ' ', ' '},
|
||||
{' ', '/', 'm', 'i', '\\', ' ', ' '},
|
||||
{' ', '\\', 'l', 'k', '/', ' ', ' '}
|
||||
};
|
||||
|
||||
void print_interactive_grid(grid *gd)
|
||||
{
|
||||
element *pos = gd->player_route->last; // define pointer to last element of player route
|
||||
element *el;
|
||||
for (int y=0; y<(gd->width+1)*(GRID_CELL_H+1); y++) // for each line
|
||||
{
|
||||
for (int x=0; x<(gd->width+1)*(GRID_CELL_W+1); x++) // for each column
|
||||
{
|
||||
if (x<GRID_CELL_W || y<GRID_CELL_H) // if header (indicators)
|
||||
{
|
||||
if (x == GRID_CELL_W/2 && y == GRID_CELL_H/2) // top left blank space
|
||||
{
|
||||
putchar(CELL_FILL_CHAR);
|
||||
}
|
||||
else if (x%(GRID_CELL_W+1) == GRID_CELL_W/2 && y == GRID_CELL_H/2) // top indicators
|
||||
{
|
||||
printf("%d", gd->hints->x[x/(GRID_CELL_W+1)-1]);
|
||||
}
|
||||
else if (x == GRID_CELL_W/2 && y%(GRID_CELL_H+1) == GRID_CELL_H/2) // left indicators
|
||||
{
|
||||
printf("%d", gd->hints->y[y/(GRID_CELL_H+1)-1]);
|
||||
}
|
||||
else
|
||||
{
|
||||
putchar(CELL_FILL_CHAR); // blank space around numbers
|
||||
}
|
||||
}
|
||||
else // else if body (cells)
|
||||
{
|
||||
if ((x+1)%(GRID_CELL_W+1) == 0 && (y+1)%(GRID_CELL_H+1) == 0)
|
||||
{
|
||||
putchar(CELL_NODE_CHAR); // cell border intersections
|
||||
}
|
||||
else if ((y+1)%(GRID_CELL_H+1) == 0)
|
||||
{
|
||||
putchar(HO_BORDER_CHAR); // cell horizontal borders
|
||||
}
|
||||
else if ((x+1)%(GRID_CELL_W+1) == 0)
|
||||
{
|
||||
putchar(VE_BORDER_CHAR); // cell vertical borders
|
||||
}
|
||||
else // if inside cells
|
||||
{
|
||||
if (x/(GRID_CELL_W+1)-1 == pos->x && y/(GRID_CELL_H+1)-1 == pos->y) // if cursor position corresponds to the player position
|
||||
{
|
||||
putchar(ASCII_CAT[y%(GRID_CELL_H+1)][x%(GRID_CELL_W+1)]);
|
||||
}
|
||||
else if (x/(GRID_CELL_W+1)-1 == gd->start[0] && y/(GRID_CELL_H+1)-1 == gd->start[1]) // if the player has moved, if cursor position corresponds to the cat position
|
||||
{
|
||||
putchar(ASCII_START[y%(GRID_CELL_H+1)][x%(GRID_CELL_W+1)]);
|
||||
}
|
||||
else if (x/(GRID_CELL_W+1)-1 == gd->end[0] && y/(GRID_CELL_H+1)-1 == gd->end[1]) // if corresponds to the milk position
|
||||
{
|
||||
putchar(ASCII_MILK[y%(GRID_CELL_H+1)][x%(GRID_CELL_W+1)]);
|
||||
}
|
||||
else if (!is_free(gd->player_route, x/(GRID_CELL_W+1)-1, y/(GRID_CELL_H+1)-1))
|
||||
{
|
||||
if (!el)
|
||||
{
|
||||
el = find_coordinates(gd->player_route, x/(GRID_CELL_W+1)-1, y/(GRID_CELL_H+1)-1);
|
||||
}
|
||||
else if (el->x!=x/(GRID_CELL_W+1)-1 || el->y!=y/(GRID_CELL_H+1)-1)
|
||||
{
|
||||
el = find_coordinates(gd->player_route, x/(GRID_CELL_W+1)-1, y/(GRID_CELL_H+1)-1);
|
||||
}
|
||||
if (x%(GRID_CELL_W+1) == GRID_CELL_W/2 && y%(GRID_CELL_H+1) == GRID_CELL_H/2)
|
||||
{
|
||||
#ifdef COLORED_PATH
|
||||
printf("%s%c%s", KRED, CELL_NODE_CHAR, KNRM);
|
||||
#else
|
||||
putchar(CELL_NODE_CHAR);
|
||||
#endif
|
||||
}
|
||||
else if (x%(GRID_CELL_W+1) == GRID_CELL_W/2 || y%(GRID_CELL_H+1) == GRID_CELL_H/2)
|
||||
{
|
||||
if (x%(GRID_CELL_W+1) < GRID_CELL_W/2 && is_left(el, el->previous))
|
||||
{
|
||||
#ifdef COLORED_PATH
|
||||
printf("%s%c%s", KRED, HO_BORDER_CHAR, KNRM);
|
||||
#else
|
||||
putchar(HO_BORDER_CHAR);
|
||||
#endif
|
||||
}
|
||||
else if (x%(GRID_CELL_W+1) > GRID_CELL_W/2 && is_right(el, el->previous))
|
||||
{
|
||||
#ifdef COLORED_PATH
|
||||
printf("%s%c%s", KRED, HO_BORDER_CHAR, KNRM);
|
||||
#else
|
||||
putchar(HO_BORDER_CHAR);
|
||||
#endif
|
||||
}
|
||||
else if (y%(GRID_CELL_H+1) < GRID_CELL_H/2 && is_up(el, el->previous))
|
||||
{
|
||||
#ifdef COLORED_PATH
|
||||
printf("%s%c%s", KRED, VE_BORDER_CHAR, KNRM);
|
||||
#else
|
||||
putchar(VE_BORDER_CHAR);
|
||||
#endif
|
||||
}
|
||||
else if (y%(GRID_CELL_H+1) > GRID_CELL_H/2 && is_down(el, el->previous))
|
||||
{
|
||||
#ifdef COLORED_PATH
|
||||
printf("%s%c%s", KRED, VE_BORDER_CHAR, KNRM);
|
||||
#else
|
||||
putchar(VE_BORDER_CHAR);
|
||||
#endif
|
||||
}
|
||||
else if (x%(GRID_CELL_W+1) < GRID_CELL_W/2 && is_left(el, el->next))
|
||||
{
|
||||
#ifdef COLORED_PATH
|
||||
printf("%s%c%s", KRED, HO_BORDER_CHAR, KNRM);
|
||||
#else
|
||||
putchar(HO_BORDER_CHAR);
|
||||
#endif
|
||||
}
|
||||
else if (x%(GRID_CELL_W+1) > GRID_CELL_W/2 && is_right(el, el->next))
|
||||
{
|
||||
#ifdef COLORED_PATH
|
||||
printf("%s%c%s", KRED, HO_BORDER_CHAR, KNRM);
|
||||
#else
|
||||
putchar(HO_BORDER_CHAR);
|
||||
#endif
|
||||
}
|
||||
else if (y%(GRID_CELL_H+1) < GRID_CELL_H/2 && is_up(el, el->next))
|
||||
{
|
||||
#ifdef COLORED_PATH
|
||||
printf("%s%c%s", KRED, VE_BORDER_CHAR, KNRM);
|
||||
#else
|
||||
putchar(VE_BORDER_CHAR);
|
||||
#endif
|
||||
}
|
||||
else if (y%(GRID_CELL_H+1) > GRID_CELL_H/2 && is_down(el, el->next))
|
||||
{
|
||||
#ifdef COLORED_PATH
|
||||
printf("%s%c%s", KRED, VE_BORDER_CHAR, KNRM);
|
||||
#else
|
||||
putchar(VE_BORDER_CHAR);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
putchar(CELL_FILL_CHAR);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
putchar(CELL_FILL_CHAR);
|
||||
}
|
||||
}
|
||||
else // if cursor position corresponds to nothing
|
||||
{
|
||||
putchar(CELL_FILL_CHAR);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
putchar('\n'); // newline
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void print_simple_grid(grid *gd)
|
||||
{
|
||||
for (int y=0; y<(gd->width+1)*(GRID_CELL_H+1); y++) // for each line
|
||||
{
|
||||
for (int x=0; x<(gd->width+1)*(GRID_CELL_W+1); x++) // for each column
|
||||
{
|
||||
if (x<GRID_CELL_W || y<GRID_CELL_H) // if header (indicators)
|
||||
{
|
||||
if (x == GRID_CELL_W/2 && y == GRID_CELL_H/2) // top left blank space
|
||||
{
|
||||
putchar(CELL_FILL_CHAR);
|
||||
}
|
||||
else if (x%(GRID_CELL_W+1) == GRID_CELL_W/2 && y == GRID_CELL_H/2) // top indicators
|
||||
{
|
||||
printf("%d", gd->hints->x[x/(GRID_CELL_W+1)-1]);
|
||||
}
|
||||
else if (x == GRID_CELL_W/2 && y%(GRID_CELL_H+1) == GRID_CELL_H/2) // left indicators
|
||||
{
|
||||
printf("%d", gd->hints->y[y/(GRID_CELL_H+1)-1]);
|
||||
}
|
||||
else
|
||||
{
|
||||
putchar(CELL_FILL_CHAR); // blank space around numbers
|
||||
}
|
||||
}
|
||||
else // else if body (cells)
|
||||
{
|
||||
if ((x+1)%(GRID_CELL_W+1) == 0 && (y+1)%(GRID_CELL_H+1) == 0)
|
||||
{
|
||||
putchar(CELL_NODE_CHAR); // cell border intersections
|
||||
}
|
||||
else if ((y+1)%(GRID_CELL_H+1) == 0)
|
||||
{
|
||||
putchar(HO_BORDER_CHAR); // cell horizontal borders
|
||||
}
|
||||
else if ((x+1)%(GRID_CELL_W+1) == 0)
|
||||
{
|
||||
putchar(VE_BORDER_CHAR); // cell vertical borders
|
||||
}
|
||||
else // if inside cells
|
||||
{
|
||||
if (x/(GRID_CELL_W+1)-1 == gd->start[0] && y/(GRID_CELL_H+1)-1 == gd->start[1])
|
||||
{
|
||||
putchar(ASCII_CAT[y%(GRID_CELL_H+1)][x%(GRID_CELL_W+1)]);
|
||||
}
|
||||
else if (x/(GRID_CELL_W+1)-1 == gd->end[0] && y/(GRID_CELL_H+1)-1 == gd->end[1])
|
||||
{
|
||||
putchar(ASCII_MILK[y%(GRID_CELL_H+1)][x%(GRID_CELL_W+1)]);
|
||||
}
|
||||
else
|
||||
{
|
||||
putchar(CELL_FILL_CHAR);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
putchar('\n'); // newline
|
||||
}
|
||||
}
|
||||
|
||||
void print_indicators(grid *gd)
|
||||
{
|
||||
printf("Indicators :\nX: ");
|
||||
int i;
|
||||
for (i=0; i<gd->width; i++)
|
||||
{
|
||||
printf("%d ", gd->hints->x[i]);
|
||||
}
|
||||
printf("\nY: ");
|
||||
for (i=0; i<gd->width; i++)
|
||||
{
|
||||
printf("%d ", gd->hints->y[i]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
void print_route(route *rt)
|
||||
{
|
||||
element *el = rt->first;
|
||||
printf("[(%d, %d)", el->x, el->y);
|
||||
el = el->next;
|
||||
while (el)
|
||||
{
|
||||
printf(", (%d, %d)", el->x, el->y);
|
||||
el = el->next;
|
||||
}
|
||||
printf("]\n");
|
||||
}
|
36
src/print.h
Normal file
36
src/print.h
Normal file
@ -0,0 +1,36 @@
|
||||
/* CATWALK - Test your logic
|
||||
Copyright (C) 2021 Valentin Moguerou
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULIAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/> */
|
||||
|
||||
#ifndef PRINT_H_INCLUDED
|
||||
#define PRINT_H_INCLUDED
|
||||
|
||||
#include <catwalk/grid.h>
|
||||
#include <catwalk/route.h>
|
||||
|
||||
void print_interactive_grid(grid *gd);
|
||||
void print_simple_grid(grid *gd);
|
||||
void print_indicators(grid *gd);
|
||||
void print_route(route *rt);
|
||||
|
||||
#define GRID_CELL_H 3
|
||||
#define GRID_CELL_W 7
|
||||
|
||||
#define CELL_FILL_CHAR ' '
|
||||
#define CELL_NODE_CHAR '+'
|
||||
#define HO_BORDER_CHAR '-'
|
||||
#define VE_BORDER_CHAR '|'
|
||||
|
||||
#endif /* PRINT_H_INCLUDED */
|
31
src/simplegen.c
Normal file
31
src/simplegen.c
Normal file
@ -0,0 +1,31 @@
|
||||
/* CATWALK - Test your logic
|
||||
Copyright (C) 2021 Valentin Moguerou
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULIAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/> */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <catwalk/grid.h>
|
||||
|
||||
#include "print.h"
|
||||
|
||||
void simple_generation(int width)
|
||||
{
|
||||
grid *gd = init_grid(width);
|
||||
refresh_grid(gd);
|
||||
|
||||
print_simple_grid(gd);
|
||||
|
||||
delete_grid(gd);
|
||||
}
|
22
src/simplegen.h
Normal file
22
src/simplegen.h
Normal file
@ -0,0 +1,22 @@
|
||||
/* CATWALK - Test your logic
|
||||
Copyright (C) 2021 Valentin Moguerou
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULIAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/> */
|
||||
|
||||
#ifndef SIMPLEGEN_H_INCLUDED
|
||||
#define SIMPLEGEN_H_INCLUDED
|
||||
|
||||
void simple_generation(int width);
|
||||
|
||||
#endif /* SIMPLEGEN_H_INCLUDED */
|
Loading…
Reference in New Issue
Block a user