Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.12.2011, 23:38   #1
pashka_dos
Пользователь
 
Аватар для pashka_dos
 
Регистрация: 19.11.2011
Сообщений: 83
Сообщение Задача интересная, но решить не могу

привет всем помогите решить задачку
Игра "Жизнь" допустим есть таблица 4 на 4в ячейках этой таблици может быть * и - (живая клетка и пустота соответственно) нужно составить программу которая по заданому поколению прослеживает следующие поколения.Клетка выживает только тогда если у неё 2 или 3 соседа.

например:
1-е поколение

*---
-**-
***-
----

2-е поколение

----
--*-
*-*-
---- и т.д.

программу составил но работает неправильно
у меня:
1-е
--*-
**-*
----
**-*

2-е
--*-
----
----
----

хотя должно быть так
--*-
-*--
----
----

посмотрите, пожалуйста, код и скажите что не так


Код:
program pokolenia;
uses crt;
var m: array [1..6,1..6] of char; //массив 6 на 6,но учавствовать будет только 4х4, для того что-бы i-1=1, при i=2 
    i,j,k,y,n:integer;//счётчики, y-сосед n-несосед колличество
begin
clrscr;
randomize;

for i:=1 to 6 do
    for j:=1 to 6 do
        m[i,j]:='^';

for i:=2 to 5 do
    for j:=2 to 5 do
        if random(2) = 1 then m[i,j]:='*'  //Живая клетка
                         else m[i,j]:='-'; //Мёртвая клетка


k:=1;


for k:=1 to 3 do //будет 3 поколения
      begin

           for i:=2 to 5 do
               for j:=2 to 5 do
                   if m[i,j] = 'D' then m[i,j]:='-';// - утичтожыть клетку

           for i:=2 to 5 do
               begin
                    for j:=2 to 5 do write(m[i,j]:3);//вывод на экран
                    writeln;
               end;

           for i:=2 to 5 do
               for j:=2 to 5 do
                   begin
                        if m[i,j] = '*' then
                        begin//проверяем всех соседей

                        y:=0; n:=0;

                        if m[i-1,j-1] = '*' then inc(y);
                        if m[i-1,j-1] = '-' then inc(n);

                        if m[i-1,j] = '*' then inc(y);
                        if m[i-1,j] = '-' then inc(n);

                        if m[i-1,j+1] = '*' then inc(y);
                        if m[i-1,j+1] = '-' then inc(n);

                        if m[i,j+1] = '*' then inc(y);
                        if m[i,j+1] = '-' then inc(n);

                        if m[i+1,j+1] = '*' then inc(y);
                        if m[i+1,j+1] = '-' then inc(n);

                        if m[i+1,j] = '*' then inc(y);
                        if m[i+1,j] = '-' then inc(n);

                        if m[i+1,j-1] = '*' then inc(y);
                        if m[i+1,j-1] = '-' then inc(n);

                        if m[i,j-1] = '*' then inc(y);
                        if m[i,j-1] = '-' then inc(n);

                        {writeln('Для элемента ',i-1,' ',j-1,' соседей - ',y,' несоседей - ',n);}

                        if (y <> 2) and (y <> 3) then m[i,j]:='D';
                        end;
                   end;

           writeln;
           writeln;        
      end;
readln;
end.
pashka_dos вне форума Ответить с цитированием
Старый 27.12.2011, 01:28   #2
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

вы помечаете клетку для удаления символом 'D' и при просмотре следующей - помеченная считается не живой, т.к. не равна '*' ...
проверяйте на равенство '*' или 'D' при подсчете количества живых клеток вокруг, и зачем вам подсчитывать пустоту вокруг?
на неконкретные вопросы даю неконкретные ответы ...
Step_UA вне форума Ответить с цитированием
Старый 27.12.2011, 01:41   #3
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

генерацию новых поколений, имхо, удобней делать в новом массиве, после чего менять массивы местами.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 27.12.2011, 06:39   #4
Zer0
Форумчанин
 
Аватар для Zer0
 
Регистрация: 13.12.2007
Сообщений: 788
По умолчанию

veniside, не обязательно, можно поле представлять как массив класса "Клетка" (например когда я делал 3D-версию игры класс у меня был такой:
Код:
Live:boolean;
Born,Dead:boolean;
соответственно на каждой итерации работа сначала шла с идентификаторами Born,Dead (обозначение что в этой клетке на итерации должна родиться или умереть) и после уже в соответствии с ними менялсмя основной массив
благодарность - сюда (не забываем писать от кого)
Zer0 вне форума Ответить с цитированием
Старый 27.12.2011, 15:01   #5
pashka_dos
Пользователь
 
Аватар для pashka_dos
 
Регистрация: 19.11.2011
Сообщений: 83
Сообщение

Цитата:
Сообщение от Step_UA Посмотреть сообщение
вы помечаете клетку для удаления символом 'D' и при просмотре следующей - помеченная считается не живой, т.к. не равна '*' ...
проверяйте на равенство '*' или 'D' при подсчете количества живых клеток вокруг, и зачем вам подсчитывать пустоту вокруг?
спасибо за ответ, пустоту вокруг я не подсчитываю т.к она не попадает в эти условия

Код:
if m[i-1,j-1] = '*' then inc(y);
                        if m[i-1,j-1] = '-' then inc(n);

                        if m[i-1,j] = '*' then inc(y);
                        if m[i-1,j] = '-' then inc(n);

                        if m[i-1,j+1] = '*' then inc(y);
                        if m[i-1,j+1] = '-' then inc(n);

                        if m[i,j+1] = '*' then inc(y);
                        if m[i,j+1] = '-' then inc(n);

                        if m[i+1,j+1] = '*' then inc(y);
                        if m[i+1,j+1] = '-' then inc(n);

                        if m[i+1,j] = '*' then inc(y);
                        if m[i+1,j] = '-' then inc(n);

                        if m[i+1,j-1] = '*' then inc(y);
                        if m[i+1,j-1] = '-' then inc(n);

                        if m[i,j-1] = '*' then inc(y);
                        if m[i,j-1] = '-' then inc(n);
pashka_dos вне форума Ответить с цитированием
Старый 27.12.2011, 15:20   #6
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

Цитата:
Сообщение от pashka_dos Посмотреть сообщение
... пустоту вокруг я не подсчитываю т.к она не попадает в эти условия
пустые или по вашему мертвые клетки обозначаемые '-' подсчитываете в переменной n, значение которой нигде не используется ...
на неконкретные вопросы даю неконкретные ответы ...
Step_UA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
нужна решенная задача, сдавать завтра, а решить не могу((( лесяя Паскаль, Turbo Pascal, PascalABC.NET 0 09.06.2011 22:50
интересная задача Знаменок Паскаль, Turbo Pascal, PascalABC.NET 0 05.10.2010 13:26
Есть интересная задачка по Delphi!! Кто сможет решить? St1mkA Помощь студентам 2 04.10.2009 19:00
Интересная задача terminadoor Помощь студентам 1 06.02.2009 20:00