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