コード例 #1
0
	def setUp(self):
		"""
		Note that this results to a random configuration for every test!
		"""
		self.width = 9
		self.height = 9
		self.color_game = ColorBlocksModel(self.width, self.height)
コード例 #2
0
#! usr/bin/env python

from color_blocks_model import ColorBlocksModel

game = ColorBlocksModel(9, 9)

while True:
	print str(game)
	tuple_toggle = input("toggle>")
	game.score += game.toggle(tuple_toggle[0], tuple_toggle[1])
	game.falldown()
	game.collapse()
	print "Score: " + str(game.score)
コード例 #3
0
class color_blocks_model_tests(unittest.TestCase):
	
	def setUp(self):
		"""
		Note that this results to a random configuration for every test!
		"""
		self.width = 9
		self.height = 9
		self.color_game = ColorBlocksModel(self.width, self.height)
	
	def __modify_model_grid(self, grid):
		"""
		Changes the grid contained in the model self.color_game. The
		only constraint is that the new grid should be the same
		size as the old grid.
		"""
		height = len(grid)
		width = len(grid[0])
		
		for i in range(height):
			for j in range(width):
				self.color_game.grid[i][j] = grid[i][j]
		
		self.assertRaises(DimensionException, ColorBlocksModel, 2, 2)
	
	def test_game_instance(self):
		game_grid = self.color_game.grid
		self.assertEqual(self.height, len(game_grid))
		self.assertEqual(self.width, len(game_grid[0]))
	
	def test_modify_model_grid(self):
		game_grid = [[1 for i in range(self.width)] for j in range(self.height)]
		game_grid[1][1:3] = [0,0]
		game_grid[2][1:3] = [0,0]
		self.__modify_model_grid(game_grid)
		
		self.assertEqual(self.color_game.grid, game_grid)
	
	def test_toggle(self):
		game_grid = [[1 for i in range(self.width)] for j in range(self.height)]
		game_grid[1][1:3] = [0,0]
		game_grid[2][1:3] = [0,0]
		self.__modify_model_grid(game_grid)
		#game.grid = game_grid
		points = self.color_game.toggle(1, 1)
		game_grid[1][1:3] = ColorBlocksModel.UNTAKEN * 2
		game_grid[2][1:3] = ColorBlocksModel.UNTAKEN * 2
		
		self.assertEqual(points, 4)
		self.assertEqual(self.color_game.grid, game_grid)
	
	def __collapse(self, *untake_ranges):
		"""
		Auto script for collapse unit tests that will actually collapse.
		
		Specify the (continuous) columns to untake as ranges.
		"""
		for r in untake_ranges:
			self.__range_col_untake(r)
		
		test_game = [list(self.color_game.grid[row]) for row in range(self.height)]
		
		# "Collapse" board out-of-place
		collapsed = [[] for row in self.color_game.grid]
		
		self.color_game.collapse()
		self.assertNotEqual(test_game, self.color_game.grid)
		
		for col_index in range(self.width):
			if not self.__is_untaken(test_game, col_index):
				row_counter = 0
				
				for row in collapsed:
					row.append(test_game[row_counter][col_index])
					row_counter += 1
		
		# Pad collapsed with untaken cols
		for row in collapsed:
			row.extend([ColorBlocksModel.UNTAKEN for i in range(self.width - len(row))])
		
		# Collapse color_game
		self.assertEqual(collapsed, self.color_game.grid)
	
	def __is_untaken(self, board, col_index):
		for row in board:
			if row[col_index] != ColorBlocksModel.UNTAKEN:
				return False
		
		return True
	
	def __range_col_untake(self, untake_range):
		"""
		Untakes whole columns. The columns should be consecutive and specified
		as an inclusive range.
		
		untake_range is an iterable with at least two items. The first item is the
		low bound of the range while the second one is the high bound of the range.
		"""
		col = untake_range[0]
		
		while col <= untake_range[1]:
			for row in self.color_game.grid:
				row[col] = ColorBlocksModel.UNTAKEN
			
			col += 1
	
	def test_collapse(self):
		self.__collapse((3, 3))
		self.setUp()
		self.__collapse((3, 4))
		self.setUp()
		self.__collapse((3, 3), (5, 5))
		
		# Non-collapsing tests
		self.setUp()
		self.color_game.grid[2][0] = ColorBlocksModel.UNTAKEN
		self.color_game.grid[2][1] = ColorBlocksModel.UNTAKEN
		self.color_game.grid[2][2] = ColorBlocksModel.UNTAKEN
		test_grid = [list(self.color_game.grid[r]) for r in range(self.height)]
		self.color_game.collapse()
		self.assertEqual(test_grid, self.color_game.grid)
	
	def __col_untake(self, col, row):
		"""
		Untakes the cells in index col, for every row as specified in
		iterable row.
		"""
		for r in row:
			self.color_game.grid[r][col] = ColorBlocksModel.UNTAKEN
	
	def test_falldown(self):
		limit = len(self.color_game.grid)
		rlimit = range(limit)
		test_board = [list(self.color_game.grid[i]) for i in rlimit]
		
		untake_list = [6, 7, 8]
		untake_col = 3
		
		self.__col_untake(untake_col, untake_list)
		self.color_game.falldown()
		
		trans_block = range(6)
		trans_block.reverse()
		
		for block in trans_block:
			test_board[block + 3][untake_col] = test_board[block][untake_col]
		
		for untake_row in range(len(untake_list)):
			test_board[untake_row][untake_col] = ColorBlocksModel.UNTAKEN
		
		self.assertEqual(self.color_game.grid, test_board)
		
		self.setUp()
		
		test_board = [list(self.color_game.grid[i]) for i in rlimit]
		untake_list = [6, 7, 8, 0, 1, 2]
		self.__col_untake(untake_col, untake_list)
		self.color_game.falldown()
		
		for block in [5, 4, 3]:
			test_board[block + 3][untake_col] = test_board[block][untake_col]
		
		for untake_row in range(len(untake_list)):
			test_board[untake_row][untake_col] = ColorBlocksModel.UNTAKEN
		
		self.assertEqual(test_board, self.color_game.grid)