[Tutor] More trouble debugging my game of life program
Matt Smith
matt at mattanddawn.orangehome.co.uk
Sun Jun 3 22:12:39 CEST 2007
Hi,
I've got my program working correctly (or so it seems) with my original
data file (r-pentomino.txt - attached) but when I run it with a larger
(30*30) file (big-r-pentomino - also attached) in an attempt to make it
work with out so many edge effects it returns the following error
message:
Traceback (most recent call last):
File "Python/game_of_life/life.py", line 75, in <module>
curses.wrapper(main)
File "curses/wrapper.py", line 44, in wrapper
File "Python/game_of_life/life.py", line 60, in main
draw_board(matrix, stdscr, generation)
File "Python/game_of_life/life.py", line 28, in draw_board
stdscr.addch(y + 1, x + 1, ' ')
_curses.error: addch() returned ERR
I thought I had designed the program to work with any text file as long
as the lines are all the same length so I cannot understand why I get
this error message. When I read through the code I cannot see a reason
why the program should work for one size file and not another. The part
of the program that is failing is just drawing a space character at a
particular location on the screen.
Here is the listing of the program that I have also attached:
#! /usr/bin/env python
# Curses based Game of Life program
# Written by Matt Smith
import curses
from copy import deepcopy
def read_start():
# Read the starting configuration from a text file
file = open('/home/matt/Python/game_of_life/r-pentomino.txt', 'r')
matrix = []
for line in file:
line = line.rstrip('\n')
line_list=[]
for i in range(len(line)):
line_list.append(int(line[i]))
matrix.append(line_list)
return matrix
def draw_board(matrix, stdscr, generation):
# Draw the life board based on the matrix containing the current
state
for x in range(len(matrix[0])):
for y in range(len(matrix)):
if matrix[y][x]:
stdscr.addch(y + 1, x + 1, '*')
else:
stdscr.addch(y + 1, x + 1, ' ')
stdscr.addstr(len(matrix) + 1, 0, 'Generation: %s' % (generation))
stdscr.refresh()
def update_matrix(matrix):
matrix_updated = deepcopy(matrix)
# Perform check for each value in the matrix
for x in range(len(matrix[0])):
for y in range(len(matrix)):
neighbour_count = 0
for n in (x-1, x, x+1):
for m in (y-1, y, y+1):
try:
if matrix[m][n]:
if (n,m) != (x,y):
neighbour_count = neighbour_count + 1
except IndexError:
pass
# Apply game of life rules to each item in the matrix
if neighbour_count < 2:
matrix_updated[y][x] = 0
elif neighbour_count > 3:
matrix_updated[y][x] = 0
elif neighbour_count == 3:
matrix_updated[y][x] = 1
# No need to change value if neighbour count == 2
return matrix_updated
def main(stdscr):
# Initialise some variables and put the screen in it's starting
configuration
matrix = read_start()
generation = 1
draw_board(matrix, stdscr, generation)
stdscr.addstr(len(matrix) + 2, 0,
'Press <space> to advance a generation, <q> to quit.')
# The main program loop - respond to keyboard input
while 1:
key_press = stdscr.getkey()
if key_press == 'q':
break
elif key_press == ' ':
generation = generation + 1
matrix = update_matrix(matrix)
draw_board(matrix, stdscr, generation)
# Run the main program inside the curses wrapper to ensure it leaves the
screen
# in a usable state
curses.wrapper(main)
Can anyone come up with the reason why one input file works and the
other one doesn't??
Thanks,
Matt
-------------- next part --------------
00000000000000000000000000000
00000000000000000000000000000
00000000000000000000000000000
00000000000000000000000000000
00000000000000000000000000000
00000000000000000000000000000
00000000000000000000000000000
00000000000000000000000000000
00000000000000000000000000000
00000000000000000000000000000
00000000000000000000000000000
00000000000000000000000000000
00000000000000000000000000000
00000000000000110000000000000
00000000000001100000000000000
00000000000000100000000000000
00000000000000000000000000000
00000000000000000000000000000
00000000000000000000000000000
00000000000000000000000000000
00000000000000000000000000000
00000000000000000000000000000
00000000000000000000000000000
00000000000000000000000000000
00000000000000000000000000000
00000000000000000000000000000
00000000000000000000000000000
00000000000000000000000000000
00000000000000000000000000000
00000000000000000000000000000
-------------- next part --------------
000000000000000
000000000000000
000000000000000
000000000000000
000000000000000
000000110000000
000001100000000
000000100000000
000000000000000
000000000000000
000000000000000
000000000000000
000000000000000
000000000000000
000000000000000
-------------- next part --------------
A non-text attachment was scrubbed...
Name: life.py
Type: text/x-python
Size: 2590 bytes
Desc: not available
Url : http://mail.python.org/pipermail/tutor/attachments/20070603/508dad81/attachment.py
More information about the Tutor
mailing list