
Опытный
 
Профиль
Группа: Участник
Сообщений: 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.: Ночь, не проверял, если что не так пиши
|