Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> реализация игры жизнь на паскале. реализация игры жизнь на паскале. 
:(
    Опции темы
Aljona19
Дата 15.4.2006, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 15.4.2006

Репутация: нет
Всего: нет



помогите реализовать следующий алгоритм на паскале (жедательно наиболее простейшим образом с использованием двух массивов, я очень много просидела за этим заданием но ничего не вышло, лчень надеюсь на вас: Игра происходит на бесконечном двумерном поле, состоящем из клеток квадратной формы. Каждая клетка имеет восемь соседей: четырех с общей стороной и четырех с общим углом.

Перед началом эволюции создается начальная колония фишек. Для этого на выбранные клетки поля ставятся фишки. Все фишки равнозначны и одинаковы. Начальная колония называется нулевым поколением.

Дальнейшая игра происходит по шагам. Каждый шаг состоит в том, что из n-го поколения в результате эволюции формируется (n+1)-е поколение. Для этого к каждой клетке поля применяются три правила:

Гибель от одиночества Если на клетке есть фишка, и на соседних клетках менее двух фишек, то фишка гибнет (снимается с поля).
Гибель от перенаселения Если на клетке есть фишка, и на соседних клетках более трех фишек, то фишка гибнет (снимается с поля).
Рождение Если на клетке нет фишки, и на соседних клетках ровно три фишки, то на клетке рождается фишка (ставится на поле).
Правила применяются одновременно ко всем клеткам, поэтому рождение или смерть фишек не влияет на применение правил к другим клеткам на том же шаге. После применения правил на поле образуется следующее поколение колонии.

Игра заканчивается в одном из следующих случаев:

Если в очередном поколении нет ни одной фишки (колония погибла);
Если очередное поколение совпадает с одним из предыдущих (колония превратилась в периодическую);
Частный случай предыдущего: очередное поколение совпадает с предыдущим (статическая колония).

PM MAIL   Вверх
Тьма
Дата 15.4.2006, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 339
Регистрация: 22.1.2005
Где: Украина, Винница

Репутация: нет
Всего: 4



в книге Немнюгина по паскалю, не помню как называется точно есть реализация этой задачи


--------------------
Vir magni ingenii                 
PM MAIL ICQ   Вверх
Aljona19
Дата 15.4.2006, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 15.4.2006

Репутация: нет
Всего: нет



спасибо за информацию, но к сожалению не могу найти книжку, будьте добры если у кого-то есть информация, поделитесь...
PM MAIL   Вверх
darkart
Дата 16.4.2006, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 9.11.2005

Репутация: 26
Всего: 31



Лови...
Код

program Life;
const
  n=4;{размерность матрицы}
  MAXSTEP=1000;{максимальное кол-во поколений}
type
  TMatrix=array[1..n,1..n] of boolean;{описание типа матрицы}
  TFile=file of TMatrix;{описание типа файла содержащего матрицы}
function FileExists(strFileName:string):boolean;
var
  f:File;{файловая переменная}
begin
  {$I-}
  assign(f,strFileName);{связывание файловой переменной с файлом с именем strFileName}
  reset(f);{позиция - на начало файла}
  close(f);{закрываем файл}
  {$I+}
  FileExists:=(IOResult=0) and (strFileName<>'');{анализ ошибки}
end;
procedure CreateNullMatrix(var Matrix:TMatrix);
{ф-ция создания матрицы пустого поля}
var
  i,j:integer;{i,j - счетчики}
begin
  for i:=1 to n do{для каждой строки}
    for j:=1 to n do{для каждого элемента строки}
      Matrix[i,j]:=false;{заполнение матрицы-поля}
end;
procedure CreateRandomMatrix(var Matrix:TMatrix);
{процедура создания случайной матрицы-поля}
var
  i,j:integer;{i,j - счетчики}
begin
  for i:=1 to n do{для каждой строки}
    for j:=1 to n do{для каждого элемента строки}
      Matrix[i,j]:=random(2)=1;{заполнение матрицы-поля}
end;
procedure InputMatrix(var Matrix:TMatrix);
{процедура ввода матрицы}
var
  i,j:integer;{i,j - счетчики}
  ch:char;{вспомогательная переменная}
begin
  for i:=1 to n do{для каждой строки}
  begin
    for j:=1 to n-1 do{для каждого элемента строки, кроме последнего}
    begin
      read(ch);{читаем символ}
      Matrix[i,j]:=ch='*';{если, символ-*, то присваеваем true, иначе false}
    end;
    readln(ch);{читаем символ и переводим каретку на начало новой строки}
    Matrix[i,n]:=ch='*';{если, символ-*, то присваеваем true, иначе false}
  end;
end;
procedure PrintMatrix(var Matrix:TMatrix);
{процедура печати матрицы}
var
  i,j:integer;{i,j - счетчики}
begin
  for i:=1 to n do{для каждой строки}
  begin
    for j:=1 to n-1 do{для каждого элемента строки, кроме последнего}
    begin
      if Matrix[i,j] then write('*'){если Matrix[i,j]=true, то печатаем *}
      else write(' ');{иначе печатаем ' '}
    end;
    if Matrix[i,n] then writeln('*'){если Matrix[i,n]=true, то печатаем *}
    else writeln(' ');{иначе печатаем ' ' и переводим каретку на новую строку}
  end;
end;
procedure InputMatrixFromFile(var Matrix:TMatrix;strFileName:string);
{процедура ввода матрицы из файла, файл - текстовый(n-строк по n-символов в строке)}
var
  i,j:integer;{i,j - счетчики}
  f:text;{файловая переменная}
  strTemp:string[n];{вспомогательная переменная, для чтения строки файла}
begin
  assign(f,strFileName);{связывание файловой переменной с файлом с именем strFileName}
  reset(f);{открытие для чтения, позиция - на начало файла}
  for i:=1 to n do{для каждой строки}
  begin
    readln(f,strTemp);{читаем строку из файла}
    for j:=1 to n do{для каждого элемента строки}
      Matrix[i,j]:=strTemp[j]='*';{присваеваем Matrix[i,j] true, если элемент строки = *}
  end;
  close(f);{закрываем файл}
end;
procedure PrintMatrixToFile(var Matrix:TMatrix;strFileName:string);
{процедура печати матрицы в файл}
var
  i,j:integer;{i,j - счетчики}
  f:text;{файловая переменная}
begin
  assign(f,strFileName);{связывание файловой переменной с файлом с именем strFileName}
  rewrite(f);{открытие для записи}
  for i:=1 to n do{для каждой строки}
  begin
    for j:=1 to n do{для каждого элемента строки}
      if Matrix[i,j] then write(f,'*'){если Matrix[i,j]=true, то пишем в файл '*',}
      else write(f,' ');{иначе пишем ' '}
    writeln(f);{переход на новую строку в файле}
  end;
  close(f);{закрываем файл}
end;
procedure AddMatrixToFile(var Matrix:TMatrix;strFileName:string);
{процедура добавления положения поля в файл}
var
  f:TFile;{файловая переменная}
begin
  assign(f,strFileName);{связывание файловой переменной с файлом с именем strFileName}
  if FileExists(strFileName) then{если файл существует}
    reset(f){позиция - на начало файла}
  else{иначе}
    rewrite(f);{перезапись файла}
  Seek(f,FileSize(f));{мотаем на конец файла}
  write(f,Matrix);{пишем матрицу в файл}
  close(f);{закрываем файл}
end;
function EqualityMatrixes(var Matrix1,Matrix2:TMatrix):boolean;
{функция проверки матриц Matrix1 и Matrix2 на равенство}
var
  bol:boolean;{вспомогательная переменная}
  i,j:integer;{i,j - счетчики}
begin
  i:=1;{инициализация номера строки}
  repeat
    j:=1;{инициализация номера элемента строки}
    repeat
      bol:=Matrix1[i,j]=Matrix2[i,j];{bol равен равенству Matrix1[i,j] и Matrix2[i,j]}
      inc(j);{увеличение счетчика}
    until (j>n) or not bol;
    {выход из цикла, если вышли за границу строки или нашли несовпадение элементов}
    inc(i);{увеличение счетчика}
  until (i>n) or not bol;
  {выход из цикла, если вышли за границу количества строк или нашли несовпадение элементов}
  EqualityMatrixes:=bol;{возврат знвчения}
end;
function CheckGameOver(var Matrix,NullMatrix:TMatrix;strFileName:string):boolean;
{ф-ция проверки окончания игры}
var
  bol:boolean;{вспомогательная переменная}
  f:TFile;{файловая переменная}
  tmpMatrix:TMatrix;{tmpMatrix - для чтения из файла}
begin
  bol:=false;{инициализация}
  assign(f,strFileName);{связывание файловой переменной с файлом с именем strFileName}
  reset(f);{позиция - на начало файла}
  while not eof(f) and not bol do{пока не конец файла и не bol}
  begin
    read(f,tmpMatrix);{чтение очередной матрицы из файла}
    bol:=EqualityMatrixes(Matrix,tmpMatrix);{bol равен равенству матриц Исходной и Прочитанной}
  end;
  close(f);{закрываем файл}
  CheckGameOver:=bol or EqualityMatrixes(Matrix,NullMatrix);
  {результат равен или bol или равенству исходной матрицы пустому полю}
end;
function GetNum(var Matrix:TMatrix;i,j:integer):byte;
{ф-ция возвращает 1, если Matrix[i,j]=true, и 0, если выход за границы матрицы или Matrix[i,j]=false}
begin
  if (i>=1) and (i<=n) and (j>=1) and (j<=n) then{проверка выхода за грвницы матрицы}
  begin
    if Matrix[i,j] then{если в клетке жизнь}
      GetNum:=1{возвращаем 1}
    else{иначе}
      GetNum:=0;{возвращаем 0}
  end
  else GetNum:=0;{возвращаем 0, т.к. вышли за границы}
end;
procedure GetNextGeneration(var Matrix:TMatrix;var step:integer);
{процедура получения следующего поколения}
var
  i,j,num:integer;{i,j - счетчики, num - кол-во жизней вокруг клетки}
  tmpMatrix:TMatrix;
begin
  for i:=1 to n do
    for j:=1 to n do
    begin
      num:=0;{инициализация}
      {далее вычисляем кол-во живых клеток вокруг данной}
      num:=num+GetNum(Matrix,i,j-1);{лево}
      num:=num+GetNum(Matrix,i+1,j-1);{левый верхний угол}
      num:=num+GetNum(Matrix,i+1,j);{верх}
      num:=num+GetNum(Matrix,i+1,j+1);{правый верхний угол}
      num:=num+GetNum(Matrix,i,j+1);{право}
      num:=num+GetNum(Matrix,i-1,j+1);{нижний правый угол}
      num:=num+GetNum(Matrix,i-1,j);{низ}
      num:=num+GetNum(Matrix,i-1,j-1);{нижний левый угол}
      if Matrix[i,j] and ((num<2)or(num>3)) then
      {если в клетке жизнь и кло-во соседей<2 или >3 то убийство}
        tmpMatrix[i,j]:=false{убили...:)}
      else if not Matrix[i,j] and (num=3) then{если пусто и кол-во соседей = 3, то рождение}
             tmpMatrix[i,j]:=true{рождение}
           else tmpMatrix[i,j]:=Matrix[i,j];{иначе - прежнее состояние}
    end;
  {далее копирование матрицы в исходную}
  for i:=1 to n do
    for j:=1 to n do
      Matrix[i,j]:=tmpMatrix[i,j];
  inc(step);{увеличение шага}
end;
var
  ch:char;{для выбора в меню}
  f:TFile;{файловая переменная}
  step:integer;{информация о шаге}
  Matrix,NullMatrix:TMatrix;{матрица-поле}
  strFileNameSource,strFileNameResult,strFileNameTemp:string;
  {strFileNameSource - имя исходного файла, strFileNameResult - имя файла результата,
   strFileNameTemp - имя вспомогательного файла}
begin
  CreateNullMatrix(NullMatrix);{создание матрицы - пустое поле}
  randomize;{инициализация генератора случайных чисел}
  {печать меню}
  writeln('Please choode your choice:');
  writeln('1)Create random Matrix...');
  writeln('2)Input Matrix...');
  writeln('3)Load Matrix fromfile...');
  writeln('Q)Exit.');
  readln(ch);
  case UpCase(ch) of
    '1':CreateRandomMatrix(Matrix);{создание случайной матрицы}
    '2':
    begin
      writeln('Please enter matrix(',n,'x',n,', *-life, else - no life):');
      InputMatrix(Matrix);{ввод матрицы}
    end;
    '3':
    begin
      writeln('Please enter a source file name:');
      readln(strFileNameSource);
      InputMatrixFromFile(Matrix,strFileNameSource);{ввод из файла}
    end;
    'Q':;{ничего не делаем}
    else
    begin
      writeln('Invalid choice. Please enter to exit.');
      readln;
      ch:='Q';
    end;
  end;
  if UpCase(ch)<>'Q' then
  begin
    step:=0;{начальное положение - нулевой шаг}
    writeln('Please enter a result file name:');
    readln(strFileNameResult);
    writeln('Please enter a temporally file name:');
    readln(strFileNameTemp);
    assign(f,strFileNameTemp);{связывание файловой переменной с файлом с именем strFileName}
    rewrite(f);{перезапись файла}
    close(f);{закрываем файл}
    writeln('Source matrix:');
    PrintMatrix(Matrix);{печать исходной матрицы}
    repeat
      AddMatrixToFile(Matrix,strFileNameTemp);{добавляем матрицу в файл}
      GetNextGeneration(Matrix,step);{генерируем следующее поколение}
      writeln(step,' generation: ');
      PrintMatrix(Matrix);{печатаем текущее поколение}
      if CheckGameOver(Matrix,NullMatrix,strFileNameTemp) then ch:='Q'
      else
      begin
        writeln('Please choose you choice(Q-exit, else - next generation):');
        readln(ch);{Q-выход, иначе все сначала}
      end;
    until (UpCase(ch)='Q') or (step>=MAXSTEP);
    writeln('The game is over. Step=',step,'.');
    PrintMatrixToFile(Matrix,strFileNameResult);{печать результата в файл}
    readln;
  end;
end.

P.S.: Ночь, не проверял, если что не так пиши
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0452 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.