Форум программистов, компьютерный форум CyberForum.ru

"Жизнь" на C++ - C++

Восстановить пароль Регистрация
 
Kirr
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 4
27.08.2013, 22:48     "Жизнь" на C++ #1
Решил написать консольную версию популярной игры "Жизнь"(http://ru.wikipedia.org/wiki/%D0%96%...B3%D1%80%D0%B0))
field.h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
class field{   // игровое поле.
    unsigned char f[20][20];
public:
    field();// пустое поле
    field(const field& c);
    void set_living_cell(int str,int column);// задать живую клетку.
    void print();// вывод поля
    bool operator==(field c); // сравнение полей
    field &operator=(field c);
    void change();// рассчитать следующий ход
    bool check();// проверка на наличие живых клеток
};
field.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
#include"field.h"
#include<iostream>
field::field()
{
    for(int i = 0;i<20;i++)
        for(int j = 0;j<20;j++)
            f[i][j] = '+';
}
void field::set_living_cell(int str,int column)
{
    f[str][column] = '#';
}
bool field::operator==(field c)
{
    for(int i = 0;i<20;i++)
        for(int j = 0;j<20;j++)
            if(c.f[i][j]!=f[i][j]) return false;
    return true;
}
field::field(const field& c)
{
    for(int i = 0;i<20;i++)
        for(int j = 0;j<20;j++)
            f[i][j] = c.f[i][j];
}
field& field::operator=(field c)
{
    for(int i = 0;i<20;i++)
        for(int j = 0;j<20;j++)
            f[i][j] = c.f[i][j];
    return *this;
}
void field::print()
{
    for(int i = 0;i<20;i++)
    {
        std::cout<<'\n';
        for(int j = 0;j<20;j++)
            std::cout<<f[i][j];
    }
}
void field::change()
{
    for(int i = 0;i<20;i++)
        for(int j = 0;j<20;j++)// здесь отмечаются клетки, которые должны измениться
        {
            if(f[i][j]=='+')// '$' - будущая "живая" клетка, '+' - мертвая клетка
            {
                int k = 0;
                for(int q = i-1;q<=i+1;q++)
                    for(int m = j-1;m<=j+1;m++)
                    {
                        if(q<0||q>19||m<0||m>19) continue;
                        if(f[q][m]=='#'||f[q][m]=='-') k++;
                    }
                if(k==3) f[i][j] = '$';
            }
            if(f[i][j]=='#')// '-'- будущая "мертвая" клетка, '#' - живая клетка.
            {
                int k = 0;
                for(int q = i-1;q<=i+1;q++)
                    for(int m = j-1;m<=j+1;m++)
                        {
                            if(q<0||q>19||m<0||m>19) continue;
                            if(f[q][m]=='#'||f[q][m]=='-') k++;
                        }
                if(k<3||k>4) f[i][j] = '-';
            }
 
        }
        for(int i = 0;i<20;i++)// здесь отмеченные ранее клетки меняются.
        for(int j = 0;j<20;j++)
        {
            if(f[i][j]=='$') f[i][j]='#';
            if(f[i][j]=='-') f[i][j]='+';
        }
}
bool field::check()
{
    for(int i = 0;i<20;i++)
        for(int j = 0;j<20;j++)
        {if(f[i][j]=='#') return true;}
    return false;
}
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
#include<iostream>
#include<vector>
#include"field.h"
using namespace std;
int main()
{
    vector<field> c(1);
    int i,j,g,k=0;
    for(;;)// здесь пользователь вводит координаты живых клеток.
        {
            cout<<"press 1 for setting or 2 for start"<<endl;
    cin>>g;
    if(g==2) break;
        cout<<"set living cell: ";
    cin>>i>>j;
    c[0].set_living_cell(i,j);
        }
    system("cls");
    c[k].print();
    cin.get();
    for(;;)// здесь ведется расчет каждого поколения
    {
        cin.get();// задержка обновления, чтобы увидеть следующий ход, пользователь должен нажать любую клавишу.
        c.push_back(c[k]);
        k++;
        c[k].change();
        system("cls");
        c[k].print();
        if(!c[k].check()) {cout<<"There are no living cells";break;}// отсутствуют живые клетки
        for(int i = 0;i<k;i++)
            if(c[k]==c[i]) {cout<< "Repetion";goto loop;}// повтор предыдущей комбинации, выход из бесконечного цикла с помощью goto
    }
    loop:// метка
    cout<<'\n';
    system("pause");
    return 0;
}
Я новичок в C++, поэтому прошу людей, знающих этот язык, найти как можно больше ошибок(имеется в виду организация программы или оптимизация) и недочетов и помочь мне довести программу до идеала. Заранее спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
28.08.2013, 12:24     "Жизнь" на C++ #2
Цитата Сообщение от Kirr Посмотреть сообщение
class field{ // игровое поле. unsigned char f[20][20];
вместо чисел я бы использовал константы. если в будущем захочешь изменить размеры игрового поля, то придется поменять значение только в одном месте

Добавлено через 2 минуты
Цитата Сообщение от Kirr Посмотреть сообщение
goto loop;}// повтор предыдущей комбинации, выход из бесконечного цикла с помощью goto } loop:// метка
вместо меток для выхода из цикла лучше использовать оператор break;
Kirr
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 4
28.08.2013, 12:30  [ТС]     "Жизнь" на C++ #3
Цитата Сообщение от BigLow Посмотреть сообщение
вместо меток для выхода из цикла лучше использовать оператор break;
Как с помощью break выйти из вложенного цикла?
SatanaXIII
28.08.2013, 12:35
  #4

Не по теме:

Цитата Сообщение от Kirr Посмотреть сообщение
Как с помощью break выйти из вложенного цикла?
Обычно в таких моментах говорят о неправильном проектировании.

BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
28.08.2013, 12:42     "Жизнь" на C++ #5
Цитата Сообщение от Kirr Посмотреть сообщение
Как с помощью break выйти из вложенного цикла?
в любом месте написать
C++
1
break;
как в 30 строчке

А SatanaXIII прав. должен быть цикл с условием. в этом случае что-то вроде такого
C++
1
2
3
4
while (c[k].check())  // пока есть живые клетки, жизнь продолжается
{
 
}
Yandex
Объявления
28.08.2013, 12:42     "Жизнь" на C++
Ответ Создать тему
Опции темы

Текущее время: 21:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru