Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 26.10.2024
Сообщений: 8

Доработка кода игры "Жизнь"

05.01.2025, 15:41. Показов 4655. Ответов 31

Студворк — интернет-сервис помощи студентам
В чем суть, на просторах интернета нашел код, приближенный к желаемому, но он не совсем корректно. В консоли все чисто. Не могу понять в чем причина.
Вообще основная задача была в том, чтобы программа брала данные из файла, в котором будут указаны кол. столбцов, строк, задержка в сек. между поколениями и необходимость вывода в файл.
Надеюсь вы мне поможете доработать.

Если есть альтернативные решение этой игры, то готов рассмотреть и начать все с начала. Пишу итоговую работу семестра. Использовать векторы пока нельзя. Динамические массивы только можно использовать.
Многопоточность идет как доп. задание. Можно и убрать, оно типа на самостоятельное изучение.

Пробовал подставить значения переменных в ручную, пытался выяснить где ошибка.

В идеале, задумка была такая. Программа запросит у пользователя параметры игры. Кол. столбцов и строк и координаты живых клеток и запишет их в файл. Далее программа считает инфу с файла и разыграет события от указанных живых клеток

Пример получившегося файла приложил.
20 30
2 3
2 4
3 4
3 5
3 6
3 7
5 0
5 1
5 2
6 2

Как доп вариант, хотелось бы сделать чтобы консоль очищалась после показа поколения через функцию
C++
1
std::system("clear");
используя библиотеку
C++
1
<cstdlib>
И была задержка
C++
1
sleep(время задержки в сек);
из библиотеки
C++
1
<unistd.h>
Просьба помочь, кто чем может. Буду благодарен. Преподаватели ссылаются на то, что студенты САМИ должны искать информацию в интернете. Надеюсь с вашей помощью и пояснениями у меня получится сделать то, что требуется


C++
1
2
3
4
5
6
7
8
9
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
#include <iostream>
#include <fstream>
#include <thread>
 
 
 
#define FILL_CHAR 219
#define EMPTY_CHAR 255
 
void print(unsigned int generation, char* print_arr) {
    printf("Generation:%i\n%s\n", generation, print_arr);
}
 
bool equals(bool* array1, bool* array2, unsigned int n, unsigned int m) {
    for (unsigned int i = 0; i < n; i++)
        for (unsigned int j = 0; j < m; j++)
            if (array1[i * m + j] != array2[i * m + j])
                return false;
    return true;
}
unsigned short inline get(bool* array, unsigned int n, unsigned int m, unsigned int x, unsigned int y) {
    if (x < 1 || y < 1 || x > m || y > n) return 0;
    return array[(y - 1) * m + (x - 1)];
}
 
void process_output(bool* array1, bool* array2, char* print_arr, unsigned int n, unsigned int m) {
#pragma omp parallel for
    for (__int64 i = 0; i < (__int64)n; i++)
    {
        for (unsigned int j = 0; j < m; j++) {
            unsigned short alive_near = get(array1, n, m, j, i) +
                get(array1, n, m, j, i + 1) +
                get(array1, n, m, j, i + 2) +
                get(array1, n, m, j + 1, i) +
                get(array1, n, m, j + 1, i + 2) +
                get(array1, n, m, j + 2, i) +
                get(array1, n, m, j + 2, i + 1) +
                get(array1, n, m, j + 2, i + 2);
 
            if (alive_near > 3)
            {
                array2[i * m + j] = false;
                print_arr[i * (m + 1) + j] = EMPTY_CHAR;
            }
            else if (alive_near > 2)
            {
                array2[i * m + j] = true;
                print_arr[i * (m + 1) + j] = FILL_CHAR;
            }
            else if (alive_near > 1)
            {
                array2[i * m + j] = array1[i * m + j];
                print_arr[i * (m + 1) + j] = array1[i * m + j] ? FILL_CHAR : EMPTY_CHAR;
            }
            else {
                array2[i * m + j] = false;
                print_arr[i * (m + 1) + j] = EMPTY_CHAR;
            }
        }
        print_arr[m + i * (m + 1)] = '\n';
    }
    print_arr[n * (m + 1) - 1] = '\0';
}
 
void process_no_output(bool* array1, bool* array2, unsigned int n, unsigned int m) {
#pragma omp parallel for
    for (__int64 i = 0; i < (__int64)n; i++)
    {
        for (unsigned int j = 0; j < m; j++) {
            unsigned short alive_near = get(array1, n, m, j, i) +
                get(array1, n, m, j, i + 1) +
                get(array1, n, m, j, i + 2) +
                get(array1, n, m, j + 1, i) +
                get(array1, n, m, j + 1, i + 2) +
                get(array1, n, m, j + 2, i) +
                get(array1, n, m, j + 2, i + 1) +
                get(array1, n, m, j + 2, i + 2);
 
            if (alive_near > 3)
            {
                array2[i * m + j] = false;
            }
            else if (alive_near > 2)
            {
                array2[i * m + j] = true;
            }
            else if (alive_near > 1)
            {
                array2[i * m + j] = array1[i * m + j];
            }
            else {
                array2[i * m + j] = false;
            }
        }
    }
}
 
int main(int argc, char* argv[]) {
    std::ifstream in("in.txt");
    unsigned int n;
    unsigned int m;
    unsigned int delay;
    unsigned int max_iterations;
    bool output;
    in >> n >> m >> delay >> max_iterations >> output;
    //unsigned int n{ 100 };
    //unsigned int m{ 100 };
    //unsigned int delay{ 1 };
    //unsigned int max_iterations{ 915 };
    //bool output{ true };
    //in >> n >> m >> delay >> max_iterations >> output;
 
 
    bool* array1 = new bool[n * m];
    bool* array2 = new bool[n * m];
 
 
    if (output)
    {
        char* print_arr = new char[n * (m + 1)];
        for (unsigned int i = 0; i < n; i++)
        {
            for (unsigned int j = 0; j < m; j++)
            {
                in >> array1[i * m + j];
                print_arr[i * (m + 1) + j] = array1[i * m + j] ? FILL_CHAR : EMPTY_CHAR;
            }
            print_arr[m + i * (m + 1)] = '\n';
        }
        printf_s("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
        print_arr[n * (m + 1) - 1] = '\0';
 
        print(0, print_arr);
        std::this_thread::sleep_for(std::chrono::milliseconds(delay));
 
        unsigned int generation = 0;
 
        while (true) {
 
            std::chrono::steady_clock::time_point start, end;
            start = std::chrono::steady_clock::now();
 
            process_output(array1, array2, print_arr, n, m);
            print(++generation, print_arr);
 
            if (equals(array1, array2, n, m) || max_iterations != 0 && generation >= max_iterations)
                break;
 
            end = std::chrono::steady_clock::now();
 
            __int64 time = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
            if (time < delay)
            {
                std::this_thread::sleep_for(
                    std::chrono::milliseconds(delay - time));
            }
            bool* temp = array1;
            array1 = array2;
            array2 = temp;
        }
    }
 
 
    else {
        std::chrono::steady_clock::time_point start, end;
        start = std::chrono::steady_clock::now();
        for (unsigned int i = 0; i < n; i++)
        {
            for (unsigned int j = 0; j < m; j++)
            {
                in >> array1[i * m + j];
            }
        }
        unsigned int generation = 0;
        while (true) {
            process_no_output(array1, array2, n, m);
            generation++;
            if (equals(array1, array2, n, m) || max_iterations != 0 && generation >= max_iterations)
                break;
 
            bool* temp = array1;
            array1 = array2;
            array2 = temp;
        }
        end = std::chrono::steady_clock::now();
        __int64 time = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
        std::ofstream out("out.txt");
        out << "Time, milliseconds: " << time;
    }
    return 0;
}
Добавлено через 3 минуты
Дополню, живые клетки должны помечаться * а мертвые -
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.01.2025, 15:41
Ответы с готовыми решениями:

Рулетка - доработка кода
Я только недавно начал программировать на С++ и решил написать консольную программу типа рулетки. Вот код #include &lt;iostream&gt; ...

Проверка и доработка кода.
Написал программу попробовал откомпилировать в Visual Studio 2010. Стало выдавать разнообразные ошибки. Помогите пожалуйста исправить...

Придумать фигуру для игры "Жизнь" Джона Конвея
Задание: &quot;Продемонстрируйте работу клеточного автомата на примере «сорняка» («паразита») (фигуры, которая при столкновении с некоторыми...

31
 Аватар для vlisp
1059 / 980 / 153
Регистрация: 10.08.2015
Сообщений: 5,314
05.01.2025, 16:06
это жопа, а не код
0
place status here
 Аватар для gunslinger
3185 / 2219 / 640
Регистрация: 20.07.2013
Сообщений: 5,986
05.01.2025, 16:49
Билдер:
Игра Жизнь
Распространение инфекции
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6087 / 2778 / 1037
Регистрация: 01.06.2021
Сообщений: 10,137
05.01.2025, 19:40
gunslinger, вот такую жизнь надо реализовать - посмотри с 1:30 и до конца

Кликните здесь для просмотра всего текста
0
05.01.2025, 19:53

Не по теме:

Royal_X, даже если я подобное каким-то чудом сделаю, оно будет работать со скоростью примерно 1 кадр в час.

0
05.01.2025, 20:02

Не по теме:

gunslinger, алгоритм тот же и реализуется просто. Сложность в том, как именно расставить первоначальные живые участки. Они расставляют по-хитрому, чтобы потом после запуска произошло чудо.

0
05.01.2025, 20:38

Не по теме:

Royal_X, начальные фигуры - это понятно, что от них все зависит. Я имел в виду оптимизацию процесса отрисовки такого количества объектов.

0
Just Do It!
 Аватар для XLAT
4188 / 2642 / 654
Регистрация: 23.09.2014
Сообщений: 8,829
Записей в блоге: 3
05.01.2025, 23:00
Цитата Сообщение от Royal_X Посмотреть сообщение
посмотри с 1:30 и до конца
а вот и по настоящему эпичная история:
Реализация «Тетриса» в игре «Жизнь»

кратко так:
Code
1
2
3
1. сначала в Конвее Лайфе захардили проц, 
2. под который сделали язык с компилятором,
3. а потом на нем закодили "всю оставшеюся вселенную"...
Цитата Сообщение от GRAGGA Посмотреть сообщение
Если есть альтернативные решение этой игры,
вот тут с загрузкой из файла "data.txt" набор из '*' и пробелов:
https://www.cyberforum.ru/post15782621.html
0
05.01.2025, 23:29

Не по теме:

XLAT, я бы всем этим героям дал шнобелевскую премию

0
0 / 0 / 0
Регистрация: 26.10.2024
Сообщений: 8
06.01.2025, 19:06  [ТС]
Как писал выше нужен код без использования структур и векторов

Добавлено через 3 часа 12 минут
Переработал свой код полностью.
Пока оставил параметры ширины и высоты поля фиксированными. Работает нормально.

Но моя версия игры лишь основа, которую стоит доработать. Просьба помочь с этим.
Требования:
1) Текущее состояние Вселенной выводится на консоль в виде таблицы из символов. Мёртвая клетка помечается символом "пробел", живая клетка помечается символом *.
2) На каждом шаге на консоль должно выводиться текущее состояние Вселенной, а также информация о номере поколения и количестве живых клеток на текущий момент.
3) При завершении игры на консоли должно присутствовать состояние Вселенной на момент окончания игры, номер поколения, количество живых клеток и причина завершения игры.
Причины:
1) Колония развивается (в случае дальнейшего роста количества живых клеток)
2) Колония умирает (в случае уменьшения количества клеток)
3) Колония погибла (в случае конца игры по причине отсутствия живых клеток)
4) Колония стагнирует (в случает отсутствия изменений)
C++
1
2
3
4
5
6
7
8
9
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <chrono>
#include <thread>
 
const int width = 40; // параметр ширины поля
const int height = 40; // параметр высоты поля
 
using Board = int[width][height]; // сокращение для удобства
 
 
void fill_rand(Board board) {
    std::srand(std::time(nullptr));
 
    for (int i = 0; i < width; ++i) {
        for (int j = 0; j < height; ++j) {
            if (rand() % 10 == 0) {
                board[i][j] = 1;  // живая клетка
            }
            else {
                board[i][j] = 0; // мертвая клетка
            }
        }
    }
}
 
void print(Board board) {
    for (int i = 0; i < width; ++i) {
        for (int j = 0; j < height; ++j) {
            if (board[i][j] == 1) { // Проверка на жизнь
                std::cout << "*";  // Если жива, то *
            }
            else {
                std::cout << " "; // Если мертва, то пробел
            }
        }
        std::cout << std::endl;
    }
}
 
void copy(Board src, Board dst) {
    for (int i = 0; i < width; ++i) {
        for (int j = 0; j < height; ++j) {
            dst[i][j] = src[i][j];  // копия прошлого поколения 
        }
    }
}
 
int get_x(int i) {
    return(width + i) % width;
}
 
int get_y(int j) {
    return(height + j) % height;
}
 
void step(Board board) {
    Board prev;   // предыдущее состояние
    copy(board, prev);
 
    for (int i = 0; i < width; ++i) {
        for (int j = 0; j < height; ++j) {
            /*(i - 1, j - 1)    (i - 1, j)  (i - 1, j + 1)
              (i, j - 1)        (i, j)      (i, j + 1)
              (i + 1, j - 1)    (i + 1, j)  (i + 1, j + 1)*/
            int counter_neighbors = 0;
            counter_neighbors += prev[get_x(i - 1)][get_y(j - 1)];    // верхняя левая
            counter_neighbors += prev[get_x(i - 1)][get_y(j)];        // верхняя центральная
            counter_neighbors += prev[get_x(i - 1)][get_y(j + 1)];    // верхняя правая
            counter_neighbors += prev[get_x(i)][get_y(j - 1)];        // средняя левая
            counter_neighbors += prev[get_x(i)][get_y(j + 1)];        // средняя правая
            counter_neighbors += prev[get_x(i + 1)][get_y(j - 1)];    // нижняя левая
            counter_neighbors += prev[get_x(i + 1)][get_y(j)];        // нижняя центральная
            counter_neighbors += prev[get_x(i + 1)][get_y(j + 1)];    // нижняя правая
 
            if ((prev[i][j] == 0) && (counter_neighbors == 3)) {      
                board[i][j] = 1;                                                // описал условия задачи
            }
            else if ((counter_neighbors < 2) || (counter_neighbors > 3)) {
                board[i][j] = 0;
            }
        }
    }
}
 
 
 
 
 
 
int main() {
    Board board;
 
    fill_rand(board);
 
    for (int k = 0; k < 100; ++k) {
        print(board);
        step(board);
        std::this_thread::sleep_for(std::chrono::milliseconds(200));
        std::system("cls");
    }
    return 0;
}
0
place status here
 Аватар для gunslinger
3185 / 2219 / 640
Регистрация: 20.07.2013
Сообщений: 5,986
06.01.2025, 19:55
Лучший ответ Сообщение было отмечено GRAGGA как решение

Решение

Если нужно, я раньше так основной цикл делал:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  // проверяем в циклах все клетки
  for (i = 0; i < n; i++)
    for (j = 0; j < n; j++)
    {
      // обнуляем кол-во соседей
      neighbors = 0;
      // проверяем соседей
      for (k = -1; k < 2; k++)
        for (m = -1; m < 2; m++)
          if ((i+k >= 0 && j+m >= 0) && (i+k < n && j+m < n))  // проверка на выход за границы
            if (a[i+k][j+m] == 1)  // если сосед живой
              neighbors++;  // то увеличиваем счетчик
 
      if (a[i][j] == 0 && neighbors == condition)  // если клетка пустая и кол-во соседей = 3
        b[i][j] = 1;  // клетка становится живой
      // если клетка живая и кол-во соседей < 2 и больше 3 (не забываем, что сама клетка не учитывается, поэтому neighbors-1)
      if (a[i][j] == 1 && (neighbors-1 < condition-1 || neighbors-1 > condition))
        b[i][j] = 0;  // клетка становится пустой
    }
1
0 / 0 / 0
Регистрация: 26.10.2024
Сообщений: 8
07.01.2025, 14:01  [ТС]
Цитата Сообщение от gunslinger Посмотреть сообщение
я раньше так основной цикл делал
С основным циклом вроде нет проблем, самое сложное осталось остановка игры по двум причинам. В случаем смерти или стагнации

Добавлено через 2 минуты
vlisp, Почему закрыл тему? Пометил ответ с рофл видосом, как "решение"?
0
place status here
 Аватар для gunslinger
3185 / 2219 / 640
Регистрация: 20.07.2013
Сообщений: 5,986
07.01.2025, 15:30
Цитата Сообщение от GRAGGA Посмотреть сообщение
самое сложное осталось остановка игры по двум причинам. В случаем смерти или стагнации
И что тут сложного? Почти ничего (наверно).
В первом случае кол-во живых клеток равно нулю.
Во втором кол-во живых клеток не меняется (как и их расположение, судя по всему - тогда надо проверять данный момент).
Если процесс зацикливается, то это стагнация? Вроде нет, но точно не уверен.
Если нет, то ситуацию можно не учитывать. Если да, то нужно как-то определять, что происходит "повторение" (тут придется поразмыслить).

Пример стагнации:
0
place status here
 Аватар для gunslinger
3185 / 2219 / 640
Регистрация: 20.07.2013
Сообщений: 5,986
07.01.2025, 16:08
Пример зацикливания:
0
736 / 699 / 110
Регистрация: 29.05.2015
Сообщений: 4,260
07.01.2025, 16:18
А еще можно чуток поменять условия, и "жизнь" начнёт строит лабиринты:
Миниатюры
Доработка кода игры "Жизнь"  
0
place status here
 Аватар для gunslinger
3185 / 2219 / 640
Регистрация: 20.07.2013
Сообщений: 5,986
07.01.2025, 18:00
Можно и "узоры" рисовать.
0
Just Do It!
 Аватар для XLAT
4188 / 2642 / 654
Регистрация: 23.09.2014
Сообщений: 8,829
Записей в блоге: 3
07.01.2025, 23:22
Цитата Сообщение от GRAGGA Посмотреть сообщение
нужен код без использования структур
ваш препод пещерный гоутушник:
гоните его нафик - ничему хорошему он вас не научит.

или по окончании будете писать типичный для каменного века гавнокод на мусорку...
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6087 / 2778 / 1037
Регистрация: 01.06.2021
Сообщений: 10,137
08.01.2025, 00:51
XLAT, если нельзя структуры использовать, так можно классы (⁠◠⁠‿⁠◕⁠)
0
Just Do It!
 Аватар для XLAT
4188 / 2642 / 654
Регистрация: 23.09.2014
Сообщений: 8,829
Записей в блоге: 3
08.01.2025, 02:18
Цитата Сообщение от Royal_X Посмотреть сообщение
классы
даже школьники используют структуры в сишкошкодерстве,
а в то время о классах там те преподы даже не слышали.
0
736 / 699 / 110
Регистрация: 29.05.2015
Сообщений: 4,260
08.01.2025, 09:16
Нафига в игре жизнь структуры? Там нужно два 2-мерных массива и десяток строчек логики. Ну ещё какой-то механизм вывода на экран (что в консолях довольно затруднительно...)

Добавлено через 9 минут
Цитата Сообщение от gunslinger Посмотреть сообщение
нужно как-то определять, что происходит "повторение" (тут придется поразмыслить).
При повторении (зацикливании) как правило не меняется количество клеток, хотя они циклично меняют своё положение - т.е. две картинки сменяют друг друга. А когда летит самолёт - картинка меняется, хотя количество клеток остается постоянным. Как вариант - получать контрольную сумму экрана и если две контрольные суммы меняют друг друга - зацикливание.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.01.2025, 09:16
Помогаю со студенческими работами здесь

никто не сталкивался с распараллеливанием игры "Жизнь".
Всем приветики=**** Ребята, очень хотелось поинтересоваться, никто не сталкивался с распараллеливанием игры &quot;Жизнь&quot;. Очень...

Исправить ошибку в коде игры "Жизнь"
Суть задания в том чтобы дописать игру в жизнь в файле game, в определенном поле. Собственно в чем проблема код я дописал, но не знаю в чем...

Игра "Борьба за жизнь". Цель игры – убрать с доски все шашки противника
Здравствуйте! Помогите пожалуйста написать программу на с++. Два игрока имеют по n шашек и играют в поле m m клеток, делая ходы по...

Поиск повторяющихся слов в тексте (доработка кода)
Дан текст, содержащий n строк. Для каждого слова указать, сколько раз оно встречается в тексте. Я тут кое-что попробовала сделать (с++),...

Метод Зейделя для решения СЛАУ [Доработка кода]
Доброе утро народ. Мне нужна программа которая реализует Метод Зейделя для решения СЛАУ. Покопавшись в интернете нашел неплохой вариант. Но...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru