Компьютерное моделирование 2017-2018 учебный год Лабораторная работа 8 Активная среда клеточных автоматов
Пример 1. Программа в IDE Lazarus
const L = 19; M = 22; MAX_COLOR = 16777215; BRUSH_CL = clBlack; PEN_COLOR = clWhite; CURVE_COLOR = clLime; RUN_COLOR = $0000FF; // Red LOCK_COLOR = $00FF00; // Green READY_COLOR = $FF0000; // Blue W_CELL = 15; H_CELL = 10; H_SPACE = 2; V_SPACE = 4; W_AREA = (L+2)*W_CELL; H_AREA = (M+2)*H_CELL; var N, C : array [0..L+1, 0..M+1] of single; col, row : Integer; procedure TForm1.Button1Click(Sender: TObject); var i, j : Integer; begin Memo1.Clear; for i := 2 to L-1 do begin for j := 2 to M-1 do begin Image1.Canvas.Brush.Color := 0; Image1.Canvas.Rectangle(i*(W_CELL + H_SPACE), j*(H_CELL + V_SPACE), i*(W_CELL + H_SPACE) + W_CELL, j*(H_CELL + V_SPACE) + H_CELL); end; end; for i := 2 to L-1 do begin for j := 2 to M-1 do begin Image2.Canvas.Brush.Color := 0; Image2.Canvas.Rectangle(i*(W_CELL + H_SPACE), j*(H_CELL + V_SPACE), i*(W_CELL + H_SPACE) + W_CELL, j*(H_CELL + V_SPACE) + H_CELL); end; end; end; // Step procedure TForm1.Button2Click(Sender: TObject); var colorCell : Integer; numCellStep : Integer; numStep : Integer; i, j : Integer; colRnd : Integer; begin numCellStep := StrToInt(Edit4.Text); for numStep := 1 to numCellStep do begin Inc(col); if (col > L+1) then begin col := 0; Inc(row); end; if (row > M+1) then begin row := 0; end; if (N[col, row] = 0) and ((N[col-1, row] = 2) or (N[col+1, row] = 2)) then C[col, row] := 2; if (N[col, row] > 0) then C[col, row] := N[col, row] - 1; // RUN_COLOR = $0000FF; // Red // LOCK_COLOR = $00FF00; // Green // READY_COLOR = $FF0000; // Blue if (N[col, row] = 0) then Image1.Canvas.Brush.Color := READY_COLOR; if (N[col, row] = 1) then Image1.Canvas.Brush.Color := LOCK_COLOR; if (N[col, row] = 2) then Image1.Canvas.Brush.Color := RUN_COLOR; Image1.Canvas.Rectangle(col*(W_CELL + H_SPACE), row*(H_CELL + V_SPACE), col*(W_CELL + H_SPACE) + W_CELL, row*(H_CELL + V_SPACE) + H_CELL); if (C[col, row] = 0) then Image2.Canvas.Brush.Color := READY_COLOR; if (C[col, row] = 1) then Image2.Canvas.Brush.Color := LOCK_COLOR; if (C[col, row] = 2) then Image2.Canvas.Brush.Color := RUN_COLOR; Image2.Canvas.Rectangle(col*(W_CELL + H_SPACE), row*(H_CELL + V_SPACE), col*(W_CELL + H_SPACE) + W_CELL, row*(H_CELL + V_SPACE) + H_CELL); // Memo1.Append(FloatToStr(N[col, row])); Memo1.Append('N : ' + IntToStr(col)+' : '+IntToStr(row)+' : '+ FloatToStr(N[col, row])); Memo1.Append('C : ' + IntToStr(col)+' : '+IntToStr(row)+' : '+ FloatToStr(C[col, row])); if (col = 0) and (row = 0) then begin colRnd := Random(M); for i := 0 to L+1 do begin for j := 0 to M+1 do begin N[i, j] := C[i, j]; // if (i = colRnd) then N[i, j] := 2; if (i = StrToInt(Edit5.Text)) then N[i, j] := 2; end; end; end; //if (col = 0) and (row = 0) Edit1.Text := IntToStr(col); Edit2.Text := IntToStr(row); Memo1.Append(IntToStr(col)+' : '+IntToStr(row)+' : '+ '$' + IntToHex(Image2.Canvas.Brush.Color, 6)); end; end; procedure TForm1.FormCreate(Sender: TObject); var i, j : Integer; colorCell : Integer; begin Image1.Canvas.Pen.Width:=0; with Image1 do begin Canvas.Brush.Color := BRUSH_CL; Canvas.Brush.Style := bsSolid; Canvas.Pen.Style := psClear; Canvas.Pen.Color := PEN_COLOR; Canvas.Rectangle(0, 0, W_AREA, H_AREA); end; with Image2 do begin Canvas.Brush.Color := BRUSH_CL; Canvas.Brush.Style := bsSolid; Canvas.Pen.Style := psClear; Canvas.Pen.Color := PEN_COLOR; Canvas.Rectangle(0, 0, W_AREA, H_AREA); end; with Image3 do begin Canvas.Brush.Color := RUN_COLOR; Canvas.Brush.Style := bsSolid; Canvas.Pen.Style := psClear; Canvas.Pen.Color := PEN_COLOR; Canvas.Rectangle(0, 0, Width, Height); end; with Image4 do begin Canvas.Brush.Color := LOCK_COLOR; Canvas.Brush.Style := bsSolid; Canvas.Pen.Style := psClear; Canvas.Pen.Color := PEN_COLOR; Canvas.Rectangle(0, 0, Width, Height); end; with Image5 do begin Canvas.Brush.Color := READY_COLOR; Canvas.Brush.Style := bsSolid; Canvas.Pen.Style := psClear; Canvas.Pen.Color := READY_COLOR; Canvas.Rectangle(0, 0, Width, Height); end; col := 0; row := 0; Edit1.Text := IntToStr(col); Edit2.Text := IntToStr(row); Edit3.Text := IntToStr(MAX_COLOR); colorCell := Round(StrToInt(Edit3.Text)*Random); Memo1.Append(IntToStr(col)+' : '+IntToStr(row)+' : '+IntToStr(colorCell)); for i := 0 to L+1 do begin for j := 0 to M+1 do begin N[i, j] := 0; if i = 3 then N[i, j] := 2; if i = 2 then N[i, j] := 1; if i = (L div 2) then N[i, j] := 2; end; end; for i := 1 to L do begin for j := 1 to M do begin if (N[i, j] = 0) and ((N[i-1, j] = 2) or (N[i+1, j] = 2)) then C[i, j] := 2; if (N[i, j] > 0) then C[i, j] := N[i, j] - 1; end; end; for i := 0 to L+1 do begin for j := 0 to M+1 do begin // RUN_COLOR = $0000FF; // Red // LOCK_COLOR = $00FF00; // Green // READY_COLOR = $FF0000; // Blue if (N[i, j] = 0) then Image1.Canvas.Brush.Color := READY_COLOR; if (N[i, j] = 1) then Image1.Canvas.Brush.Color := LOCK_COLOR; if (N[i, j] = 2) then Image1.Canvas.Brush.Color := RUN_COLOR; Image1.Canvas.Rectangle(i*(W_CELL + H_SPACE), j*(H_CELL + V_SPACE), i*(W_CELL + H_SPACE) + W_CELL, j*(H_CELL + V_SPACE) + H_CELL); if (C[i, j] = 0) then Image2.Canvas.Brush.Color := READY_COLOR; if (C[i, j] = 1) then Image2.Canvas.Brush.Color := LOCK_COLOR; if (C[i, j] = 2) then Image2.Canvas.Brush.Color := RUN_COLOR; Image2.Canvas.Rectangle(i*(W_CELL + H_SPACE), j*(H_CELL + V_SPACE), i*(W_CELL + H_SPACE) + W_CELL, j*(H_CELL + V_SPACE) + H_CELL); end; end; end;
Пример 2. Среда моделирования Powder, скрипт Lua
tpt.set_console(0) sim.gravityMode(1) left = 20 top = 230 max_col = 10 max_row = 10 step1 = 1 tpt.el.hygn.diffusion=0 for row = 0, max_col do for col = 0, max_row do tpt.create(left+col*step1,top+row*step1, "HYGN") end end left = 50 top = 230 for row = 0, max_col do for col = 0, max_row do tpt.create(left+col*step1,top+row*step1, "PLNT") end end
Упражнения
1. Допишите программу из примера 1 так, чтобы при нажатии на кнопку Start заполнялись все ячейки обеих матриц. Настройте в программе по своему усмотрению: размеры ячеек, их количество в матрице, расстояние между ячейками, цвета, обозначающие состояния покоя (Ready), возбуждения (Run) и рефрактерности (Lock). 2. Дополните программу из примера 1 таймером, чтобы при нажатии на кнопку Start по таймеру каждую секунду, или заданный интервал времени, заполнялись обе матрицы. Добавьте кнопки Пауза и Стоп для временной и полной остановки моделирования. 3. Разработайте аналогичный примеру 1 скрипт на языке Lua для среды моделирования Powder. 4. Разработайте аналогичный примеру 1 скрипт для среды моделирования Algodoo. 5. По образцу примера 1 напишите программу на OpenOffice Basic для программы OpenOffice Calc.