如何在C语言生命游戏中从文件初始化二维网格?
求助:C语言终端版生命游戏网格初始化问题
作为学校项目,我正在开发一款可在终端运行的C语言生命游戏。程序需要完成以下步骤:
- 读取文件并获取网格尺寸(已实现)
- 根据文件初始化格式正确的网格(开发中,需帮助)
- 显示该网格(应可正常运行)
- 计算并打印所有下一代网格(开发中)
目前我和队友已编写了文件解析、获取网格尺寸、打印网格等辅助函数,也为计算下一代网格做了必要准备,但始终无法实现将文件中的字符映射为终端字符来初始化网格的功能。
我们尚未学习高级编程概念,因此需要基础解法,这对我们帮助很大!
以下是相关代码(其他部分无影响,注释为法语,若需完整代码可提供):
#include <stdio.h> #include <errno.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define INVALID_CHAR_READING 101 #define CANT_OPEN_FILE 201 #define FAIL_UPDATE 102 /// @brief Obtient les dimensions de la grille du jeu de la vie /// @param filename le nom du fichier /// @param dimensions un tableau de dimensions non instancié /// @return un tableau d'entier contenant dans l'ordre lignes, colonnes void get_dimensions(char filename[], int *dimensions) { errno = 0; FILE *content = fopen(filename, "r"); if (content == NULL) { fprintf(stderr, "Une erreur s'est produite a l'ouverture du fichier %s : %s\n", filename, strerror(errno)); exit(CANT_OPEN_FILE); } int lines = 0; int columns = 0; char buffer; for (buffer = getc(content); buffer != EOF; buffer = getc(content)) { if (buffer == '\n') { lines = lines + 1; } columns += 1; } columns /= lines; // columns /= 2; // on a compté les espaces fclose(content); dimensions[0] = lines; dimensions[1] = columns; } void init_grid(char filename[], char **grid, int *dimensions) { errno = 0; FILE *content = fopen(filename, "r"); if (content == NULL) { fprintf(stderr, "Une erreur s'est produite a l'ouverture du fichier %s : %s\n", filename, strerror(errno)); exit(CANT_OPEN_FILE); } int line = 0; int column = 0; char ch; while ((ch = fgetc(content)) != EOF) { while (column < dimensions[1] && line < dimensions[0]) { switch (ch) { case 'o': grid[line][column] = ' '; case 'x': grid[line][column] = ' '; case '\n': grid[line][column] = ch; default: fprintf(stderr, "Une erreur s'est produite lors de la lecture du caractère à l'initialisation de la grille :/ Votre fichier est peut-être incompatible avec le parseur...\n"); exit(INVALID_CHAR_READING); } column++; }; line++; } } void print_grid(char **grid, int *dimensions) { for (int i = 0; i < dimensions[0]; i++) { for (int j = 0; j < dimensions[1]; j++) { printf("%c", grid[i][j]); } }; } void gol() { char filename[256]; printf("Quel est le nom du fichier que vous cherchez à ouvrir ? (Merci d'entrer le chemin complet du fichier)\n> "); scanf("%s", &filename); // printf("%s", filename); int dimensions[2]; get_dimensions(filename, dimensions); printf("%d %d\n", dimensions[0], dimensions[1]); char grid[dimensions[1]][dimensions[0]]; // printf("%d", sizeof(grid)); init_grid(filename, &grid, dimensions); print_grid(grid, dimensions); } int main() { printf("GOL\n===\nQue voulez-vous faire ? (h: aide, f: chemin de fichier, r: random)\n> "); char option; scanf("%c", &option); switch (option) { case 'h': help(); break; case 'f': gol(); // Nécéssaire sinon bypass du contrôle d'initialisation?? break; case 'r': // TODO implémentation de la grille random break; default: printf("\nVous n'avez pas rentré d'option valable :( Merci de relancer le programme pour recommencer ;)\n\n"); exit(INVALID_CHAR_READING); } return 0; }
内容的提问来源于stack exchange,提问作者Elouan MARRON
相关产品推荐
相关产品推荐

