//// //// Commands for the support of Conway-style ALife Games //// //// To define a new game, implement the command shouldTurnOn? //// //// Warren Sack //// January 2003 //// set NumberOfRows 25 set NumberOfColumns 25 set SquareWidth 4 set SquareHeight 4 set OnColor 0 set OffColor 100 set ProgressBar 0 set ProgessBarColor 50 number row Square { value ((Square - 1) / NumberOfColumns) } number column Square { value ((Square - 1) % NumberOfColumns) } command paintSquare Square Color { set Row set Column set LeftPixel (SquareWidth * Column) set BottomPixel (SquareHeight * Row) repeat X 0 (SquareWidth - 1) { repeat Y 0 (SquareHeight - 1) { set [(LeftPixel + X) (BottomPixel + Y)] Color } } } command turnOn Square { paintSquare Square OnColor } command turnOff Square { paintSquare Square OffColor } number colorOfSquare Square { value } number isOn? Square { set Result 0 same? 1 { set Result 1 } value Result } number isOff? Square { set Result 0 same? 0 { set Result 1 } value Result } number north Square { set Row set Column set ResultRow (Row + 1) same? ResultRow NumberOfRows { set ResultRow 0 } value ((ResultRow * NumberOfColumns) + Column + 1) } number south Square { set Row set Column set ResultRow (Row - 1) same? Row 0 { set ResultRow (NumberOfRows - 1) } value ((ResultRow * NumberOfColumns) + Column + 1) } number east Square { set Row set Column set ResultColumn (Column + 1) same? ResultColumn NumberOfColumns { set ResultColumn 0 } value ((Row * NumberOfColumns) + ResultColumn + 1) } number west Square { set Row set Column set ResultColumn (Column - 1) same? Column 0 { set ResultColumn (NumberOfColumns - 1) } value ((Row * NumberOfColumns) + ResultColumn + 1) } number northwest Square { value > } number northeast Square { value > } number southwest Square { value > } number southeast Square { value > } // // This version of shouldTurnOn? turns off all of the squares that are on; and turns on // all of the squares that are off; you will need to implement something different in // order for petri.dbn to work like the Resnick and Silverman "Seeds" game. // number shouldTurnOn? Square { set Result 0 same? 1 { set Result 1 } value Result } command nextStateOfRow Row StartIndex { set Square (1 + (Row * NumberOfColumns)) set Index StartIndex repeat Column 0 (NumberOfColumns - 1) { set set Square (Square + 1) set Index (Index + 1) } } command updateRow Row StartIndex { set Square (1 + (Row * NumberOfColumns)) set Index StartIndex repeat Column 0 (NumberOfColumns - 1) { set set Square (Square + 1) set Index (Index + 1) } } command repaint { paper OffColor refresh pen ProgessBarColor line 100 0 100 ProgressBar repeat Square 1 (NumberOfRows * NumberOfColumns) { same? (Square % NumberOfRows) 0 { set ProgressBar (ProgressBar + 2) pen ProgessBarColor line 100 0 100 ProgressBar } same? 1 { turnOn Square } } } command initialize { // repeat Square 1 (NumberOfRows * NumberOfColumns) // { // set 0 // } paper OffColor set Square 610 set 1 turnOn Square set EastSquare set 1 turnOn EastSquare set SouthwestSquare set 1 turnOn SouthwestSquare set EastSoutheastSquare > set 1 turnOn EastSoutheastSquare set Square 320 set 1 turnOn Square set Square 51 set 1 turnOn Square set EastNortheastSquare > set 1 turnOn EastNortheastSquare set SouthSquare set 1 turnOn SouthSquare set EastSoutheastSouthSquare >> set 1 turnOn EastSoutheastSouthSquare } initialize forever { set IndexAfterLastRow ((NumberOfRows * NumberOfColumns) + 1) nextStateOfRow (NumberOfRows - 1) IndexAfterLastRow nextStateOfRow 0 (IndexAfterLastRow + NumberOfColumns) set ProgressBar 0 repeat Y 1 (NumberOfRows - 2) { set ProgressBar (ProgressBar + 2) pen ProgessBarColor line 100 0 100 ProgressBar set Offset (1 + (Y % 2)) set LastOffset 2 same? Offset 2 { set LastOffset 1 } nextStateOfRow Y (IndexAfterLastRow + (Offset * NumberOfColumns)) updateRow (Y - 1) (IndexAfterLastRow + (LastOffset * NumberOfColumns)) } updateRow (NumberOfRows - 2) (IndexAfterLastRow + (Offset * NumberOfColumns)) updateRow (NumberOfRows - 1) IndexAfterLastRow repaint }