Jump to content

Recommended Posts

Posted

The Game of Life, despite its name, is not a game in the traditional sense. It is a cellular automaton, a mathematical model where each state mechanically transitions to the next based on predefined rules. Invented in 1970 by mathematician John Horton Conway, then a professor at the University of Cambridge, this concept has become a cornerstone in the study of dynamic systems.

You will need: AutoItObject  😉

The Rules of Conway's Game of Life

The Game of Life is based on a grid of cells, each of which can be in one of two states: alive (1) or dead (0). At each iteration, the state of every cell is updated simultaneously according to four simple rules:

  1. Birth: A dead cell becomes alive if it is surrounded by exactly three living cells.
  2. Survival: A living cell remains alive if it is surrounded by two or three living cells.
  3. Overpopulation: A living cell dies if it is surrounded by more than three living cells.
  4. Isolation: A living cell dies if it is surrounded by fewer than two living cells.

These rules simulate dynamics akin to those observed in biological systems while generating complex behaviors from simple initial configurations.


History and Popularity

Conway's Game of Life was first introduced to the public in 1970 through the famous “Mathematical Games” column (or “Recreational Mathematics”) by Martin Gardner, published in Scientific American (and its French translation in Pour la Science). According to Gardner, this invention quickly brought Conway fame and opened a new field of mathematical research: cellular automata.

By simulating the development, decline, and mutations of a colony of cells, the Game of Life evokes biological processes while introducing emergent complexity from simple rules. Conway experimented with several sets of rules for cell birth, death, and survival before finding a configuration where the population neither grows uncontrollably nor stagnates, while still allowing for the emergence of fascinating structures.

Some of these include:

  • The glider, a structure that moves across the grid.
  • The glider guns, which generate continuous streams of gliders.

These discoveries captivated researchers and enthusiasts, particularly in the 1970s and 1980s, when the rise of minicomputers made automated simulations possible. By the 1990s, the growth of the Internet and the increasing power of computers allowed for the discovery of new structures, further revitalizing interest in Conway's Game of Life.


Modern Applications and Legacy

Conway's Game of Life has applications that go beyond recreational mathematics. It serves as a conceptual tool for exploring emergent systems and self-organization, influencing fields like:

  • Computer science: Used to model distributed systems and parallel processing.
  • Biology: Helps simulate population dynamics and ecological systems.
  • Physics: Provides insights into phase transitions and other phenomena.

The Game of Life remains a timeless exploration of how simple rules can lead to complex and beautiful patterns, offering profound lessons for both science and technology.

Personally, using this principle, I have developed data protection systems for businesses, visualized fractal geometry equations, and simulated the evolution of molecules and atoms, among many other applications. This perfectly illustrates the foundational concept that computers operate on binary logic: 0s and 1s. From these two states, an infinite variety of complex systems and phenomena can be modeled, analyzed, and understood.

image.png.9de07d17e5103b29b50565263afdea11.png

#include-once
#AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
; =======================================================================================================================
; Title ........: GASP Puzzle Game (Digital adaptation of Conway's Game of Life)
; AutoIt Version: 3.3
; AutoItObject Version : v1.2.8.2
; Language ......: English
; Description ...: Digital adaptation of Conway's Game of Life with a GUI
; Dependencies ..: AutoItObject.au3, GDIPlus.au3
; Author ........: Numeric
; =======================================================================================================================
#include <GUIConstantsEx.au3>
#include <GDIPlus.au3>
#include "AutoItObject.au3"

_AutoItObject_Startup()
_GDIPlus_Startup()

Func CreateCell($x, $y, $size, $state = 0)
    Local $cellObj = _AutoItObject_Class()
    With $cellObj
        .Create()
        .AddProperty("X", $ELSCOPE_PUBLIC, $x)
        .AddProperty("Y", $ELSCOPE_PUBLIC, $y)
        .AddProperty("Size", $ELSCOPE_PUBLIC, $size)
        .AddProperty("State", $ELSCOPE_PUBLIC, $state)
        .AddMethod("ToggleState", "_ToggleState")
    EndWith
    Return $cellObj.Object
EndFunc   ;==>CreateCell

Func _ToggleState($this)
    $this.State = Not $this.State
EndFunc   ;==>_ToggleState

Func CreateGrid($rows, $cols, $cellSize)
    Local $gridObj = _AutoItObject_Class()
    Local $cells[$rows][$cols]

    ; Initialize grid cells
    For $y = 0 To $rows - 1
        For $x = 0 To $cols - 1
            $cells[$y][$x] = CreateCell($x * $cellSize, $y * $cellSize, $cellSize, Random(0, 1, 1))
        Next
    Next

    With $gridObj
        .Create()
        .AddProperty("hBrushAlive", $ELSCOPE_PUBLIC, _GDIPlus_BrushCreateSolid(0xFF0000FF)) ; Blue for alive
        .AddProperty("hBrushDead", $ELSCOPE_PUBLIC, _GDIPlus_BrushCreateSolid(0xFFFFFFFF))  ; White for dead
        .AddProperty("hPenGrid", $ELSCOPE_PUBLIC, _GDIPlus_PenCreate(0xFF000000, 1)) ; Black for grid lines
        .AddProperty("Rows", $ELSCOPE_PUBLIC, $rows)
        .AddProperty("Cols", $ELSCOPE_PUBLIC, $cols)
        .AddProperty("CellSize", $ELSCOPE_PUBLIC, $cellSize)
        .AddProperty("Cells", $ELSCOPE_PUBLIC, $cells)
        .AddMethod("Draw", "_DrawGrid")
        .AddMethod("Update", "_UpdateGrid")
        .AddMethod("CountNeighbors", "_CountNeighbors")
        .AddDestructor("_destructor")
    EndWith
    Return $gridObj.Object
EndFunc   ;==>CreateGrid

Func _destructor($this)
    _GDIPlus_BrushDispose($this.hBrushAlive)
    _GDIPlus_BrushDispose($this.hBrushDead)
    _GDIPlus_PenDispose($this.hPenGrid)
EndFunc   ;==>_destructor

Func _DrawGrid($this, $hGraphicsContext)
    For $y = 0 To $this.Rows - 1
        For $x = 0 To $this.Cols - 1
            Local $cell = $this.Cells[$y][$x]
            Local $brush = $cell.State ? $this.hBrushAlive : $this.hBrushDead
            _GDIPlus_GraphicsFillRect($hGraphicsContext, $cell.X, $cell.Y, $cell.Size, $cell.Size, $brush)
            _GDIPlus_GraphicsDrawRect($hGraphicsContext, $cell.X, $cell.Y, $cell.Size, $cell.Size, $this.hPenGrid)
        Next
    Next

EndFunc   ;==>_DrawGrid

Func _UpdateGrid($this)
    Local $newStates[$this.Rows][$this.Cols]

    For $y = 0 To $this.Rows - 1
        For $x = 0 To $this.Cols - 1
            Local $cell = $this.Cells[$y][$x]
            Local $neighbors = $this.CountNeighbors($x, $y)

            ; Apply Conway's Game of Life rules
            If $cell.State And ($neighbors < 2 Or $neighbors > 3) Then
                $newStates[$y][$x] = 0 ; Cell dies
            ElseIf Not $cell.State And $neighbors = 3 Then
                $newStates[$y][$x] = 1 ; Cell becomes alive
            Else
                $newStates[$y][$x] = $cell.State ; Cell stays the same
            EndIf
        Next
    Next

    ; Update cell states
    Local $aCells = $this.Cells
    For $y = 0 To $this.Rows - 1
        For $x = 0 To $this.Cols - 1
            $aCells[$y][$x].State = $newStates[$y][$x]
        Next
    Next
    $this.Cells = $aCells
EndFunc   ;==>_UpdateGrid

Func _CountNeighbors($this, $x, $y)
    Local $count = 0
    For $dy = -1 To 1
        For $dx = -1 To 1
            If $dx = 0 And $dy = 0 Then ContinueLoop
            Local $nx = Mod($x + $dx + $this.Cols, $this.Cols)
            Local $ny = Mod($y + $dy + $this.Rows, $this.Rows)
            If $this.Cells[$ny][$nx].State Then $count += 1
        Next
    Next
    Return $count
EndFunc   ;==>_CountNeighbors

Func CreateGame($rows, $cols, $cellSize)
    Local $gameObj = _AutoItObject_Class()
    Local $grid = CreateGrid($rows, $cols, $cellSize)
    Local $hWnd = GUICreate("Conway's Game of Life", $cols * $cellSize, $rows * $cellSize)
    GUISetState()

    Local $graphics = _GDIPlus_GraphicsCreateFromHWND($hWnd)

    With $gameObj
        .Create()
        .AddProperty("Grid", $ELSCOPE_PUBLIC, $grid)
        .AddProperty("hWnd", $ELSCOPE_PUBLIC, $hWnd)
        .AddProperty("Graphics", $ELSCOPE_PUBLIC, $graphics)
        .AddMethod("Run", "_RunGame")
        .AddDestructor("_destructor_game")
    EndWith
    Return $gameObj.Object
EndFunc   ;==>CreateGame

Func _RunGame($this)
    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ExitLoop
        EndSwitch

        $this.Grid.Update()
        $this.Grid.Draw($this.Graphics)
    WEnd

EndFunc   ;==>_RunGame

Func _destructor_game($this)
    $this.Grid = 0
    _GDIPlus_GraphicsDispose($this.Graphics)
    GUIDelete($this.hWnd)
EndFunc   ;==>_destructor_game

;================================================
Global $game = CreateGame(30, 30, 15)
$game.Run()
$game = 0
;==========================================================

 

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...