#include <stdio.h> #include <stdlib.h> #include <u...
創建於:2025年2月8日
創建於:2025年2月8日
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <termios.h>
#define WIDTH 80
#define HEIGHT 25
#define ALIVE '*'
#define DEAD ' '
char field[HEIGHT][WIDTH];
struct termios orig_termios;
void disable_raw_mode() {
tcsetattr(STDIN_FILENO, TCSAFLUSH, &orig_termios);
}
void enable_raw_mode() {
tcgetattr(STDIN_FILENO, &orig_termios);
atexit(disable_raw_mode);
struct termios raw = orig_termios;
raw.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSAFLUSH, &raw);
}
void init_field() {
// Читаем построчно из stdin
char line[WIDTH+2];
for (int y = 0; y < HEIGHT; y++) {
if (!fgets(line, sizeof(line), stdin)) break;
for (int x = 0; x < WIDTH; x++) {
field[y][x] = (line[x] == ALIVE) ? ALIVE : DEAD;
}
}
}
int count_neighbors(int x, int y) {
int count = 0;
for (int dy = -1; dy <= 1; dy++) {
for (int dx = -1; dx <= 1; dx++) {
if (dx == 0 && dy == 0) continue;
int nx = (x + dx + WIDTH) % WIDTH;
int ny = (y + dy + HEIGHT) % HEIGHT;
if (field[ny][nx] == ALIVE) count++;
}
}
return count;
}
void update_field() {
char new_field[HEIGHT][WIDTH];
for (int y = 0; y < HEIGHT; y++) {
for (int x = 0; x < WIDTH; x++) {
int neighbors = count_neighbors(x, y);
new_field[y][x] = (neighbors == 3) ? ALIVE :
(neighbors == 2 && field[y][x] == ALIVE) ? ALIVE : DEAD;
}
}
for (int y = 0; y < HEIGHT; y++)
for (int x = 0; x < WIDTH; x++)
field[y][x] = new_field[y][x];
}
void draw_field() {
printf("\033[H"); // Курсор в начало
for (int y = 0; y < HEIGHT; y++) {
for (int x = 0; x < WIDTH; x++) {
putchar(field[y][x]);
}
putchar('\n');
}
fflush(stdout);
}
int main() {
enable_raw_mode();
init_field();
textint delay = 100000; // Начальная задержка 100ms char input; while(1) { printf("\033[2J"); // Очистка экрана draw_field(); update_field(); // Обработка ввода if (read(STDIN_FILENO, &input, 1) > 0) { if (input == 'q') break; if (input == '+' && delay > 20000) delay -= 20000; if (input == '-' && delay < 500000) delay += 20000; } usleep(delay); } disable_raw_mode(); return 0;
}
в общем такой момент, не совсем понимаю что с этим делать
тут файл peppa.txt:
00110101011001001011010100110101011001001011010100110101011001001011010100110101
10110101001101010110010010110101001101010110010010110101001101010110010010110101
01100100101101010011010101100100101101010011010101100100101101010011010101100100
01100100101101010011010101100100101101010011010101100100101101010011010101100100
01100100101101010011010101100100101101010011010101100100101101010011010101100100
10110101001101010110010010110101001101010110010010110101001101010110010010110101
10110101001101010110010010110101001101010110010010110101001101010110010010110101
10010110100110100101101001101001011010011010010110100110100101101001101001011010
01101001011001010110011010010110010101100110100101100101011001101001011001010110
01101001011001010110011010010110010101100110100101100101011001101001011001010110
10010110100110100101101001101001011010011010010110100110100101101001101001011010
10010110100110100101101001101001011010011010010110100110100101101001101001011010
01101001011001010110011010010110010101100110100101100101011001101001011001010110
01101001011001010110011010010110010101100110100101100101011001101001011001010110
10100101101100101010011010100101101010010110110010101001101010010110110010101001
01011010010011010101100101010011010101100101001101010110010101001101010110010101
10100101101100101010011010100101101010010110110010101001101010010110110010101001
01101010011001011010100110101010011010100110010110101001101010100110101001100101
10010101100110100101011001010110100101011001101001010110010101101001010110011010
01101010010100110101011001010100110101011001010100110101011001010100110101011001
10010101101011001010011010100101101011001010011010100101101011001010011010100101
01101001011010010110101001101001011010010110101001101001011010010110101001101001
10010110100101100101010010010110100101101010010101001001011010010110101001010100
01011010101001101010110010101101010110101010011010101100101011010101101010100110
10100101010110010101001101010010101001010101100101010011010100101010010101011001
Этот код реализует симуляцию игры «Жизнь» Конвея. Он ожидает, что начальное состояние поля (размером 80×25) будет передано через стандартный ввод, где каждая строка содержит 80 символов, а символ, равный значению константы ALIVE
(по умолчанию это '*'
), означает живую клетку, а всё остальное – мёртвая клетка.
В вашем случае файл peppa.txt
содержит строки из символов '0'
и '1'
. При текущей реализации функции init_field
каждая клетка будет считаться мёртвой, поскольку условие
cfield[y][x] = (line[x] == ALIVE) ? ALIVE : DEAD;
проверяет, равен ли символ именно '*'
, а в файле его нет.
Чтобы использовать файл peppa.txt
как начальное состояние, у вас есть два варианта:
Измените содержимое peppa.txt
, чтобы вместо '0'
и '1'
использовать символы:
'*'
для живой клетки,' '
) для мёртвой.Например, строка из файла могла бы выглядеть так:
** * ** * ** ... (всего 80 символов)
Если вы хотите оставить файл без изменений (то есть использовать '1'
для живых клеток), измените функцию init_field
, чтобы она интерпретировала символ '1'
как живую клетку. Например, замените строку
cfield[y][x] = (line[x] == ALIVE) ? ALIVE : DEAD;
на
cfield[y][x] = (line[x] == '1') ? ALIVE : DEAD;
При этом вы можете оставить #define ALIVE '*'
– это значит, что внутренняя репрезентация живой клетки будет всё ещё символом '*'
, что вполне допустимо.
После того как вы выбрали один из вариантов, выполните следующие шаги:
Компиляция
Например, с помощью gcc:
bashgcc -o life life.c
Запуск с подачей входных данных
Если вы оставили файл как есть, запустите программу с перенаправлением стандартного ввода:
bash./life < peppa.txt
Программа откроет peppa.txt
, прочитает первые 25 строк по 80 символов и запустит симуляцию.
Управление симуляцией
q
для выхода.+
для уменьшения задержки (ускорения симуляции).-
для увеличения задержки (замедления симуляции).Таким образом, если вы не до конца понимаете, что делать с кодом и файлом, то суть в следующем: настройте входные данные (либо файл, либо код) так, чтобы они соответствовали друг другу, затем скомпилируйте и запустите программу, передав ей ваш файл.