diff --git a/.vscode/configurationCache.log b/.vscode/configurationCache.log new file mode 100644 index 0000000..bab9054 --- /dev/null +++ b/.vscode/configurationCache.log @@ -0,0 +1 @@ +{"buildTargets":[],"launchTargets":[],"customConfigurationProvider":{"workspaceBrowse":{"browsePath":[],"compilerArgs":[]},"fileIndex":[]}} \ No newline at end of file diff --git a/.vscode/dryrun.log b/.vscode/dryrun.log new file mode 100644 index 0000000..6b7f15d --- /dev/null +++ b/.vscode/dryrun.log @@ -0,0 +1,7 @@ +make --dry-run --always-make --keep-going --print-directory +make: Entering directory '/home/bruno/Documents/programming/projects/mazegame' + +make: *** No targets specified and no makefile found. Stop. + +make: Leaving directory '/home/bruno/Documents/programming/projects/mazegame' + diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..aad82ab --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,25 @@ +{ + "configurations": [ + { + "name": "Run", + "type": "cppdbg", + "request": "launch", + "program": "${fileDirname}/${fileBasenameNoExtension}", + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "preLaunchTask": "Builder", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ], + "miDebuggerPath": "/usr/bin/gdb" + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..3c4888e --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "files.associations": { + "unistd.h": "c", + "main.h": "c" + } +} \ No newline at end of file diff --git a/.vscode/targets.log b/.vscode/targets.log new file mode 100644 index 0000000..555c4ad --- /dev/null +++ b/.vscode/targets.log @@ -0,0 +1,368 @@ +make all --print-data-base --no-builtin-variables --no-builtin-rules --question +make: *** No rule to make target 'all'. Stop. + +# GNU Make 4.3 + +# Built for x86_64-pc-linux-gnu + +# Copyright (C) 1988-2020 Free Software Foundation, Inc. + +# License GPLv3+: GNU GPL version 3 or later + +# This is free software: you are free to change and redistribute it. + +# There is NO WARRANTY, to the extent permitted by law. + + + +# Make data base, printed on Sun May 29 07:50:20 2022 + + +# Variables + + + +# environment + +GDK_BACKEND = x11 + +# environment + +LC_ALL = C + +# environment + +GTK_RC_FILES = /etc/gtk/gtkrc:/home/bruno/.gtkrc:/home/bruno/.config/gtkrc + +# environment + +VSCODE_IPC_HOOK_EXTHOST = /run/user/1000/vscode-ipc-2b05d98b-4ba5-4baf-bada-1bada4dc3354.sock + +# environment + +MANDATORY_PATH = /usr/share/gconf/plasma.mandatory.path + +# environment + +LC_NAME = sk_SK.UTF-8 + +# environment + +LC_NUMERIC = sk_SK.UTF-8 + +# environment + +VSCODE_CWD = /home/bruno + +# environment + +LESS_TERMCAP_me =  + +# environment +LC_ADDRESS = sk_SK.UTF-8 +# default +MAKE_COMMAND := make +# environment +FPATH = /home/bruno/.oh-my-zsh/plugins/golang:/home/bruno/.oh-my-zsh/custom/plugins/aliases:/home/bruno/.oh-my-zsh/plugins/safe-paste:/home/bruno/.oh-my-zsh/plugins/screen:/home/bruno/.oh-my-zsh/plugins/ssh-agent:/home/bruno/.oh-my-zsh/plugins/python:/home/bruno/.oh-my-zsh/plugins/nmap:/home/bruno/.oh-my-zsh/plugins/gnu-utils:/home/bruno/.oh-my-zsh/plugins/git-prompt:/home/bruno/.oh-my-zsh/plugins/github:/home/bruno/.oh-my-zsh/plugins/git-lfs:/home/bruno/.oh-my-zsh/plugins/git-auto-fetch:/home/bruno/.oh-my-zsh/plugins/command-not-found:/home/bruno/.oh-my-zsh/plugins/docker-compose:/home/bruno/.oh-my-zsh/plugins/docker:/home/bruno/.oh-my-zsh/plugins/git:/home/bruno/.oh-my-zsh/functions:/home/bruno/.oh-my-zsh/completions:/home/bruno/.oh-my-zsh/cache/completions:/usr/local/share/zsh/functions:/usr/local/share/zsh/site-functions:/usr/share/zsh/vendor-functions:/usr/share/zsh/vendor-completions:/usr/share/zsh/functions/Calendar:/usr/share/zsh/functions/Chpwd:/usr/share/zsh/functions/Completion:/usr/share/zsh/functions/Completion/AIX:/usr/share/zsh/functions/Completion/BSD:/usr/share/zsh/functions/Completion/Base:/usr/share/zsh/functions/Completion/Cygwin:/usr/share/zsh/functions/Completion/Darwin:/usr/share/zsh/functions/Completion/Debian:/usr/share/zsh/functions/Completion/Linux:/usr/share/zsh/functions/Completion/Mandriva:/usr/share/zsh/functions/Completion/Redhat:/usr/share/zsh/functions/Completion/Solaris:/usr/share/zsh/functions/Completion/Unix:/usr/share/zsh/functions/Completion/X:/usr/share/zsh/functions/Completion/Zsh:/usr/share/zsh/functions/Completion/openSUSE:/usr/share/zsh/functions/Exceptions:/usr/share/zsh/functions/MIME:/usr/share/zsh/functions/Math:/usr/share/zsh/functions/Misc:/usr/share/zsh/functions/Newuser:/usr/share/zsh/functions/Prompts:/usr/share/zsh/functions/TCP:/usr/share/zsh/functions/VCS_Info:/usr/share/zsh/functions/VCS_Info/Backends:/usr/share/zsh/functions/Zftp:/usr/share/zsh/functions/Zle +# environment +QT_ACCESSIBILITY = 1 +# environment +GOPATH = /home/bruno/golang +# automatic +@D = $(patsubst %/,%,$(dir $@)) +# environment +VSCODE_HANDLES_UNCAUGHT_ERRORS = true +# default +.VARIABLES := +# environment +PWD = /home/bruno/Documents/programming/projects/mazegame +# automatic +%D = $(patsubst %/,%,$(dir $%)) +# environment +LSCOLORS = Gxfxcxdxbxegedabagacad +# environment +XDG_DATA_DIRS = /usr/share/plasma:/home/bruno/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share +# environment +OLDPWD = /home/bruno +# automatic +^D = $(patsubst %/,%,$(dir $^)) +# environment +VSCODE_LOG_STACK = true +# automatic +%F = $(notdir $%) +# environment +VSCODE_CODE_CACHE_PATH = /home/bruno/.config/Code - Insiders/CachedData/6428d0fc7dae5801cdaf2d160ac39a3dfc8f0c06 +# environment +XDG_SESSION_PATH = /org/freedesktop/DisplayManager/Session1 +# environment +LANG = C +# environment +XAUTHORITY = /home/bruno/.Xauthority +# default +.LOADED := +# environment +LESS_TERMCAP_md =  +# default +.INCLUDE_DIRS = /usr/local/include /usr/include /usr/include +# makefile +MAKEFLAGS = pqrR +# environment +LESS_TERMCAP_so =  +# makefile +CURDIR := /home/bruno/Documents/programming/projects/mazegame +# environment +VSCODE_PIPE_LOGGING = true +# environment +APPLICATION_INSIGHTS_NO_DIAGNOSTIC_CHANNEL = true +# automatic +*D = $(patsubst %/,%,$(dir $*)) +# environment +LESS_TERMCAP_ue =  +# environment +PAM_KWALLET5_LOGIN = /run/user/1000/kwallet5.socket +# environment +MFLAGS = -pqrR +# environment +SSH_AUTH_SOCK = /tmp/ssh-XXXXXXpjLt6J/agent.6830 +# default +.SHELLFLAGS := -c +# environment +XDG_CONFIG_DIRS = /home/bruno/.config/kdedefaults:/etc/xdg/xdg-plasma:/etc/xdg:/usr/share/kubuntu-default-settings/kf5-settings +# automatic ++D = $(patsubst %/,%,$(dir $+)) +# environment +XCURSOR_THEME = breeze_cursors +# environment +XDG_SESSION_DESKTOP = KDE +# makefile +MAKEFILE_LIST := +# automatic +@F = $(notdir $@) +# environment +ZSH = /home/bruno/.oh-my-zsh +# environment +VSCODE_VERBOSE_LOGGING = true +# environment +VSCODE_PID = 6725 +# environment +XDG_SESSION_TYPE = x11 +# automatic +?D = $(patsubst %/,%,$(dir $?)) +# environment +SESSION_MANAGER = local/bruno-ThinkPad-T460s:@/tmp/.ICE-unix/3297,unix/bruno-ThinkPad-T460s:/tmp/.ICE-unix/3297 +# environment +PROMPT_EOL_MARK = +# automatic +*F = $(notdir $*) +# environment +CHROME_DESKTOP = code-insiders-url-handler.desktop +# environment +DBUS_SESSION_BUS_ADDRESS = unix:path=/run/user/1000/bus +# automatic + +#include +#include +#include +#include +#include +#include +uint16_t Hole_Div = 40; +uint16_t SCR_X; +uint16_t SCR_Y; +#define FPS (60) +char blank_char = 32; +char wall_char = 35; +char goal_char = 71; +char player_char = 80; +char bullet_char = 120; +char inchar = ' '; +uint16_t blank_color = 0; +uint16_t wall_color = 1; +uint16_t goal_color = 2; +uint16_t player_color = 3; +uint16_t border_color = 4; +uint16_t bullet1_color = 5; +uint16_t bullet2_color = 5; +char letter = ' '; +struct Object { + uint16_t x; + uint16_t y; + char letter; + uint16_t color; + uint8_t dir; +}; +struct Bullet { + uint16_t x; + uint16_t y; + uint8_t dir; + uint8_t color; +}; +uint16_t bulletptr = 0; +uint16_t player_x = 0; +uint16_t player_y = 0; +uint16_t goal_x = 0; +uint16_t goal_y = 0; +uint16_t rng_tmp = 0; +uint16_t orient = 0; +uint16_t inputs_tmp = 0; + +struct Object *rendered; +struct Bullet *bullets; +char *playfield; + + +int randomInt(int lower, int upper) { + return rand() % (upper - lower + 1) + lower; +} + +void generate_maze(){ + //fill playfield with blank + for (uint16_t y = 0; y < SCR_Y; y++) { + for (uint16_t x = 0; x < SCR_X; x++) { + //playfield[y][x] = blank_char; + //do it in one dimension + playfield[y*SCR_X + x] = blank_char; + } + } + //fill every other row with walls + for (uint16_t y = 0; y < SCR_Y; y += 2) { + for (uint16_t x = 0; x < SCR_X; x++) { + //playfield[y][x] = wall_char; + //do it in one dimension + playfield[y*SCR_X + x] = wall_char; + } + } + //punch holes in the walls + for (uint16_t y = 0; y < SCR_Y; y++) { + //punch holes in the walls depending on the SCR_X + for (uint16_t ix = 0; ix < ((SCR_X-(SCR_X%Hole_Div))/Hole_Div); ix += 1) { + rng_tmp = randomInt(1, SCR_X); + //playfield[y][rng_tmp] = blank_char; + //do it in one dimension + playfield[y*SCR_X + rng_tmp] = blank_char; + } + if (orient == 0) { + if(y == 0){ + //playfield[y][rng_tmp] = goal_char; + //do it in one dimension + playfield[y*SCR_X + rng_tmp] = goal_char; + goal_x = rng_tmp; + goal_y = y; + } + if (y == SCR_Y -1){ + //playfield[y][rng_tmp] = player_char; + //do it in one dimension + playfield[y*SCR_X + rng_tmp] = player_char; + player_x = rng_tmp; + player_y = y; + } + } else { + if(y == SCR_Y -1){ + //playfield[y][rng_tmp] = goal_char; + //do it in one dimension + playfield[y*SCR_X + rng_tmp] = goal_char; + goal_x = rng_tmp; + goal_y = y; + } + if (y == 0){ + //playfield[y][rng_tmp] = player_char; + //do it in one dimension + playfield[y*SCR_X + rng_tmp] = player_char; + player_x = rng_tmp; + player_y = y; + } + } + } + +} + +void render_maze(){ + //fill rendered with blank + for (uint16_t y = 0; y < SCR_Y; y++) { + for (uint16_t x = 0; x < SCR_X; x++) { + //rendered[y][x] = blank_char; + //do it in one dimension + rendered[y*SCR_X + x].letter = blank_char; + rendered[y*SCR_X + x].color = blank_color; + rendered[y*SCR_X + x].x = x; + rendered[y*SCR_X + x].y = y; + } + } + for (uint16_t y = 0; y < SCR_Y; y++) { + for (uint16_t x = 0; x < SCR_X; x++) { + //letter = playfield[y - 1][x- 1]; + //do it in one dimension + letter = playfield[(y)*SCR_X + (x)]; + //rendered[x][y].letter = letter; + //do it in one dimension + rendered[(y)*SCR_X + (x)].letter = letter; + //rendered[x][y].x = x; + //do it in one dimension + rendered[(y)*SCR_X + (x)].x = x; + //rendered[x][y].y = y; + //do it in one dimension + rendered[(y)*SCR_X + (x)].y = y; + if (letter == goal_char){ + //rendered[x][y].color = goal_color; + //do it in one dimension + rendered[(y)*SCR_X + (x)].color = goal_color; + } + else if (letter == player_char){ + //rendered[x][y].color = player_color; + //do it in one dimension + rendered[(y)*SCR_X + (x)].color = player_color; + } + else if (letter == blank_char){ + //rendered[x][y].color = blank_color; + //do it in one dimension + rendered[(y)*SCR_X + (x)].color = blank_color; + } + else if (letter == wall_char){ + //rendered[x][y].color = wall_color; + //do it in one dimension + rendered[(y)*SCR_X + (x)].color = wall_color; + } + } + } +} + +void draw_maze(){ + //FILE *fp; + //fp = fopen("logx", "w"); + for (uint16_t y = 0; y < SCR_Y; y++) { + for (uint16_t x = 0; x < SCR_X; x++) { + //attron(COLOR_PAIR(rendered[x][y].color)); + //do it in one dimension + attron(COLOR_PAIR(rendered[(y)*SCR_X + (x)].color)); + //mvaddch(y, x, rendered[x][y].letter); + //do it in one dimension + mvaddch(y, x, rendered[(y)*SCR_X + (x)].letter); + //fprintf(fp, "%c, x:%d y:%d\n", rendered[(y)*SCR_X + (x)].letter, rendered[(y)*SCR_X + (x)].x, rendered[(y)*SCR_X + (x)].y); + //attroff(COLOR_PAIR(rendered[x][y].color)); + //do it in one dimension + attroff(COLOR_PAIR(rendered[(y)*SCR_X + (x)].color)); + } + } + //fclose(fp); + refresh(); +} + +void init(){ + initscr(); + //get screen size + getmaxyx(stdscr, SCR_Y, SCR_X); + playfield = malloc(sizeof(char) * SCR_Y * SCR_X); + rendered = malloc(sizeof(struct Object) * (SCR_X) * (SCR_Y)); + bullets = malloc(sizeof(struct Bullet) * (SCR_X) * (SCR_Y)); + noecho(); + nodelay(stdscr, TRUE); + start_color(); + init_pair(blank_color, COLOR_WHITE, COLOR_WHITE); + init_pair(wall_color, COLOR_BLACK, COLOR_RED); + init_pair(goal_color, COLOR_BLACK, COLOR_GREEN); + init_pair(player_color, COLOR_BLACK, COLOR_YELLOW); + init_pair(border_color, COLOR_WHITE, COLOR_BLUE); + init_pair(bullet1_color, COLOR_BLACK, COLOR_YELLOW); + init_pair(bullet2_color, COLOR_BLACK, COLOR_GREEN); + attron(COLOR_PAIR(blank_color)); + clear(); + srand(time(NULL)); +} + +int keyinput(){ + inchar = getch(); + if (inchar == 'q'){ + return 1; + } + if (inchar == 'w'){ + //if (playfield[player_y - 1][player_x] == blank_char){ + if (player_y > 0&&playfield[(player_y-1)*SCR_X + player_x] == blank_char){ + //playfield[player_y][player_x] = blank_char; + //do it in one dimension + playfield[(player_y)*SCR_X + player_x] = blank_char; + player_y--; + //playfield[player_y][player_x] = player_char; + //do it in one dimension + playfield[(player_y)*SCR_X + player_x] = player_char; + //}else if (playfield[player_y - 1][player_x] == goal_char){ + }else if (playfield[(player_y-1)*SCR_X + player_x] == goal_char){ + return 2; + } + } + if (inchar == 'a'){ + //if (playfield[player_y][player_x - 1] == blank_char){ + if (player_x > 0 &&playfield[(player_y)*SCR_X + (player_x-1)] == blank_char){ + //playfield[player_y][player_x] = blank_char; + //do it in one dimension + playfield[(player_y)*SCR_X + player_x] = blank_char; + player_x--; + //playfield[player_y][player_x] = player_char; + //do it in one dimension + playfield[(player_y)*SCR_X + player_x] = player_char; + } + //else if (playfield[player_y][player_x - 1] == goal_char){ + else if (playfield[(player_y)*SCR_X + (player_x-1)] == goal_char){ + return 2; + } + } + if (inchar == 's'){ + //if (playfield[player_y + 1][player_x] == blank_char){ + if (player_x < SCR_X - 1 &&playfield[(player_y+1)*SCR_X + player_x] == blank_char){ + // playfield[player_y][player_x] = blank_char; + playfield[(player_y)*SCR_X + player_x] = blank_char; + player_y++; + // playfield[player_y][player_x] = player_char; + playfield[(player_y)*SCR_X + player_x] = player_char; + // }else if (playfield[player_y + 1][player_x] == goal_char){ + }else if (playfield[(player_y+1)*SCR_X + player_x] == goal_char){ + return 2; + } + + } + if (inchar == 'd'){ + // if (playfield[player_y][player_x + 1] == blank_char){ + if (player_x < SCR_X - 1 &&playfield[(player_y)*SCR_X + (player_x+1)] == blank_char){ + //playfield[player_y][player_x] = blank_char; + playfield[(player_y)*SCR_X + player_x] = blank_char; + player_x++; + //playfield[player_y][player_x] = player_char; + playfield[(player_y)*SCR_X + player_x] = player_char; + } + //else if (playfield[player_y][player_x + 1] == goal_char){ + else if (playfield[(player_y)*SCR_X + (player_x+1)] == goal_char){ + return 2; + } + } +} + +int main(int argc, char *argv[]){ + init(); + //parse the command line arguments for width and height + if (argc == 3){ + SCR_X = atoi(argv[1]); + SCR_Y = atoi(argv[2]); + } + if (argc == 2){ + Hole_Div = atoi(argv[1]); + } + if (argc == 4){ + SCR_X = atoi(argv[1]); + SCR_Y = atoi(argv[2]); + Hole_Div = atoi(argv[3]); + } + generate_maze(); + render_maze(); + draw_maze(); + while (1) + { + inputs_tmp = keyinput(); + if (inputs_tmp == 1){ + break; + } + if (inputs_tmp == 2){ + if (orient == 0){ + orient = 1; + } else { + orient = 0; + } + generate_maze(); + } + render_maze(); + draw_maze(); + usleep(round(1000000/FPS)); + } + endwin(); + free(playfield); + free(rendered); + return 0; +} \ No newline at end of file diff --git a/main.c.old b/main.c.old new file mode 100644 index 0000000..e3cc43a --- /dev/null +++ b/main.c.old @@ -0,0 +1,211 @@ +#include +#include +#include +#include +#include + +#define SCR_X 80 +#define SCR_Y 80 + +char inchar = ' '; +char readchar(uint8_t x, uint8_t y); +void applybuffer(); +void cls(); +void setchar(uint8_t x, uint8_t y, char letter); +int rng(int lower, int upper); +void generate_maze(); +int up(); +void down(); +void left(); +void right(); +void keyinput(); +void init(); + +char scrbuf[SCR_X + 1]; + +struct Object { + uint8_t x; + uint8_t y; + char letter; +}; + +struct Game { + uint16_t level; + char blank; + char wall; + uint8_t cols; + uint8_t rows; + char screen[SCR_X + 1][SCR_Y]; +}; + +struct Game game = {.level = 0, .blank = ' ', .wall = '|'}; +struct Object player = {.x = 0, .y = 0, .letter = 'P'}; +struct Object goal = {.x = 0, .y = 0, .letter = 'P'}; + +/* void applybuffer(){ + for (uint8_t y = 0;y