Untitled
unknown
c_cpp
a year ago
8.9 kB
6
Indexable
#include <stdio.h> #include <stdlib.h> #include <time.h> /* STRUCTURES CREATION */ // Position struct creation typedef struct { int x; int y; } Position; // Player struct creation typedef struct { int id; // Each player id int score; // Count the player score } Player; // Robot struct creation typedef struct { int id; // Each robot id 1-4 Position position; // Coordinate of the robot } Robot; // Box struct creation typedef struct { int wall; // Occupied by wall = 1 ; 0 Not occupied by wall Robot robot; // Robot who occupies the box ; 0 if no robots int target; // Occupied by a Target !=0 ; No target = 0 char vertical; // N (North) or S (South) ; X if no border in box char horizontal; // W (West) or E (East) ; X if no border in box Position position; // Coordinate of the box } Box; // Player creator Player constructPlayer(int id) { Player player; player.id = id; player.score = 0; return player; } // Robot creator Robot constructRobot(int id) { Robot robot; robot.id = 0; robot.position.x = -1; robot.position.y = -1; return robot; } // Box creator Box constructBox(int type, int x, int y) { // Type 0 : Free box // Type 1 : Borders of the grid Box box; box.position.x = x; box.position.y = y; box.vertical = 'X'; box.horizontal = 'X'; if (type == 0) { box.wall = 0; box.robot = constructRobot(0); box.target = 0; } if (type == 1) { box.wall = 1; box.robot = constructRobot(0); box.target = 0; } return box; } // Grid creator Box **createGrid(int size) { Box **grid = malloc(size * sizeof(Box *)); if (grid == NULL) { printf("Error: grid malloc failed #1\n"); exit(1); } for (int i = 0; i < size; i++) { grid[i] = malloc(size * sizeof(Box)); if (grid[i] == NULL) { for (int k = 0; k < size; k++) { // Loop to free each array line if an error occurs free(grid[k]); } printf("Error: grid malloc failed #2\n"); free(grid); exit(1); } } return grid; } // Grid filler void fillGrid(Box **grid, int size) { for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { if (i == 0 || j == 0 || i == size - 1 || j == size - 1) { grid[i][j] = constructBox(1, i, j); } else { grid[i][j] = constructBox(0, i, j); } } } } // Player board creator Player *createPlayerBoard(int nbPlayers, int size) { Player *playerBoard = malloc(nbPlayers * sizeof(Player)); if (playerBoard == NULL) { printf("Error: grid malloc failed #3\n"); exit(1); } for (int i = 0; i < nbPlayers; i++) { playerBoard[i] = constructPlayer(i + 1); // Player id starts at 1 } return playerBoard; } // Add all targets on the grid void addTargets(Box **grid, int size, int nbTargets) { int n = 1; while (nbTargets + 1 > n) { int x = rand() % (size - 4) + 2; // Generate the x coordinate int y = rand() % (size - 4) + 2; // Generate the y coordinate if (grid[x][y].target == 0 && grid[x - 1][y].target == 0 && grid[x + 1][y].target == 0 && grid[x][y - 1].target == 0 && grid[x][y + 1].target == 0 && grid[x - 1][y - 1].target == 0 && grid[x - 1][y + 1].target == 0 && grid[x + 1][y - 1].target == 0 && grid[x + 1][y + 1].target == 0) { grid[x][y].target = n; // Put the number of the target on the grid int direction = rand() % 4 + 1; // Random number between 1 and 4 switch (direction) { case 1: grid[x][y].vertical = 'N'; grid[x][y].horizontal = 'E'; break; case 2: grid[x][y].vertical = 'S'; grid[x][y].horizontal = 'E'; break; case 3: grid[x][y].vertical = 'S'; grid[x][y].horizontal = 'W'; break; case 4: grid[x][y].vertical = 'N'; grid[x][y].horizontal = 'W'; break; } n++; } } } void addRobots(Box **grid, int size) { // generate the 4 robots on the grid and give them their ID between 1 and 4 // (include) int n = 1; while (n < 5) { int x = rand() % (size - 2) + 1; int y = rand() % (size - 2) + 1; if (grid[x][y].target == 0 && grid[x][y].robot.id == 0) { grid[x][y].robot.position.x = x; grid[x][y].robot.position.y = y; grid[x][y].robot.id = n; n++; } } } void addSpikes(Box **grid, int size) { int n = 0; int x; do { // Add spikes on the left side of the grid int x = rand() % (size - 2) + 2; if (grid[1][x].vertical == 'X') { grid[1][x].vertical = 'N'; n++; } } while (n < 2); n = 0; do { // Add spikes on the right side of the grid int x = rand() % (size - 2) + 2; if (grid[size - 2][x].vertical == 'X') { grid[size - 2][x].vertical = 'N'; n++; } } while (n < 2); n = 0; do { // Add spikes on the up side of the grid int x = rand() % (size - 2) + 2; if (grid[x][1].horizontal == 'X') { grid[x][1].horizontal = 'W'; n++; } } while (n < 2); n = 0; do { // Add spikes on the up side of the grid int x = rand() % (size - 2) + 2; if (grid[x][size - 2].horizontal == 'X') { grid[x][size - 2].horizontal = 'W'; n++; } } while (n < 2); } int askNbPlayers() { int nbPlayers; int scan = 0; do { printf("\nChoose the number of players (2-6) : \n"); scan = scanf("%d", &nbPlayers); if (scan != 1) { while (getchar() != '\n') // LIRE LA DOCUMENTATION ; } } while (nbPlayers < 2 || nbPlayers > 6 || scan != 1); return nbPlayers; } void Play(Box **grid, int size) { int Idrobot = 0; int NumTarget = 0; int n = 0; n = rand() % 4 + 1; // random between 1 and 4 int x = rand() % (size - 2) + 1; int y = rand() % (size - 2) + 1; while (grid[x][y].robot.id != n) { x = rand() % (size - 2) + 1; y = rand() % (size - 2) + 1; } Idrobot = grid[x][y].robot.id; // random robot choosen n = rand() % 18 + 1; // random bewteen 1 and 18 while (grid[x][y].target != n) { x = rand() % (size - 4) + 2; y = rand() % (size - 4) + 2; } NumTarget = grid[x][y].target; // random target choosen } void affichageTest(Box **grid, int size) { for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { if (grid[i][j].wall != 0) { printf("🧱"); } else if (grid[i][j].robot.id == 0 && grid[i][j].target == 0 && grid[i][j].vertical == 'X' && grid[i][j].horizontal == 'X') { printf("⬜"); } else if (grid[i][j].robot.id == 0 && grid[i][j].target == 0 && grid[i][j].vertical != 'X') { printf("❗"); } else if (grid[i][j].robot.id == 0 && grid[i][j].target == 0 && grid[i][j].horizontal != 'X') { printf("➖"); } else if (grid[i][j].target != 0) { printf("🟥"); } else { switch (grid[i][j].robot.id) { case 1: printf("🟪"); break; case 2: printf("🟨"); break; case 3: printf("🟩"); break; case 4: printf("🟦"); break; } } } printf("\n"); } } void kawaiPrint() { printf("\x1B[31m*\x1B[32m#\x1B[33m*\x1B[34m#\x1B[35m*\x1B[36m#\x1B[32m*\x1B[" "33m#\x1B[34m*\x1B[31m#\x1B[36m*\x1B[35m#\x1B[31m*\x1B[32m#\x1B[33m*" "\x1B[34m#\x1B[35m*\x1B[36m#\x1B[32m*\x1B[" "33m#\x1B[34m*\x1B[31m#\x1B[36m*\x1B[35m#\x1B[31m*\x1B[32m#\x1B[33m*" "\x1B[34m#\x1B[35m*\n"); } int main() { system("clear"); printf("\x1B[31m*\x1B[32m#\x1B[33m*\x1B[34m#\x1B[35m*\x1B[36m#\x1B[32m*\x1B[" "33m#\x1B[34m*\x1B[31m#\x1B[36m*\x1B[35m#\x1B[31m*\x1B[32m#\x1B[33m*" "\x1B[34m#\x1B[35m*\x1B[36m#\x1B[32m*\x1B[" "33m#\x1B[34m*\x1B[31m#\x1B[36m*\x1B[35m#\x1B[31m*\x1B[32m#\x1B[33m*" "\x1B[34m#\x1B[35m*\n\n"); printf("WELCOME TO : " "\x1B[31mC\x1B[32mY\x1B[33mB\x1B[34mE\x1B[35mR\x1B[37m-\x1B[36mL\x1B[" "31mI\x1B[32mN\x1B[33mE\x1B[34mR\n"); printf("\nAlpha version 0.1.5\n"); kawaiPrint(); srand(time(NULL)); int size = rand() % 6 + 15; // Generate random number between 15 and 20 int nbPlayers = askNbPlayers(); system("clear"); for (int i = 3; i > 0; i--) { // sleep(1); printf("%d ", i); kawaiPrint(); } // sleep(1); printf(" \n\nSTART OF THE GAME\n\n"); // sleep(1); system("clear"); Player *Board = createPlayerBoard(nbPlayers, size); Box **grid = createGrid(size); fillGrid(grid, size); addTargets(grid, size, 18); // Add 18 targets addRobots(grid, size); addSpikes(grid, size); printf("\nROUND 1/64\n\n"); affichageTest(grid, size); Play(grid, size); // Free all memory for (int k = 0; k < size; k++) { free(grid[k]); } free(grid); return 0; }
Editor is loading...
Leave a Comment