35 / 25 / 10
Регистрация: 08.02.2019
Сообщений: 158
1

Дайте критику коду, игра "Жизнь"

02.06.2019, 21:58. Показов 2271. Ответов 13
Метки нет (Все метки)

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

main.cpp
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
// Игра "Жизнь"
#include<iostream>
#include<ctime>
#include<Windows.h>
#include "Life.h"
 
/*
Правила игры***
 
Первое поколение — это положение игровых клеток в начале игры.
Будем заполнять его случайным образом.
Каждое новое поколение рассчитывается на основе предыдущего по таким правилам :
 
В пустой клетке, рядом с которой ровно три живые клетки, зарождается жизнь.
Если у живой клетки есть две или три живые соседки, то эта клетки продолжает жить.
Иначе, клетка умирает(от «одиночества» или «перенаселенности»).
 
Игра прекращается, если на поле не останется ни одной живой клетки или 
при очередном шаге ни одна клетка не меняет своего состояния(складывается стабильная конфигурация).
 
*/
 
using namespace std;
 
int main()
{
    srand(time(NULL));
    generatorWorld(); // Сгенирировали мир случайно
    while (endWorld != 1) // Цикл жизни мира
    {   
        displayWorld(); // Выводим мир на экран
        saveBuffWorld(); // Сохраняем текущее состояние мира в буффер
        updateStatus(); // Изменяем текущее состояние мира по правилам
        endWorld = gameOver(); // Проверяем, не настал ли конец игры настал
        if (endWorld == 1)
        {
            break; // Игра окончена
        }
        cout << "Age: " << age; // Выводим эпоху на экран
        Sleep(1000); // Задержка 1000мс
        age++; // Увеличить эпоху
    }
    cout << "Last age: " << age; // Выводим эпоху на экран
    system("pause");
    return 0;
}

Life.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#pragma once
 
extern int world[10][10]; // Карта мира 10x10, 1 - клетка живая, 0 - мертвая клетка
 
extern int buffWorld[10][10]; // Сюда сохраняется мир при изменении
 
extern int age; // Эпоха 
 
extern int endWorld; // Конец мира
 
extern void saveBuffWorld(); // Сохраняем мир в буффер
 
extern void displayWorld(); // Отобразить карту мира на экран
 
extern void generatorWorld(); // Функция генерации мира
 
extern void updateStatus(); // Проверяет, нужно ли изменять состояние клетки, если да то изменяет состояние на инверсию
 
extern int gameOver(); // Проверяет, завершать ли игру, return 0 - игра продолжается, return 1 - игра завершается

Life.cpp
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
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
#include<iostream>
#include<ctime>
#include<Windows.h>
#include "Life.h"
 
// Значение переменных можно посмотреть в файле "Life.h"
int world[10][10];
 
int buffWorld[10][10];
 
int age = 1; 
 
int endWorld = 0; 
 
using namespace std;
 
void saveBuffWorld() // Сохраняем мир в буффер
{
    for (int i = 0; i < 10; i++)
    {
        for (int j = 0; j < 10; j++)
        {
            buffWorld[i][j] = world[i][j];
        }
    }
}
 
void displayWorld() // Отобразить карту мира на экран
{
    system("cls");
    for (int i = 0; i < 10; i++)
    {
        for (int j = 0; j < 10; j++)
        {
            if (j != 9)
            {
                cout << world[i][j];
            }
            else
            {
                cout << world[i][j] << endl;
            }
        }
    }
}
 
void generatorWorld() // Функция генерации мира
{
    int generator = 0; // Переменная определяет, жива клетка или мертва
    for (int i = 0; i < 10; i++)
    {
        for (int j = 0; j < 10; j++)
        {
            generator = rand() % 2;
            world[i][j] = generator;
        }
    }
}
 
void updateStatus() // Проверяет, нужно ли изменять состояние клетки, если да то изменяет состояние на инверсию
{
    for (int i = 0; i < 10; i++)
    {
        for (int j = 0; j < 10; j++)
        {
            if (world[i][j] == 1) // Живая клетка
            {
                int lifeNeighbors = 0; // Количество живых соседей у живой клетки (максимум 8)
 
                if (i - 1 >= 0 && world[i - 1][j] == 1) // Северный сосед(верхний)
                {
                    lifeNeighbors++;
                }
 
                if (i + 1 <= 9 && world[i + 1][j] == 1) // Южный сосед
                {
                    lifeNeighbors++;
                }
 
                if (j - 1 >= 0 && world[i][j - 1] == 1) // Западный сосед
                {
                    lifeNeighbors++;
                }
 
                if (j + 1 <= 9 && world[i][j + 1] == 1) // Восточный сосед
                {
                    lifeNeighbors++;
                }
 
                if (i - 1 >= 0 && j - 1 >= 0 && world[i - 1][j - 1] == 1) // Северо-западный сосед
                {
                    lifeNeighbors++;
                }
 
                if (i + 1 <= 9 && j + 1 <= 9 && world[i + 1][j + 1] == 1) // Юго-восточный сосед
                {
                    lifeNeighbors++;
                }
 
                if (i - 1 >= 0 && j + 1 <= 9 && world[i - 1][j + 1] == 1) // Северо-восточный сосед
                {
                    lifeNeighbors++;
                }
 
                if (i + 1 <= 9 && j - 1 >= 0 && world[i + 1][j - 1] == 1) // Юго-западный сосед
                {
                    lifeNeighbors++;
                }
 
                if (lifeNeighbors < 2)
                {
                    world[i][j] = 0; // Если у живой клетки нету рядом две живых клетки, тогда клетка погибла
                }
            }
            else // Мертвая клетка
            {
                int lifeNeighbors = 0; // Количество живых соседей у живой клетки (максимум 8)
 
                if (i - 1 >= 0 && world[i - 1][j] == 1) // Северный сосед(верхний)
                {
                    lifeNeighbors++;
                }
 
                if (i + 1 <= 9 && world[i + 1][j] == 1) // Южный сосед
                {
                    lifeNeighbors++;
                }
 
                if (j - 1 >= 0 && world[i][j - 1] == 1) // Западный сосед
                {
                    lifeNeighbors++;
                }
 
                if (j + 1 <= 9 && world[i][j + 1] == 1) // Восточный сосед
                {
                    lifeNeighbors++;
                }
 
                if (i - 1 >= 0 && j - 1 >= 0 && world[i - 1][j - 1] == 1) // Северо-западный сосед
                {
                    lifeNeighbors++;
                }
 
                if (i + 1 <= 9 && j + 1 <= 9 && world[i + 1][j + 1] == 1) // Юго-восточный сосед
                {
                    lifeNeighbors++;
                }
 
                if (i - 1 >= 0 && j + 1 <= 9 && world[i - 1][j + 1] == 1) // Северо-восточный сосед
                {
                    lifeNeighbors++;
                }
 
                if (i + 1 <= 9 && j - 1 >= 0 && world[i + 1][j - 1] == 1) // Юго-западный сосед
                {
                    lifeNeighbors++;
                }
 
                if (lifeNeighbors == 3)
                {
                    world[i][j] = 1; // Если рядом с мертвой клеткой ровно три живые клетки, тогда клетка оживает
                }
            }
        }
    }
}
 
int gameOver() // Проверяет, завершать ли игру, return 0 - игра продолжается, return 1 - игра завершается
{
    bool gameOv = true;
 
    for (int i = 0; i < 10; i++)
    {
        for (int j = 0; j < 10; j++)
        {
            if (gameOv == 1)
            {
                gameOv = false;
                break; // Живая клетка в мире есть 
            }
        }
    }
 
    if (gameOv == false)
    {
        gameOv = true;
 
        for (int i = 0; i < 10; i++)
        {
            for (int j = 0; j < 10; j++)
            {
                if (world[i][j] != buffWorld[i][j])
                {
                    gameOv = false;
                    break; // Конфигурация не повторяется, изменения в мире есть 
                }
            }
        }
    }
 
    if (gameOv == true)
    {
        return 1; // Игра окончена
    }
    else
    {
        return 0; // Игра продолжается
    }
}
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.06.2019, 21:58
Ответы с готовыми решениями:

Игра жизнь
Помогите пожалуйста с решением. Код нужен на С++ «Жизнь» – компьютерная игра, придуманная...

игра жизнь
содержимое life.cpp// Life.cpp: определяет точку входа для консольного приложения. // #include...

Игра жизнь
Нужно написать игру &quot;Жизнь&quot; простым кодом. Только начал изучать c++

Игра Жизнь
Написал вот такую реализацию: #include &quot;stdafx.h&quot; #include &quot;iostream&quot; #include &quot;clocale&quot; ...

13
88 / 108 / 6
Регистрация: 16.04.2019
Сообщений: 451
Записей в блоге: 4
02.06.2019, 22:25 2
Цитата Сообщение от Helpdes Посмотреть сообщение
Дайте критику коду, игра "Жизнь"
2019 год на дворе, графика где?
1
35 / 25 / 10
Регистрация: 08.02.2019
Сообщений: 158
02.06.2019, 22:34  [ТС] 3
IamLost, графика само собой будет, спасибо, учту
1
Неэпический
17850 / 10618 / 2049
Регистрация: 27.09.2012
Сообщений: 26,689
Записей в блоге: 1
02.06.2019, 22:45 4
Helpdes, один вопрос. А C++ взят ради cout'ов?
0
35 / 25 / 10
Регистрация: 08.02.2019
Сообщений: 158
02.06.2019, 22:55  [ТС] 5
Цитата Сообщение от Croessmah Посмотреть сообщение
А C++ взят ради cout'ов?
Нет
0
4055 / 3309 / 924
Регистрация: 25.03.2012
Сообщений: 12,451
Записей в блоге: 1
02.06.2019, 22:57 6
Вот не надоедает самим-то бесконечные if (i - 1 >= 0 копипастить?
0
Эксперт С++
8738 / 4316 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
02.06.2019, 23:00 7
Цитата Сообщение от Helpdes Посмотреть сообщение
#include<Windows.h>
зачем прибивать игру гвоздями к Windows?

замени:
Цитата Сообщение от Helpdes Посмотреть сообщение
Sleep(1000);
на:

C++
1
2
3
4
5
6
#include <thread>
#include <chrono>
 
...
 
std::this_thread::sleep_for(std::chrono::seconds(1));
получишь тоже самое,
но теперь игрушку можно собрать и запустить под всякими линуксами.

Цитата Сообщение от Helpdes Посмотреть сообщение
srand(time(NULL));
хорошая идея заключается в том,
что бы врубить режим предупреждений от компилятора на полную катушку,
и не игнорировать тревожные звоночки:
Код
warning: conversion to ‘unsigned int’ from ‘time_t {aka long int}’ may alter its value [-Wconversion]
     srand(time(NULL));
Цитата Сообщение от Helpdes Посмотреть сообщение
age++; // Увеличить эпоху
не нужно использовать постфикс там, где он не нужен.
должно быть:
C++
1
++age;
следующий цикл какой то бессмысленный:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int gameOver() // Проверяет, завершать ли игру, return 0 - игра продолжается, return 1 - игра завершается
{
    bool gameOv = true;
 
    for (int i = 0; i < 10; i++)
    {
        for (int j = 0; j < 10; j++)
        {
            if (gameOv == 1)
            {
                gameOv = false;
                break; // Живая клетка в мире есть 
            }
        }
    }
    ...
можно сразу сделать покороче:
C++
1
2
3
4
int gameOver() // Проверяет, завершать ли игру, return 0 - игра продолжается, return 1 - игра завершается
{
    bool gameOv = false;
    ...
соответственно, следующее условие избыточно:
C++
1
2
    if (gameOv == false)
    {
такое впечатление, что у тебя там баг какой то.

Цитата Сообщение от Helpdes Посмотреть сообщение
void updateStatus()
так и просит, что бы её отрефакторили/оптимизировали.

кстати, значения индексов массивов должно быть size_t,
а не int (см счетчики циклов)

Цитата Сообщение от Helpdes Посмотреть сообщение
system("cls");
сейчас у меня нет возможности запустить код,
и посмотреть как оно в живую,
но вот эта строчка слегка смущает:
точно не вызывает неприятного мерцания?
0
4055 / 3309 / 924
Регистрация: 25.03.2012
Сообщений: 12,451
Записей в блоге: 1
02.06.2019, 23:02 8
C++
1
2
3
4
5
6
7
  int lifeNeighbors = 0; // Количество живых соседей у живой клетки (максимум 8)
  for (x=i-1; x<=i+1; ++x)
    for (y=j-1; y<=j+1; ++y)
                if ((x!=i || y!=j) && world[x][y] == 1) 
                {
                    ++lifeNeighbors;
                }
Добавлено через 1 минуту
hoggy, что плохого в прибитии к виндоус, если даже гипотетически у меня не будет стоять ничего иного?
0
Эксперт С++
8738 / 4316 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
02.06.2019, 23:11 9
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
что плохого в прибитии к виндоус, если даже гипотетически у меня не будет стоять ничего иного?
что там у тебя - твоё личное дело.
ты уж как ни будь сам порешай, как тебе будет лучше.

а ежели для людей делать - нет причин на ровном месте прибиваться гвоздями к одной платформе,
и ограничивать аудиторию своих пользователей.
1
4055 / 3309 / 924
Регистрация: 25.03.2012
Сообщений: 12,451
Записей в блоге: 1
02.06.2019, 23:14 10
hoggy, ьысячи разработчиков игр для одной платформы смотрят на тебя с удивлением.
0
88 / 108 / 6
Регистрация: 16.04.2019
Сообщений: 451
Записей в блоге: 4
02.06.2019, 23:14 11
Использовал SDL2.
Миниатюры
Дайте критику коду, игра "Жизнь"  
Вложения
Тип файла: rar source.rar (2.5 Кб, 22 просмотров)
2
35 / 25 / 10
Регистрация: 08.02.2019
Сообщений: 158
02.06.2019, 23:17  [ТС] 12
IamLost, красивое оформление, триколор
0
Эксперт С++
8738 / 4316 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
02.06.2019, 23:19 13
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
ьысячи разработчиков игр для одной платформы смотрят на тебя с удивлением.
ты о себе что ли во множественном числе?

не то что бы я лично знаком с ыысячей разработчиков.
но не знаю ни одного серьёзного парня,
который цеплял бы нестандартные хедера без всякой на то необходимости.
0
1100 / 235 / 21
Регистрация: 20.05.2016
Сообщений: 1,068
Записей в блоге: 19
03.06.2019, 11:45 14
Недавно сам писал, вдруг пригодится.
Исходники открыты.
Клеточные автоматы ч.2 - Conway's Game of Life (С++ WinAPI)
0
03.06.2019, 11:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.06.2019, 11:45
Помогаю со студенческими работами здесь

Игра Жизнь
Ну, правила игры таковы: - если клетка пустая но имеет ровно 3 соседа (вообще их 8), там...

Игра жизнь
Помогите пожалуйста с решением. Код нужен на С++ «Жизнь» – компьютерная игра, придуманная...

Пожалуйста, дайте конструктивную критику на дизайн!
Всем здравствуйте! Учусь писать сайты, но, к сожалению, у меня проблемы с дизайном. Я могу сказать...

Оцените и дайте конструктивную критику сборке
Сделал свою первую сборку. Хочу узнать недостатки и исправить их. Корпус AeroCool Cruisestar...

Оцените будущую сборку и дайте конструктивную критику
Приветствую всех Нужна ваша помощь в подборе комплектующих для ПК, с основными моментами...

Игра 'Жизнь'
Доброго времени суток. Нужно создать программу на основе игры 'Жизнь', что именно нужно: Колония...

Игра Жизнь
Помогите реализовать игру &quot;Жизнь&quot; на C# в псевдотрехмерном варианте или может у кого то есть...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru