- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
// Глобальные переменные
uint8_t *map = NULL;
int map_width = 0;
int map_height = 0;
bool load_level(const char *filename) {
FILE *file = fopen(filename, "r");
if (!file) {
printf("Ошибка: Не удалось открыть файл %s\n", filename);
return false;
}
char lines[512][512];
int h = 0;
char buffer[512];
while (fgets(buffer, sizeof(buffer), file)) {
buffer[strcspn(buffer, "\r\n")] = 0;
if (buffer[0] == '\0' || buffer[0] == ';') continue;
bool contains_map_char = false;
for(int i=0; buffer[i]; i++) {
if (strchr("#$@.*+ ", buffer[i])) {
contains_map_char = true;
break;
}
}
if (contains_map_char) {
strncpy(lines[h], buffer, 511);
h++;
if (h >= 512) break;
}
if (h > 0 && buffer[0] == '\0') break;
}
fclose(file);
if (h == 0) return false;
int w = 0;
for (int i = 0; i < h; i++) {
int len = strlen(lines[i]);
if (len > w) w = len;
}
map = malloc(w * h * sizeof(uint8_t));
map_width = w;
map_height = h;
memset(map, CELL_EMPTY, w * h);
for (int y = 0; y < h; y++) {
for (int x = 0; x < w; x++) {
char c = (x < (int)strlen(lines[y])) ? lines[y][x] : ' ';
if (c == '#') map[y * w + x] = CELL_WALL;
else if (c == '$') map[y * w + x] = CELL_CUBE;
else if (c == '.') map[y * w + x] = CELL_TARGET;
else if (c == '*') map[y * w + x] = CELL_CUBE_ON_TARGET;
else if (c == '@') { map[y * w + x] = CELL_EMPTY; playerX = x; playerY = y; }
else if (c == '+') { map[y * w + x] = CELL_TARGET; playerX = x; playerY = y; }
else map[y * w + x] = CELL_EMPTY;
}
}
return true;
}
Вот так выглядят текстовые файлы с уровнем
Если в уровне будет более одного `+` или `@` то координаты игрока будут по самому последнему попавшемуся такому символу.
Можно сделать сокобан чтоб более одного игрока было, и чтоб все одновременно двигались, но тогда надо делать массив координат
Сокобаные для текстового режима писались либо в 80-е студентотой, либо пожже как лаба студентотой. Нейронка жтим и срёт.
https://ru.wikipedia.org/wiki/Подземелья_Кремля