This commit is contained in:
Bruno Rybársky 2022-05-29 10:22:29 +02:00
parent daf638d060
commit c5af2046e2

211
main.c

@ -1,10 +1,17 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
#include <time.h> #include <stdlib.h>
#include <time.h>
#include <stdint.h> #include <stdint.h>
#include <ncurses.h> #include <ncurses.h>
#include <unistd.h> #include <unistd.h>
#include <math.h> #include <math.h>
uint16_t Hole_Div = 40; uint16_t Hole_Div = 40;
uint16_t SCR_X; uint16_t SCR_X;
uint16_t SCR_Y; uint16_t SCR_Y;
@ -44,116 +51,113 @@ uint16_t goal_y = 0;
uint16_t rng_tmp = 0; uint16_t rng_tmp = 0;
uint16_t orient = 0; uint16_t orient = 0;
uint16_t inputs_tmp = 0; uint16_t inputs_tmp = 0;
struct Object *rendered; struct Object * rendered;
struct Bullet *bullets; struct Bullet * bullets;
char *playfield; char * playfield;
int randomInt(int lower, int upper) { int randomInt(int lower, int upper) {
return rand() % (upper - lower + 1) + lower; return rand() % (upper - lower + 1) + lower;
} }
void generate_maze(){ void generate_maze() {
//fill playfield with blank //fill playfield with blank
for (uint16_t y = 0; y < SCR_Y; y++) { for (uint16_t y = 0; y < SCR_Y; y++) {
for (uint16_t x = 0; x < SCR_X; x++) { for (uint16_t x = 0; x < SCR_X; x++) {
playfield[y*SCR_X + x] = blank_char; playfield[y * SCR_X + x] = blank_char;
} }
} }
//fill every other row with walls //fill every other row with walls
for (uint16_t y = 0; y < SCR_Y; y += 2) { for (uint16_t y = 0; y < SCR_Y; y += 2) {
for (uint16_t x = 0; x < SCR_X; x++) { for (uint16_t x = 0; x < SCR_X; x++) {
playfield[y*SCR_X + x] = wall_char; playfield[y * SCR_X + x] = wall_char;
} }
} }
//punch holes in the walls //punch holes in the walls
for (uint16_t y = 0; y < SCR_Y; y++) { for (uint16_t y = 0; y < SCR_Y; y++) {
//punch holes in the walls depending on the SCR_X //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) { for (uint16_t ix = 0; ix < ((SCR_X - (SCR_X % Hole_Div)) / Hole_Div); ix += 1) {
rng_tmp = randomInt(1, SCR_X); rng_tmp = randomInt(1, SCR_X);
playfield[y*SCR_X + rng_tmp] = blank_char; playfield[y * SCR_X + rng_tmp] = blank_char;
} }
if (orient == 0) { if (orient == 0) {
if(y == 0){ if (y == 0) {
playfield[y*SCR_X + rng_tmp] = goal_char; playfield[y * SCR_X + rng_tmp] = goal_char;
goal_x = rng_tmp; goal_x = rng_tmp;
goal_y = y; goal_y = y;
} }
if (y == SCR_Y -1){ if (y == SCR_Y - 1) {
playfield[y*SCR_X + rng_tmp] = player_char; playfield[y * SCR_X + rng_tmp] = player_char;
player_x = rng_tmp; player_x = rng_tmp;
player_y = y; player_y = y;
} }
} else { } else {
if(y == SCR_Y -1){ if (y == SCR_Y - 1) {
playfield[y*SCR_X + rng_tmp] = goal_char; playfield[y * SCR_X + rng_tmp] = goal_char;
goal_x = rng_tmp; goal_x = rng_tmp;
goal_y = y; goal_y = y;
} }
if (y == 0){ if (y == 0) {
playfield[y*SCR_X + rng_tmp] = player_char; playfield[y * SCR_X + rng_tmp] = player_char;
player_x = rng_tmp; player_x = rng_tmp;
player_y = y; player_y = y;
} }
} }
} }
} }
void render_maze(){ void render_maze() {
//fill rendered with blank //fill rendered with blank
for (uint16_t y = 0; y < SCR_Y; y++) { for (uint16_t y = 0; y < SCR_Y; y++) {
for (uint16_t x = 0; x < SCR_X; x++) { for (uint16_t x = 0; x < SCR_X; x++) {
rendered[y*SCR_X + x].letter = blank_char; rendered[y * SCR_X + x].letter = blank_char;
rendered[y*SCR_X + x].color = blank_color; rendered[y * SCR_X + x].color = blank_color;
rendered[y*SCR_X + x].x = x; rendered[y * SCR_X + x].x = x;
rendered[y*SCR_X + x].y = y; rendered[y * SCR_X + x].y = y;
} }
} }
for (uint16_t y = 0; y < SCR_Y; y++) { for (uint16_t y = 0; y < SCR_Y; y++) {
for (uint16_t x = 0; x < SCR_X; x++) { for (uint16_t x = 0; x < SCR_X; x++) {
letter = playfield[(y)*SCR_X + (x)]; letter = playfield[(y) * SCR_X + (x)];
rendered[(y)*SCR_X + (x)].letter = letter; rendered[(y) * SCR_X + (x)].letter = letter;
rendered[(y)*SCR_X + (x)].x = x; rendered[(y) * SCR_X + (x)].x = x;
rendered[(y)*SCR_X + (x)].y = y; rendered[(y) * SCR_X + (x)].y = y;
if (letter == goal_char){ if (letter == goal_char) {
rendered[(y)*SCR_X + (x)].color = goal_color; rendered[(y) * SCR_X + (x)].color = goal_color;
} } else if (letter == player_char) {
else if (letter == player_char){
rendered[(y) * SCR_X + (x)].color = player_color;
rendered[(y)*SCR_X + (x)].color = player_color; } else if (letter == blank_char) {
}
else if (letter == blank_char){ rendered[(y) * SCR_X + (x)].color = blank_color;
} else if (letter == wall_char) {
rendered[(y)*SCR_X + (x)].color = blank_color;
} rendered[(y) * SCR_X + (x)].color = wall_color;
else if (letter == wall_char){
rendered[(y)*SCR_X + (x)].color = wall_color;
} }
} }
} }
} }
void draw_maze(){ void draw_maze() {
for (uint16_t y = 0; y < SCR_Y; y++) { for (uint16_t y = 0; y < SCR_Y; y++) {
for (uint16_t x = 0; x < SCR_X; x++) { for (uint16_t x = 0; x < SCR_X; x++) {
attron(COLOR_PAIR(rendered[(y)*SCR_X + (x)].color)); attron(COLOR_PAIR(rendered[(y) * SCR_X + (x)].color));
mvaddch(y, x, rendered[(y)*SCR_X + (x)].letter); mvaddch(y, x, rendered[(y) * SCR_X + (x)].letter);
attroff(COLOR_PAIR(rendered[(y)*SCR_X + (x)].color)); attroff(COLOR_PAIR(rendered[(y) * SCR_X + (x)].color));
} }
} }
refresh(); refresh();
} }
void init(){ void init() {
initscr(); initscr();
//get screen size //get screen size
getmaxyx(stdscr, SCR_Y, SCR_X); getmaxyx(stdscr, SCR_Y, SCR_X);
@ -174,74 +178,74 @@ void init(){
clear(); clear();
srand(time(NULL)); srand(time(NULL));
} }
int keyinput(){ int keyinput() {
inchar = getch(); inchar = getch();
if (inchar == 'q'){ if (inchar == 'q') {
return 1; return 1;
} }
if (inchar == 'w'){ if (inchar == 'w') {
//if (playfield[player_y - 1][player_x] == blank_char){ //if (playfield[player_y - 1][player_x] == blank_char){
if (player_y > 0&&playfield[(player_y-1)*SCR_X + player_x] == blank_char){ if (player_y > 0 && playfield[(player_y - 1) * SCR_X + player_x] == blank_char) {
playfield[(player_y)*SCR_X + player_x] = blank_char; playfield[(player_y) * SCR_X + player_x] = blank_char;
player_y--; player_y--;
playfield[(player_y)*SCR_X + 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][player_x] == goal_char){
}else if (playfield[(player_y-1)*SCR_X + player_x] == goal_char){ } else if (playfield[(player_y - 1) * SCR_X + player_x] == goal_char) {
return 2; return 2;
} }
} }
if (inchar == 'a'){ if (inchar == 'a') {
//if (playfield[player_y][player_x - 1] == blank_char){ //if (playfield[player_y][player_x - 1] == blank_char){
if (player_x > 0 &&playfield[(player_y)*SCR_X + (player_x-1)] == blank_char){ if (player_x > 0 && playfield[(player_y) * SCR_X + (player_x - 1)] == blank_char) {
playfield[(player_y)*SCR_X + player_x] = blank_char; playfield[(player_y) * SCR_X + player_x] = blank_char;
player_x--; player_x--;
playfield[(player_y)*SCR_X + 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][player_x - 1] == goal_char){
else if (playfield[(player_y)*SCR_X + (player_x-1)] == goal_char){ else if (playfield[(player_y) * SCR_X + (player_x - 1)] == goal_char) {
return 2; return 2;
} }
} }
if (inchar == 's'){ if (inchar == 's') {
//if (playfield[player_y + 1][player_x] == blank_char){ //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){ if (player_x < SCR_X - 1 && playfield[(player_y + 1) * SCR_X + player_x] == blank_char) {
playfield[(player_y)*SCR_X + player_x] = blank_char; playfield[(player_y) * SCR_X + player_x] = blank_char;
player_y++; player_y++;
playfield[(player_y)*SCR_X + 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][player_x] == goal_char){
}else if (playfield[(player_y+1)*SCR_X + player_x] == goal_char){ } else if (playfield[(player_y + 1) * SCR_X + player_x] == goal_char) {
return 2; return 2;
} }
} }
if (inchar == 'd'){ if (inchar == 'd') {
// if (playfield[player_y][player_x + 1] == blank_char){ // 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){ if (player_x < SCR_X - 1 && playfield[(player_y) * SCR_X + (player_x + 1)] == blank_char) {
playfield[(player_y)*SCR_X + player_x] = blank_char; playfield[(player_y) * SCR_X + player_x] = blank_char;
player_x++; player_x++;
playfield[(player_y)*SCR_X + 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][player_x + 1] == goal_char){
else if (playfield[(player_y)*SCR_X + (player_x+1)] == goal_char){ else if (playfield[(player_y) * SCR_X + (player_x + 1)] == goal_char) {
return 2; return 2;
} }
} }
} }
int main(int argc, char *argv[]){ int main(int argc, char * argv[]) {
init(); init();
//parse the command line arguments for width and height //parse the command line arguments for width and height
if (argc == 3){ if (argc == 3) {
SCR_X = atoi(argv[1]); SCR_X = atoi(argv[1]);
SCR_Y = atoi(argv[2]); SCR_Y = atoi(argv[2]);
} }
if (argc == 2){ if (argc == 2) {
Hole_Div = atoi(argv[1]); Hole_Div = atoi(argv[1]);
} }
if (argc == 4){ if (argc == 4) {
SCR_X = atoi(argv[1]); SCR_X = atoi(argv[1]);
SCR_Y = atoi(argv[2]); SCR_Y = atoi(argv[2]);
Hole_Div = atoi(argv[3]); Hole_Div = atoi(argv[3]);
@ -249,14 +253,13 @@ int main(int argc, char *argv[]){
generate_maze(); generate_maze();
render_maze(); render_maze();
draw_maze(); draw_maze();
while (1) while (1) {
{
inputs_tmp = keyinput(); inputs_tmp = keyinput();
if (inputs_tmp == 1){ if (inputs_tmp == 1) {
break; break;
} }
if (inputs_tmp == 2){ if (inputs_tmp == 2) {
if (orient == 0){ if (orient == 0) {
orient = 1; orient = 1;
} else { } else {
orient = 0; orient = 0;
@ -265,7 +268,7 @@ int main(int argc, char *argv[]){
} }
render_maze(); render_maze();
draw_maze(); draw_maze();
usleep(round(1000000/FPS)); usleep(round(1000000 / FPS));
} }
endwin(); endwin();
free(playfield); free(playfield);