\begin{Verbatim}[commandchars=\\\{\}] \PY{c+c1}{// by gera} \PY{c+c1}{// public domain} \PY{k+kn}{package}\PY{+w}{ }\PY{n+nx}{hello\PYZus{}life} \PY{k+kn}{import}\PY{+w}{ }\PY{n+nx}{sdl}\PY{+w}{ }\PY{l+s}{\PYZdq{}vendor:sdl3\PYZdq{}} \PY{n+nx}{ClearBoard}\PY{+w}{ }\PY{p}{:}\PY{p}{:}\PY{+w}{ }\PY{n+nx}{proc}\PY{p}{(}\PY{n+nx}{pixels}\PY{+w}{ }\PY{p}{:}\PY{+w}{ }\PY{p}{[}\PY{p}{]}\PY{p}{[}\PY{l+m+mi}{4}\PY{p}{]}\PY{n+nx}{u8}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{color}\PY{+w}{ }\PY{p}{:}\PY{+w}{ }\PY{p}{[}\PY{l+m+mi}{4}\PY{p}{]}\PY{n+nx}{u8}\PY{p}{)}\PY{+w}{ }\PY{p}{\PYZob{}} \PY{+w}{ }\PY{k}{for}\PY{+w}{ }\PY{n+nx}{i}\PY{+w}{ }\PY{n+nx}{in}\PY{+w}{ }\PY{l+m+mf}{0.}\PY{p}{.}\PY{p}{\PYZlt{}}\PY{n+nb}{len}\PY{p}{(}\PY{n+nx}{pixels}\PY{p}{)}\PY{+w}{ }\PY{p}{\PYZob{}} \PY{+w}{ }\PY{n+nx}{pixels}\PY{p}{[}\PY{n+nx}{i}\PY{p}{]}\PY{+w}{ }\PY{p}{=}\PY{+w}{ }\PY{n+nx}{color} \PY{+w}{ }\PY{p}{\PYZcb{}} \PY{p}{\PYZcb{}} \PY{n+nx}{DrawCells}\PY{+w}{ }\PY{p}{:}\PY{p}{:}\PY{+w}{ }\PY{n+nx}{proc}\PY{p}{(}\PY{n+nx}{cells}\PY{+w}{ }\PY{p}{:}\PY{+w}{ }\PY{p}{\PYZca{}}\PY{k+kd}{map}\PY{p}{[}\PY{p}{[}\PY{l+m+mi}{2}\PY{p}{]}\PY{n+nx}{i32}\PY{p}{]}\PY{k+kt}{bool}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{pixels}\PY{+w}{ }\PY{p}{:}\PY{+w}{ }\PY{p}{[}\PY{p}{]}\PY{p}{[}\PY{l+m+mi}{4}\PY{p}{]}\PY{n+nx}{u8}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{color}\PY{+w}{ }\PY{p}{:}\PY{+w}{ }\PY{p}{[}\PY{l+m+mi}{4}\PY{p}{]}\PY{n+nx}{u8}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{w}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{h}\PY{+w}{ }\PY{p}{:}\PY{+w}{ }\PY{n+nx}{i32}\PY{p}{)}\PY{+w}{ }\PY{p}{\PYZob{}} \PY{+w}{ }\PY{k}{for}\PY{+w}{ }\PY{n+nx}{cell}\PY{+w}{ }\PY{n+nx}{in}\PY{+w}{ }\PY{n+nx}{cells}\PY{+w}{ }\PY{p}{\PYZob{}} \PY{+w}{ }\PY{k}{if}\PY{+w}{ }\PY{n+nx}{cell}\PY{p}{.}\PY{n+nx}{x}\PY{+w}{ }\PY{o}{\PYZgt{}=}\PY{+w}{ }\PY{l+m+mi}{0}\PY{+w}{ }\PY{o}{\PYZam{}\PYZam{}}\PY{+w}{ }\PY{n+nx}{cell}\PY{p}{.}\PY{n+nx}{y}\PY{+w}{ }\PY{o}{\PYZgt{}=}\PY{+w}{ }\PY{l+m+mi}{0}\PY{+w}{ }\PY{o}{\PYZam{}\PYZam{}}\PY{+w}{ }\PY{n+nx}{cell}\PY{p}{.}\PY{n+nx}{x}\PY{+w}{ }\PY{p}{\PYZlt{}}\PY{+w}{ }\PY{n+nx}{w}\PY{+w}{ }\PY{o}{\PYZam{}\PYZam{}}\PY{+w}{ }\PY{n+nx}{cell}\PY{p}{.}\PY{n+nx}{y}\PY{+w}{ }\PY{p}{\PYZlt{}}\PY{+w}{ }\PY{n+nx}{h}\PY{+w}{ }\PY{p}{\PYZob{}} \PY{+w}{ }\PY{n+nx}{pixels}\PY{p}{[}\PY{n+nx}{cell}\PY{p}{.}\PY{n+nx}{x}\PY{+w}{ }\PY{o}{+}\PY{+w}{ }\PY{n+nx}{cell}\PY{p}{.}\PY{n+nx}{y}\PY{+w}{ }\PY{o}{*}\PY{+w}{ }\PY{n+nx}{w}\PY{p}{]}\PY{+w}{ }\PY{p}{=}\PY{+w}{ }\PY{n+nx}{color} \PY{+w}{ }\PY{p}{\PYZcb{}} \PY{+w}{ }\PY{p}{\PYZcb{}} \PY{p}{\PYZcb{}} \PY{n+nx}{CountNeighbors}\PY{+w}{ }\PY{p}{:}\PY{p}{:}\PY{+w}{ }\PY{n+nx}{proc}\PY{p}{(}\PY{n+nx}{cells}\PY{+w}{ }\PY{p}{:}\PY{+w}{ }\PY{p}{\PYZca{}}\PY{k+kd}{map}\PY{p}{[}\PY{p}{[}\PY{l+m+mi}{2}\PY{p}{]}\PY{n+nx}{i32}\PY{p}{]}\PY{k+kt}{bool}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{pos}\PY{+w}{ }\PY{p}{:}\PY{+w}{ }\PY{p}{[}\PY{l+m+mi}{2}\PY{p}{]}\PY{n+nx}{i32}\PY{p}{)}\PY{+w}{ }\PY{o}{\PYZhy{}}\PY{p}{\PYZgt{}}\PY{+w}{ }\PY{n+nx}{i32} \PY{p}{\PYZob{}} \PY{+w}{ }\PY{n+nx}{count}\PY{+w}{ }\PY{p}{:}\PY{+w}{ }\PY{n+nx}{i32} \PY{+w}{ }\PY{n+nx}{count}\PY{+w}{ }\PY{o}{+=}\PY{+w}{ }\PY{n+nx}{i32}\PY{p}{(}\PY{n+nx}{cells}\PY{p}{[}\PY{p}{\PYZob{}}\PY{n+nx}{pos}\PY{p}{.}\PY{n+nx}{x}\PY{+w}{ }\PY{o}{+}\PY{+w}{ }\PY{l+m+mi}{1}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{pos}\PY{p}{.}\PY{n+nx}{y}\PY{p}{\PYZcb{}}\PY{p}{]}\PY{p}{)} \PY{+w}{ }\PY{n+nx}{count}\PY{+w}{ }\PY{o}{+=}\PY{+w}{ }\PY{n+nx}{i32}\PY{p}{(}\PY{n+nx}{cells}\PY{p}{[}\PY{p}{\PYZob{}}\PY{n+nx}{pos}\PY{p}{.}\PY{n+nx}{x}\PY{+w}{ }\PY{o}{+}\PY{+w}{ }\PY{l+m+mi}{1}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{pos}\PY{p}{.}\PY{n+nx}{y}\PY{+w}{ }\PY{o}{+}\PY{+w}{ }\PY{l+m+mi}{1}\PY{p}{\PYZcb{}}\PY{p}{]}\PY{p}{)} \PY{+w}{ }\PY{n+nx}{count}\PY{+w}{ }\PY{o}{+=}\PY{+w}{ }\PY{n+nx}{i32}\PY{p}{(}\PY{n+nx}{cells}\PY{p}{[}\PY{p}{\PYZob{}}\PY{n+nx}{pos}\PY{p}{.}\PY{n+nx}{x}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{pos}\PY{p}{.}\PY{n+nx}{y}\PY{+w}{ }\PY{o}{+}\PY{+w}{ }\PY{l+m+mi}{1}\PY{p}{\PYZcb{}}\PY{p}{]}\PY{p}{)} \PY{+w}{ }\PY{n+nx}{count}\PY{+w}{ }\PY{o}{+=}\PY{+w}{ }\PY{n+nx}{i32}\PY{p}{(}\PY{n+nx}{cells}\PY{p}{[}\PY{p}{\PYZob{}}\PY{n+nx}{pos}\PY{p}{.}\PY{n+nx}{x}\PY{+w}{ }\PY{o}{\PYZhy{}}\PY{+w}{ }\PY{l+m+mi}{1}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{pos}\PY{p}{.}\PY{n+nx}{y}\PY{+w}{ }\PY{o}{+}\PY{+w}{ }\PY{l+m+mi}{1}\PY{p}{\PYZcb{}}\PY{p}{]}\PY{p}{)} \PY{+w}{ }\PY{n+nx}{count}\PY{+w}{ }\PY{o}{+=}\PY{+w}{ }\PY{n+nx}{i32}\PY{p}{(}\PY{n+nx}{cells}\PY{p}{[}\PY{p}{\PYZob{}}\PY{n+nx}{pos}\PY{p}{.}\PY{n+nx}{x}\PY{+w}{ }\PY{o}{\PYZhy{}}\PY{+w}{ }\PY{l+m+mi}{1}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{pos}\PY{p}{.}\PY{n+nx}{y}\PY{p}{\PYZcb{}}\PY{p}{]}\PY{p}{)} \PY{+w}{ }\PY{n+nx}{count}\PY{+w}{ }\PY{o}{+=}\PY{+w}{ }\PY{n+nx}{i32}\PY{p}{(}\PY{n+nx}{cells}\PY{p}{[}\PY{p}{\PYZob{}}\PY{n+nx}{pos}\PY{p}{.}\PY{n+nx}{x}\PY{+w}{ }\PY{o}{\PYZhy{}}\PY{+w}{ }\PY{l+m+mi}{1}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{pos}\PY{p}{.}\PY{n+nx}{y}\PY{+w}{ }\PY{o}{\PYZhy{}}\PY{+w}{ }\PY{l+m+mi}{1}\PY{p}{\PYZcb{}}\PY{p}{]}\PY{p}{)} \PY{+w}{ }\PY{n+nx}{count}\PY{+w}{ }\PY{o}{+=}\PY{+w}{ }\PY{n+nx}{i32}\PY{p}{(}\PY{n+nx}{cells}\PY{p}{[}\PY{p}{\PYZob{}}\PY{n+nx}{pos}\PY{p}{.}\PY{n+nx}{x}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{pos}\PY{p}{.}\PY{n+nx}{y}\PY{+w}{ }\PY{o}{\PYZhy{}}\PY{+w}{ }\PY{l+m+mi}{1}\PY{p}{\PYZcb{}}\PY{p}{]}\PY{p}{)} \PY{+w}{ }\PY{n+nx}{count}\PY{+w}{ }\PY{o}{+=}\PY{+w}{ }\PY{n+nx}{i32}\PY{p}{(}\PY{n+nx}{cells}\PY{p}{[}\PY{p}{\PYZob{}}\PY{n+nx}{pos}\PY{p}{.}\PY{n+nx}{x}\PY{+w}{ }\PY{o}{+}\PY{+w}{ }\PY{l+m+mi}{1}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{pos}\PY{p}{.}\PY{n+nx}{y}\PY{+w}{ }\PY{o}{\PYZhy{}}\PY{+w}{ }\PY{l+m+mi}{1}\PY{p}{\PYZcb{}}\PY{p}{]}\PY{p}{)} \PY{+w}{ }\PY{k}{return}\PY{+w}{ }\PY{n+nx}{count} \PY{p}{\PYZcb{}} \PY{n+nx}{ApplyRulesOnCell}\PY{+w}{ }\PY{p}{:}\PY{p}{:}\PY{+w}{ }\PY{n+nx}{proc}\PY{p}{(}\PY{n+nx}{cellscur}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{cellsnext}\PY{+w}{ }\PY{p}{:}\PY{+w}{ }\PY{p}{\PYZca{}}\PY{k+kd}{map}\PY{p}{[}\PY{p}{[}\PY{l+m+mi}{2}\PY{p}{]}\PY{n+nx}{i32}\PY{p}{]}\PY{k+kt}{bool}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{pos}\PY{+w}{ }\PY{p}{:}\PY{+w}{ }\PY{p}{[}\PY{l+m+mi}{2}\PY{p}{]}\PY{n+nx}{i32}\PY{p}{)} \PY{p}{\PYZob{}} \PY{+w}{ }\PY{n+nx}{neighbors}\PY{+w}{ }\PY{o}{:=}\PY{+w}{ }\PY{n+nx}{CountNeighbors}\PY{p}{(}\PY{n+nx}{cellscur}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{pos}\PY{p}{)} \PY{+w}{ }\PY{n+nx}{alive}\PY{+w}{ }\PY{o}{:=}\PY{+w}{ }\PY{n+nx}{cellscur}\PY{p}{[}\PY{n+nx}{pos}\PY{p}{]} \PY{+w}{ }\PY{k}{if}\PY{+w}{ }\PY{p}{(}\PY{n+nx}{alive}\PY{+w}{ }\PY{o}{\PYZam{}\PYZam{}}\PY{+w}{ }\PY{p}{(}\PY{n+nx}{neighbors}\PY{+w}{ }\PY{p}{\PYZlt{}}\PY{+w}{ }\PY{l+m+mi}{2}\PY{+w}{ }\PY{o}{||}\PY{+w}{ }\PY{n+nx}{neighbors}\PY{+w}{ }\PY{p}{\PYZgt{}}\PY{+w}{ }\PY{l+m+mi}{3}\PY{p}{)}\PY{p}{)}\PY{+w}{ }\PY{n+nx}{do}\PY{+w}{ }\PY{n+nx}{delete\PYZus{}key}\PY{p}{(}\PY{n+nx}{cellsnext}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{pos}\PY{p}{)} \PY{+w}{ }\PY{k}{else}\PY{+w}{ }\PY{k}{if}\PY{+w}{ }\PY{p}{(}\PY{p}{!}\PY{n+nx}{alive}\PY{+w}{ }\PY{o}{\PYZam{}\PYZam{}}\PY{+w}{ }\PY{n+nx}{neighbors}\PY{+w}{ }\PY{o}{==}\PY{+w}{ }\PY{l+m+mi}{3}\PY{p}{)}\PY{+w}{ }\PY{n+nx}{do}\PY{+w}{ }\PY{n+nx}{cellsnext}\PY{p}{[}\PY{n+nx}{pos}\PY{p}{]}\PY{+w}{ }\PY{p}{=}\PY{+w}{ }\PY{k+kc}{true} \PY{+w}{ }\PY{k}{else}\PY{+w}{ }\PY{k}{if}\PY{+w}{ }\PY{p}{(}\PY{n+nx}{alive}\PY{+w}{ }\PY{o}{\PYZam{}\PYZam{}}\PY{+w}{ }\PY{p}{(}\PY{n+nx}{neighbors}\PY{+w}{ }\PY{o}{==}\PY{+w}{ }\PY{l+m+mi}{2}\PY{+w}{ }\PY{o}{||}\PY{+w}{ }\PY{n+nx}{neighbors}\PY{+w}{ }\PY{o}{==}\PY{+w}{ }\PY{l+m+mi}{3}\PY{p}{)}\PY{p}{)}\PY{+w}{ }\PY{n+nx}{do}\PY{+w}{ }\PY{n+nx}{cellsnext}\PY{p}{[}\PY{n+nx}{pos}\PY{p}{]}\PY{+w}{ }\PY{p}{=}\PY{+w}{ }\PY{k+kc}{true} \PY{p}{\PYZcb{}} \PY{n+nx}{ComputeLife}\PY{+w}{ }\PY{p}{:}\PY{p}{:}\PY{+w}{ }\PY{n+nx}{proc}\PY{p}{(}\PY{n+nx}{cellscur}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{cellsnext}\PY{+w}{ }\PY{p}{:}\PY{+w}{ }\PY{p}{\PYZca{}}\PY{k+kd}{map}\PY{p}{[}\PY{p}{[}\PY{l+m+mi}{2}\PY{p}{]}\PY{n+nx}{i32}\PY{p}{]}\PY{k+kt}{bool}\PY{p}{)} \PY{p}{\PYZob{}} \PY{+w}{ }\PY{n+nb}{clear}\PY{p}{(}\PY{n+nx}{cellsnext}\PY{p}{)} \PY{+w}{ }\PY{k}{for}\PY{+w}{ }\PY{n+nx}{cell}\PY{+w}{ }\PY{n+nx}{in}\PY{+w}{ }\PY{n+nx}{cellscur}\PY{+w}{ }\PY{p}{\PYZob{}} \PY{+w}{ }\PY{n+nx}{x}\PY{+w}{ }\PY{o}{:=}\PY{+w}{ }\PY{n+nx}{cell}\PY{p}{[}\PY{l+m+mi}{0}\PY{p}{]} \PY{+w}{ }\PY{n+nx}{y}\PY{+w}{ }\PY{o}{:=}\PY{+w}{ }\PY{n+nx}{cell}\PY{p}{[}\PY{l+m+mi}{1}\PY{p}{]} \PY{+w}{ }\PY{n+nx}{ApplyRulesOnCell}\PY{p}{(}\PY{n+nx}{cellscur}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{cellsnext}\PY{p}{,}\PY{+w}{ }\PY{p}{\PYZob{}}\PY{n+nx}{x}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{y}\PY{p}{\PYZcb{}}\PY{p}{)} \PY{+w}{ }\PY{n+nx}{ApplyRulesOnCell}\PY{p}{(}\PY{n+nx}{cellscur}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{cellsnext}\PY{p}{,}\PY{+w}{ }\PY{p}{\PYZob{}}\PY{n+nx}{x}\PY{+w}{ }\PY{o}{+}\PY{+w}{ }\PY{l+m+mi}{1}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{y}\PY{p}{\PYZcb{}}\PY{p}{)} \PY{+w}{ }\PY{n+nx}{ApplyRulesOnCell}\PY{p}{(}\PY{n+nx}{cellscur}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{cellsnext}\PY{p}{,}\PY{+w}{ }\PY{p}{\PYZob{}}\PY{n+nx}{x}\PY{+w}{ }\PY{o}{+}\PY{+w}{ }\PY{l+m+mi}{1}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{y}\PY{+w}{ }\PY{o}{+}\PY{+w}{ }\PY{l+m+mi}{1}\PY{p}{\PYZcb{}}\PY{p}{)} \PY{+w}{ }\PY{n+nx}{ApplyRulesOnCell}\PY{p}{(}\PY{n+nx}{cellscur}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{cellsnext}\PY{p}{,}\PY{+w}{ }\PY{p}{\PYZob{}}\PY{n+nx}{x}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{y}\PY{+w}{ }\PY{o}{+}\PY{+w}{ }\PY{l+m+mi}{1}\PY{p}{\PYZcb{}}\PY{p}{)} \PY{+w}{ }\PY{n+nx}{ApplyRulesOnCell}\PY{p}{(}\PY{n+nx}{cellscur}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{cellsnext}\PY{p}{,}\PY{+w}{ }\PY{p}{\PYZob{}}\PY{n+nx}{x}\PY{+w}{ }\PY{o}{\PYZhy{}}\PY{+w}{ }\PY{l+m+mi}{1}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{y}\PY{+w}{ }\PY{o}{+}\PY{+w}{ }\PY{l+m+mi}{1}\PY{p}{\PYZcb{}}\PY{p}{)} \PY{+w}{ }\PY{n+nx}{ApplyRulesOnCell}\PY{p}{(}\PY{n+nx}{cellscur}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{cellsnext}\PY{p}{,}\PY{+w}{ }\PY{p}{\PYZob{}}\PY{n+nx}{x}\PY{+w}{ }\PY{o}{\PYZhy{}}\PY{+w}{ }\PY{l+m+mi}{1}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{y}\PY{p}{\PYZcb{}}\PY{p}{)} \PY{+w}{ }\PY{n+nx}{ApplyRulesOnCell}\PY{p}{(}\PY{n+nx}{cellscur}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{cellsnext}\PY{p}{,}\PY{+w}{ }\PY{p}{\PYZob{}}\PY{n+nx}{x}\PY{+w}{ }\PY{o}{\PYZhy{}}\PY{+w}{ }\PY{l+m+mi}{1}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{y}\PY{+w}{ }\PY{o}{\PYZhy{}}\PY{+w}{ }\PY{l+m+mi}{1}\PY{p}{\PYZcb{}}\PY{p}{)} \PY{+w}{ }\PY{n+nx}{ApplyRulesOnCell}\PY{p}{(}\PY{n+nx}{cellscur}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{cellsnext}\PY{p}{,}\PY{+w}{ }\PY{p}{\PYZob{}}\PY{n+nx}{x}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{y}\PY{+w}{ }\PY{o}{\PYZhy{}}\PY{+w}{ }\PY{l+m+mi}{1}\PY{p}{\PYZcb{}}\PY{p}{)} \PY{+w}{ }\PY{n+nx}{ApplyRulesOnCell}\PY{p}{(}\PY{n+nx}{cellscur}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{cellsnext}\PY{p}{,}\PY{+w}{ }\PY{p}{\PYZob{}}\PY{n+nx}{x}\PY{+w}{ }\PY{o}{+}\PY{+w}{ }\PY{l+m+mi}{1}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{y}\PY{+w}{ }\PY{o}{\PYZhy{}}\PY{+w}{ }\PY{l+m+mi}{1}\PY{p}{\PYZcb{}}\PY{p}{)} \PY{+w}{ }\PY{p}{\PYZcb{}} \PY{p}{\PYZcb{}} \PY{n+nx}{main}\PY{+w}{ }\PY{p}{:}\PY{p}{:}\PY{+w}{ }\PY{n+nx}{proc}\PY{p}{(}\PY{p}{)}\PY{+w}{ }\PY{p}{\PYZob{}} \PY{+w}{ }\PY{n+nx}{result}\PY{+w}{ }\PY{o}{:=}\PY{+w}{ }\PY{n+nx}{sdl}\PY{p}{.}\PY{n+nx}{Init}\PY{p}{(}\PY{p}{\PYZob{}}\PY{p}{.}\PY{n+nx}{VIDEO}\PY{p}{\PYZcb{}}\PY{p}{)} \PY{+w}{ }\PY{n+nx}{window}\PY{+w}{ }\PY{p}{:}\PY{+w}{ }\PY{p}{\PYZca{}}\PY{n+nx}{sdl}\PY{p}{.}\PY{n+nx}{Window} \PY{+w}{ }\PY{n+nx}{renderer}\PY{+w}{ }\PY{p}{:}\PY{+w}{ }\PY{p}{\PYZca{}}\PY{n+nx}{sdl}\PY{p}{.}\PY{n+nx}{Renderer} \PY{+w}{ }\PY{n+nx}{result}\PY{+w}{ }\PY{p}{=}\PY{+w}{ }\PY{n+nx}{sdl}\PY{p}{.}\PY{n+nx}{CreateWindowAndRenderer}\PY{p}{(}\PY{l+s}{\PYZdq{}Game of Life\PYZdq{}}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{width}\PY{+w}{ }\PY{p}{=}\PY{+w}{ }\PY{l+m+mi}{640}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{height}\PY{+w}{ }\PY{p}{=}\PY{+w}{ }\PY{l+m+mi}{480}\PY{p}{,} \PY{+w}{ }\PY{n+nx}{window\PYZus{}flags}\PY{+w}{ }\PY{p}{=}\PY{+w}{ }\PY{p}{\PYZob{}}\PY{p}{.}\PY{n+nx}{RESIZABLE}\PY{p}{,}\PY{p}{\PYZcb{}}\PY{p}{,} \PY{+w}{ }\PY{n+nx}{window}\PY{+w}{ }\PY{p}{=}\PY{+w}{ }\PY{o}{\PYZam{}}\PY{n+nx}{window}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{renderer}\PY{+w}{ }\PY{p}{=}\PY{+w}{ }\PY{o}{\PYZam{}}\PY{n+nx}{renderer}\PY{p}{)} \PY{+w}{ }\PY{n+nx}{texture}\PY{+w}{ }\PY{o}{:=}\PY{+w}{ }\PY{n+nx}{sdl}\PY{p}{.}\PY{n+nx}{CreateTexture}\PY{p}{(}\PY{n+nx}{renderer}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{sdl}\PY{p}{.}\PY{n+nx}{PixelFormat}\PY{p}{.}\PY{n+nx}{ABGR8888}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{sdl}\PY{p}{.}\PY{n+nx}{TextureAccess}\PY{p}{.}\PY{n+nx}{STREAMING}\PY{p}{,}\PY{+w}{ }\PY{l+m+mi}{320}\PY{p}{,}\PY{+w}{ }\PY{l+m+mi}{240}\PY{p}{)} \PY{+w}{ }\PY{n+nx}{sdl}\PY{p}{.}\PY{n+nx}{SetRenderLogicalPresentation}\PY{p}{(}\PY{n+nx}{renderer}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{texture}\PY{p}{.}\PY{n+nx}{w}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{texture}\PY{p}{.}\PY{n+nx}{h}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{sdl}\PY{p}{.}\PY{n+nx}{RendererLogicalPresentation}\PY{p}{.}\PY{n+nx}{LETTERBOX}\PY{p}{)} \PY{+w}{ }\PY{n+nx}{sdl}\PY{p}{.}\PY{n+nx}{SetTextureScaleMode}\PY{p}{(}\PY{n+nx}{texture}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{sdl}\PY{p}{.}\PY{n+nx}{ScaleMode}\PY{p}{.}\PY{n+nx}{PIXELART}\PY{p}{)} \PY{+w}{ }\PY{n+nx}{cells1}\PY{+w}{ }\PY{p}{:}\PY{+w}{ }\PY{k+kd}{map}\PY{p}{[}\PY{p}{[}\PY{l+m+mi}{2}\PY{p}{]}\PY{n+nx}{i32}\PY{p}{]}\PY{k+kt}{bool} \PY{+w}{ }\PY{n+nx}{cells2}\PY{+w}{ }\PY{p}{:}\PY{+w}{ }\PY{k+kd}{map}\PY{p}{[}\PY{p}{[}\PY{l+m+mi}{2}\PY{p}{]}\PY{n+nx}{i32}\PY{p}{]}\PY{k+kt}{bool} \PY{+w}{ }\PY{n+nx}{cellsfront}\PY{+w}{ }\PY{o}{:=}\PY{+w}{ }\PY{o}{\PYZam{}}\PY{n+nx}{cells1} \PY{+w}{ }\PY{n+nx}{cellsback}\PY{+w}{ }\PY{o}{:=}\PY{+w}{ }\PY{o}{\PYZam{}}\PY{n+nx}{cells2} \PY{c+cm}{/* initial state:} \PY{c+cm}{ ****} \PY{c+cm}{ *} \PY{c+cm}{ *} \PY{c+cm}{ *} \PY{c+cm}{*/} \PY{+w}{ }\PY{n+nx}{cellsfront}\PY{p}{[}\PY{p}{\PYZob{}}\PY{l+m+mi}{0}\PY{o}{+}\PY{n+nx}{texture}\PY{p}{.}\PY{n+nx}{w}\PY{o}{/}\PY{l+m+mi}{2}\PY{p}{,}\PY{+w}{ }\PY{l+m+mi}{0}\PY{o}{+}\PY{n+nx}{texture}\PY{p}{.}\PY{n+nx}{h}\PY{o}{/}\PY{l+m+mi}{2}\PY{p}{\PYZcb{}}\PY{p}{]}\PY{+w}{ }\PY{p}{=}\PY{+w}{ }\PY{k+kc}{true} \PY{+w}{ }\PY{n+nx}{cellsfront}\PY{p}{[}\PY{p}{\PYZob{}}\PY{l+m+mi}{1}\PY{o}{+}\PY{n+nx}{texture}\PY{p}{.}\PY{n+nx}{w}\PY{o}{/}\PY{l+m+mi}{2}\PY{p}{,}\PY{+w}{ }\PY{l+m+mi}{0}\PY{o}{+}\PY{n+nx}{texture}\PY{p}{.}\PY{n+nx}{h}\PY{o}{/}\PY{l+m+mi}{2}\PY{p}{\PYZcb{}}\PY{p}{]}\PY{+w}{ }\PY{p}{=}\PY{+w}{ }\PY{k+kc}{true} \PY{+w}{ }\PY{n+nx}{cellsfront}\PY{p}{[}\PY{p}{\PYZob{}}\PY{l+m+mi}{2}\PY{o}{+}\PY{n+nx}{texture}\PY{p}{.}\PY{n+nx}{w}\PY{o}{/}\PY{l+m+mi}{2}\PY{p}{,}\PY{+w}{ }\PY{l+m+mi}{0}\PY{o}{+}\PY{n+nx}{texture}\PY{p}{.}\PY{n+nx}{h}\PY{o}{/}\PY{l+m+mi}{2}\PY{p}{\PYZcb{}}\PY{p}{]}\PY{+w}{ }\PY{p}{=}\PY{+w}{ }\PY{k+kc}{true} \PY{+w}{ }\PY{n+nx}{cellsfront}\PY{p}{[}\PY{p}{\PYZob{}}\PY{l+m+mi}{3}\PY{o}{+}\PY{n+nx}{texture}\PY{p}{.}\PY{n+nx}{w}\PY{o}{/}\PY{l+m+mi}{2}\PY{p}{,}\PY{+w}{ }\PY{l+m+mi}{0}\PY{o}{+}\PY{n+nx}{texture}\PY{p}{.}\PY{n+nx}{h}\PY{o}{/}\PY{l+m+mi}{2}\PY{p}{\PYZcb{}}\PY{p}{]}\PY{+w}{ }\PY{p}{=}\PY{+w}{ }\PY{k+kc}{true} \PY{+w}{ }\PY{n+nx}{cellsfront}\PY{p}{[}\PY{p}{\PYZob{}}\PY{l+m+mi}{1}\PY{o}{+}\PY{n+nx}{texture}\PY{p}{.}\PY{n+nx}{w}\PY{o}{/}\PY{l+m+mi}{2}\PY{p}{,}\PY{+w}{ }\PY{l+m+mi}{1}\PY{o}{+}\PY{n+nx}{texture}\PY{p}{.}\PY{n+nx}{h}\PY{o}{/}\PY{l+m+mi}{2}\PY{p}{\PYZcb{}}\PY{p}{]}\PY{+w}{ }\PY{p}{=}\PY{+w}{ }\PY{k+kc}{true} \PY{+w}{ }\PY{n+nx}{cellsfront}\PY{p}{[}\PY{p}{\PYZob{}}\PY{l+m+mi}{2}\PY{o}{+}\PY{n+nx}{texture}\PY{p}{.}\PY{n+nx}{w}\PY{o}{/}\PY{l+m+mi}{2}\PY{p}{,}\PY{+w}{ }\PY{l+m+mi}{2}\PY{o}{+}\PY{n+nx}{texture}\PY{p}{.}\PY{n+nx}{h}\PY{o}{/}\PY{l+m+mi}{2}\PY{p}{\PYZcb{}}\PY{p}{]}\PY{+w}{ }\PY{p}{=}\PY{+w}{ }\PY{k+kc}{true} \PY{+w}{ }\PY{n+nx}{cellsfront}\PY{p}{[}\PY{p}{\PYZob{}}\PY{l+m+mi}{2}\PY{o}{+}\PY{n+nx}{texture}\PY{p}{.}\PY{n+nx}{w}\PY{o}{/}\PY{l+m+mi}{2}\PY{p}{,}\PY{+w}{ }\PY{l+m+mi}{3}\PY{o}{+}\PY{n+nx}{texture}\PY{p}{.}\PY{n+nx}{h}\PY{o}{/}\PY{l+m+mi}{2}\PY{p}{\PYZcb{}}\PY{p}{]}\PY{+w}{ }\PY{p}{=}\PY{+w}{ }\PY{k+kc}{true} \PY{+w}{ }\PY{n+nx}{running}\PY{+w}{ }\PY{p}{:}\PY{+w}{ }\PY{k+kt}{bool}\PY{+w}{ }\PY{p}{=}\PY{+w}{ }\PY{k+kc}{true} \PY{+w}{ }\PY{n+nx}{time\PYZus{}start}\PY{+w}{ }\PY{p}{:}\PY{+w}{ }\PY{n+nx}{u64} \PY{+w}{ }\PY{n+nx}{loop}\PY{p}{:}\PY{+w}{ }\PY{k}{for}\PY{+w}{ }\PY{n+nx}{running}\PY{+w}{ }\PY{p}{\PYZob{}} \PY{+w}{ }\PY{n+nx}{time\PYZus{}start}\PY{+w}{ }\PY{p}{=}\PY{+w}{ }\PY{n+nx}{sdl}\PY{p}{.}\PY{n+nx}{GetTicksNS}\PY{p}{(}\PY{p}{)} \PY{+w}{ }\PY{n+nx}{event}\PY{+w}{ }\PY{p}{:}\PY{+w}{ }\PY{n+nx}{sdl}\PY{p}{.}\PY{n+nx}{Event} \PY{+w}{ }\PY{n+nx}{result}\PY{+w}{ }\PY{p}{=}\PY{+w}{ }\PY{n+nx}{sdl}\PY{p}{.}\PY{n+nx}{PollEvent}\PY{p}{(}\PY{o}{\PYZam{}}\PY{n+nx}{event}\PY{p}{)} \PY{+w}{ }\PY{err}{\PYZsh{}}\PY{n+nx}{partial}\PY{+w}{ }\PY{k}{switch}\PY{+w}{ }\PY{n+nx}{event}\PY{p}{.}\PY{k+kd}{type}\PY{+w}{ }\PY{p}{\PYZob{}} \PY{+w}{ }\PY{k}{case}\PY{+w}{ }\PY{p}{.}\PY{n+nx}{QUIT}\PY{p}{:} \PY{+w}{ }\PY{n+nx}{running}\PY{+w}{ }\PY{p}{=}\PY{+w}{ }\PY{k+kc}{false} \PY{+w}{ }\PY{k}{break}\PY{+w}{ }\PY{n+nx}{loop} \PY{+w}{ }\PY{p}{\PYZcb{}} \PY{+w}{ }\PY{n+nx}{pixels\PYZus{}rawptr}\PY{+w}{ }\PY{p}{:}\PY{+w}{ }\PY{n+nx}{rawptr} \PY{+w}{ }\PY{n+nx}{pitch}\PY{+w}{ }\PY{p}{:}\PY{+w}{ }\PY{n+nx}{i32} \PY{+w}{ }\PY{n+nx}{sdl}\PY{p}{.}\PY{n+nx}{LockTexture}\PY{p}{(}\PY{n+nx}{texture}\PY{p}{,}\PY{+w}{ }\PY{k+kc}{nil}\PY{p}{,}\PY{+w}{ }\PY{o}{\PYZam{}}\PY{n+nx}{pixels\PYZus{}rawptr}\PY{p}{,}\PY{+w}{ }\PY{o}{\PYZam{}}\PY{n+nx}{pitch}\PY{p}{)} \PY{+w}{ }\PY{n+nx}{pixels}\PY{+w}{ }\PY{o}{:=}\PY{+w}{ }\PY{p}{(}\PY{p}{[}\PY{p}{\PYZca{}}\PY{p}{]}\PY{p}{[}\PY{l+m+mi}{4}\PY{p}{]}\PY{n+nx}{u8}\PY{p}{)}\PY{p}{(}\PY{n+nx}{pixels\PYZus{}rawptr}\PY{p}{)}\PY{p}{[}\PY{p}{:}\PY{n+nx}{texture}\PY{p}{.}\PY{n+nx}{w}\PY{+w}{ }\PY{o}{*}\PY{+w}{ }\PY{n+nx}{texture}\PY{p}{.}\PY{n+nx}{h}\PY{p}{]} \PY{+w}{ }\PY{n+nx}{ClearBoard}\PY{p}{(}\PY{n+nx}{pixels}\PY{p}{,}\PY{+w}{ }\PY{p}{\PYZob{}}\PY{l+m+mi}{200}\PY{p}{,}\PY{+w}{ }\PY{l+m+mi}{200}\PY{p}{,}\PY{+w}{ }\PY{l+m+mi}{200}\PY{p}{,}\PY{+w}{ }\PY{l+m+mi}{255}\PY{p}{\PYZcb{}}\PY{p}{)} \PY{+w}{ }\PY{n+nx}{DrawCells}\PY{p}{(}\PY{n+nx}{cellsfront}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{pixels}\PY{p}{,}\PY{+w}{ }\PY{p}{\PYZob{}}\PY{l+m+mi}{0}\PY{p}{,}\PY{+w}{ }\PY{l+m+mi}{0}\PY{p}{,}\PY{+w}{ }\PY{l+m+mi}{255}\PY{p}{,}\PY{+w}{ }\PY{l+m+mi}{255}\PY{p}{\PYZcb{}}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{texture}\PY{p}{.}\PY{n+nx}{w}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{texture}\PY{p}{.}\PY{n+nx}{h}\PY{p}{)} \PY{+w}{ }\PY{n+nx}{sdl}\PY{p}{.}\PY{n+nx}{UnlockTexture}\PY{p}{(}\PY{n+nx}{texture}\PY{p}{)} \PY{+w}{ }\PY{n+nx}{sdl}\PY{p}{.}\PY{n+nx}{RenderClear}\PY{p}{(}\PY{n+nx}{renderer}\PY{p}{)} \PY{+w}{ }\PY{n+nx}{sdl}\PY{p}{.}\PY{n+nx}{RenderTexture}\PY{p}{(}\PY{n+nx}{renderer}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{texture}\PY{p}{,}\PY{+w}{ }\PY{k+kc}{nil}\PY{p}{,}\PY{+w}{ }\PY{k+kc}{nil}\PY{p}{)} \PY{+w}{ }\PY{n+nx}{sdl}\PY{p}{.}\PY{n+nx}{RenderPresent}\PY{p}{(}\PY{n+nx}{renderer}\PY{p}{)} \PY{+w}{ }\PY{n+nx}{ComputeLife}\PY{p}{(}\PY{n+nx}{cellsfront}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{cellsback}\PY{p}{)} \PY{+w}{ }\PY{n+nx}{cellsfront}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{cellsback}\PY{+w}{ }\PY{p}{=}\PY{+w}{ }\PY{n+nx}{cellsback}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{cellsfront} \PY{+w}{ }\PY{n+nx}{time\PYZus{}end}\PY{+w}{ }\PY{o}{:=}\PY{+w}{ }\PY{n+nx}{sdl}\PY{p}{.}\PY{n+nx}{GetTicksNS}\PY{p}{(}\PY{p}{)} \PY{+w}{ }\PY{c+c1}{// do more generations but maintain the target fps} \PY{+w}{ }\PY{k}{for}\PY{+w}{ }\PY{n+nx}{time\PYZus{}end}\PY{+w}{ }\PY{o}{\PYZhy{}}\PY{+w}{ }\PY{n+nx}{time\PYZus{}start}\PY{+w}{ }\PY{p}{\PYZlt{}}\PY{+w}{ }\PY{l+m+mf}{1e9}\PY{o}{/}\PY{l+m+mi}{30}\PY{+w}{ }\PY{p}{\PYZob{}} \PY{+w}{ }\PY{n+nx}{ComputeLife}\PY{p}{(}\PY{n+nx}{cellsfront}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{cellsback}\PY{p}{)} \PY{+w}{ }\PY{n+nx}{cellsfront}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{cellsback}\PY{+w}{ }\PY{p}{=}\PY{+w}{ }\PY{n+nx}{cellsback}\PY{p}{,}\PY{+w}{ }\PY{n+nx}{cellsfront} \PY{+w}{ }\PY{c+c1}{// also handle events so the window doesn\PYZsq{}t lag} \PY{+w}{ }\PY{n+nx}{result}\PY{+w}{ }\PY{p}{=}\PY{+w}{ }\PY{n+nx}{sdl}\PY{p}{.}\PY{n+nx}{PollEvent}\PY{p}{(}\PY{o}{\PYZam{}}\PY{n+nx}{event}\PY{p}{)} \PY{+w}{ }\PY{err}{\PYZsh{}}\PY{n+nx}{partial}\PY{+w}{ }\PY{k}{switch}\PY{+w}{ }\PY{n+nx}{event}\PY{p}{.}\PY{k+kd}{type}\PY{+w}{ }\PY{p}{\PYZob{}} \PY{+w}{ }\PY{k}{case}\PY{+w}{ }\PY{p}{.}\PY{n+nx}{QUIT}\PY{p}{:} \PY{+w}{ }\PY{n+nx}{running}\PY{+w}{ }\PY{p}{=}\PY{+w}{ }\PY{k+kc}{false} \PY{+w}{ }\PY{k}{break}\PY{+w}{ }\PY{n+nx}{loop} \PY{+w}{ }\PY{p}{\PYZcb{}} \PY{+w}{ }\PY{n+nx}{time\PYZus{}end}\PY{+w}{ }\PY{p}{=}\PY{+w}{ }\PY{n+nx}{sdl}\PY{p}{.}\PY{n+nx}{GetTicksNS}\PY{p}{(}\PY{p}{)} \PY{+w}{ }\PY{p}{\PYZcb{}} \PY{+w}{ }\PY{p}{\PYZcb{}} \PY{+w}{ }\PY{n+nx}{sdl}\PY{p}{.}\PY{n+nx}{DestroyRenderer}\PY{p}{(}\PY{n+nx}{renderer}\PY{p}{)} \PY{+w}{ }\PY{n+nx}{sdl}\PY{p}{.}\PY{n+nx}{DestroyWindow}\PY{p}{(}\PY{n+nx}{window}\PY{p}{)} \PY{+w}{ }\PY{n+nx}{sdl}\PY{p}{.}\PY{n+nx}{Quit}\PY{p}{(}\PY{p}{)} \PY{p}{\PYZcb{}} \end{Verbatim}