git.fiddlerwoaroof.com
cell_engine.py
e0a25cb7
 from __future__ import print_function
 #  
 #  Copyright (c) 2012 Edward Langley
 #  All rights reserved.
 #  
 #  Redistribution and use in source and binary forms, with or without
 #  modification, are permitted provided that the following conditions
 #  are met:
 #  
 #  Redistributions of source code must retain the above copyright notice,
 #  this list of conditions and the following disclaimer.
 #  
 #  Redistributions in binary form must reproduce the above copyright
 #  notice, this list of conditions and the following disclaimer in the
 #  documentation and/or other materials provided with the distribution.
 #  
 #  Neither the name of the project's author nor the names of its
 #  contributors may be used to endorse or promote products derived from
 #  this software without specific prior written permission.
 #  
 #  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 #  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 #  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 #  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 #  HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 #  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
 #  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 #  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 #  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 #  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 #  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #  
 #  
 
 import time
 import random
 import pygame
 import sys
 import collections
 import game
 
 import collections
 
 ############### Cell ################
 class Cell(game.Cell):
 	pass
 
 Cell.add_rule(3)(0)
 Cell.add_rule(2)(3)
 
 @Cell.add_rule(1)
 def hook_1(cell):
 	neighbors = [c and c.value for c in cell.neighbors]
 	neighbor_value = cell.neighbor_value()
 	rnd = random.random()
 	if 2 in neighbors or 3 in neighbors:
 		if rnd < .62 * neighbor_value/2: return 2
 
 	else:
 		if rnd < .01 * neighbor_value:
 			return 0
 
 @Cell.add_rule(0)
 def hook_0(cell):
 	neighbor_value = cell.neighbor_value()
 	if neighbor_value != 0:
 		nearby_fire = set([2,3]) & set(c and c.value for c in cell.neighbors)
 		if nearby_fire == set() and random.random() < .02 * neighbor_value:
 			return 1
 	return cell.value
 
 ########## End Cell #################
 
 class Presence(game.Presence):
 	def act(self):
 		value = int(round( (self.locale.neighbor_value() + self.locale.value) ))
 		self.locale.set_value(0)
 		for x in self.locale.neighbors:
 			if not x: continue
 			if x.value == 1:
 				x.set_value(2)
 
 import time
 
 if __name__ == '__main__':
 	pygame.init()
 	pygame.event.set_allowed([pygame.QUIT, pygame.KEYDOWN])
 	pygame.display.set_caption('Simulator')
 
 	board = game.Board(120, 120)
 	window = pygame.display.set_mode(board.rect.size, pygame.DOUBLEBUF)
 	window.set_alpha(None)
 	for sprite in board.board_group:
 		sprite.image.convert()
 
 	a = game.Controller(board)
 
 	p = a.add_observer(Presence, a.board.init.south)
 	np = a.board.init.southeast
 	for x in range(20):
 		np = np.east
 	np = a.add_observer(Presence, np)
 
 	window.fill( (64,64,64) )
 
 	running = True
 
 	board.board_group.draw(window)
 	pygame.display.flip()
 
 	clck = pygame.time.Clock()
 
 	paused = True
 	while running:
 		clck.tick(80)
 
 		for event in pygame.event.get():
 			if event.type == pygame.QUIT:
 				running=False
 				break
 			elif event.type == pygame.KEYDOWN and event.unicode == 'e':
 				paused = not paused
 			elif event.type == pygame.KEYDOWN and event.unicode == 'w':
 				new = p.locale.north
 				if new:
 					p.locale = new
 			elif event.type == pygame.KEYDOWN and event.unicode == 'a':
 				new = p.locale.west
 				if new:
 					p.locale = new
 			elif event.type == pygame.KEYDOWN and event.unicode == 's':
 				new = p.locale.south
 				if new:
 					p.locale = new
 			elif event.type == pygame.KEYDOWN and event.unicode == 'd':
 				new = p.locale.east
 				if new:
 					p.locale = new
 
 		if not paused:
 			a.step()
 			updates = a.board.board_group.draw(window)
 			pygame.display.update(updates)
 
 		print( clck.get_fps(), '\r', end='' )
 		sys.stdout.flush()