# [Tutor] Variables and Functions

Michael H. Goldwasser goldwamh at slu.edu
Thu Nov 29 04:18:11 CET 2007

```Hello Devon,

Here's a quick [untested] push in the direction of taking the code
you gave below and modeling it as a class using an object-oriented
design. With this code, you could then create an instance of a puzzle as:

toughOne = Sudoku()
toughOne.play_game()

Within the class definition, variables that you need to have shared
between the differnt functions are qualified as instance variables
using the syntax self.blah  (as in self.puzzle and self.new_puzzle).
Unqualified variables are local to an individual function and
cannot be shared.

With regard,
Michael

class Sudoku:
def __init__(self):
self.puzzle = [[1,2,3,4,5,6,7,8,9],
[4,5,6,7,8,9,1,2,3],
[7,8,9,1,2,3,4,5,6],
[2,3,4,5,6,7,8,9,1],
[5,6,7,8,9,1,2,3,4],
[8,9,1,2,3,4,5,6,7],
[3,4,5,6,7,8,9,1,2],
[6,7,8,9,1,2,3,4,5],
[9,1,2,3,4,5,6,7,8]]
num_of_swap = random.randint(10,20)
for i in range(num_of_swap):
row1 = random.randint(0,8)
row2 = random.randint(0,8)
if row1/3 == row2/3:
self.swap_row(row1,row2)
self.new_puzzle = copy.deepcopy(puzzle)
sparseness = 0.85
for i in range(9):
for j in range(9):
if random.uniform(0,1) < sparseness:
self.new_puzzle[i][j] = ''

def swap_row(self,row1,row2):
temp = self.puzzle[row1]
self.puzzle[row1] = self.puzzle[row2]
self.puzzle[row2] = temp

def play_game(self):
'''Here is where I need the variables 'puzzle' and 'new_puzzle' to be brought.'''
pass

+-----------------------------------------------
| Michael Goldwasser
| Associate Professor
| Dept. Mathematics and Computer Science
| Saint Louis University
| 220 North Grand Blvd.
| St. Louis, MO 63103-2007
|
| Office: Ritter Hall 6
| Email:  goldwamh at slu dot edu
| URL:    euler.slu.edu/~goldwasser

On Wednesday November 28, 2007, Devon MacIntyre wrote:

>    Hi,
>
>    I have two functions, 'new_sudoku' and 'play_game'. In new_sudoku, I have a
>    pre-determined puzzle (I wasn't able to get a randomly generated puzzle
>    working), as a matrix in the variable 'puzzle'. I imported the 'copy' module
>    and made a deep-copy of 'puzzle' to make 'new_puzzle', which randomly has
>    85% of the digits replaced by an empty string. Now that 'new_puzzle' is only
>    15% filled with numbers, I use turtle to place the numbers on a grid that I
>    made (also with turtle). After the grid and 'new_puzzle' are generated, I
>    ask the player if he/she wants to begin playing. If yes, then the function
>    'play_game' is started. Here, I'm going to let the player choose spots to
>    input their own numbers to fill in the board. My problem is that I can't get
>    the variables 'puzzle' and 'new_puzzle' into that function (to be compared)
>    because they are not globally defined; only in 'new_sudoku' function. Here's
>    some selected code from my program:
>
>    def swap_row(puzzle,row1,row2):
>        temp = puzzle[row1]
>        puzzle[row1] = puzzle[row2]
>        puzzle[row2] = temp
>
>    def new_sudoku():
>        puzzle = [[1,2,3,4,5,6,7,8,9], \
>                  [4,5,6,7,8,9,1,2,3], \
>                  [7,8,9,1,2,3,4,5,6], \
>                  [2,3,4,5,6,7,8,9,1], \
>                  [5,6,7,8,9,1,2,3,4], \
>                  [8,9,1,2,3,4,5,6,7], \
>                  [3,4,5,6,7,8,9,1,2], \
>                  [6,7,8,9,1,2,3,4,5], \
>                  [9,1,2,3,4,5,6,7,8]]
>        num_of_swap = random.randint(10,20)
>        for i in range(num_of_swap):
>            row1 = random.randint(0,8)
>            row2 = random.randint(0,8)
>            if row1/3 == row2/3:
>                swap_row(puzzle,row1,row2)
>        new_puzzle = copy.deepcopy(puzzle)
>        sparseness = 0.85
>        for i in range(9):
>            for j in range(9):
>                if random.uniform(0,1) < sparseness:
>                    new_puzzle[i][j] = ''
>
>    def play_game():
>        '''
>        Here is where I need the variables 'puzzle' and 'new_puzzle' to be
>    brought.
>        '''

```