

Next, implement the methods "isAlive(self, row, col)" which returns True if the cell at the given row and column is alive and False otherwise, "setAlive(self, row, col, tf)" which sets the cell at the given row and column to have the value tf, "getNumRows(self)" which returns the number of rows in the game board, and "getNumCols(self)" which returns the number of columns in the game board. Define instance variables "rows", "cols", and "grid". Now that we know this, write the code for Life's constructor. Thus, instead of needing to define our instance variables outside of the constructor and setting their values inside of it, we can simply write "self.variable = value" in our constructor and have "self.variable" serve as an instance variable which can be used by any other methods in the class. One of the first things you should understand about Python is that, unlike Java, it allows you to both define and set the value of instance variables in the same line. In Python, classes have the following format: class :

What you're looking at is a class called "Life". Open the file "life.py" in the "part1" subfolder of the "gameoflife" folder you downloaded. And to just get super meta for a second, a consequence of this is that Game of Life can simulate ITSELF! (#Conwayception) In fact, these rules are so powerful that they actually allow Conway's Game of Life to be Turing Complete, which roughly means that we could perform any computation within the game that a standard computer could (though they would be painfully slow). These extremely simple rules give rise to some incredibly complex and beautiful patterns, as illustrated here:

Each cell changes from one time step to the next according to the following rules: A given cell's neighbors are those cells directly above, below, left, or right of the cell, plus with the cells diagonally adjacent to it (the cells touching its diagonals). Our "Game of Life" board will be an n-by-n grid of square cells, each of which can be either "alive" or "dead".
