Esempio n. 1
0
    def __init__(self):

        # environment parameters
        self.world = WorldMap()
        # number of defenders and intruders
        self.dcount = Config.DEFENDER_COUNT
        self.icount = Config.INTRUDER_COUNT

        self.lock = Value('i', 1)

        self.episode_count = Value('i', 0)

        self.init_dstates = []
        self.init_istates = []
        for d in range(self.dcount):
            self.init_dstates.append((-5+12*d, 7-3*d, 0))
        for i in range(self.icount):
            self.init_istates.append((5-2*i, 10+i, 0))

        self.dstates = Array(state_structure, self.init_dstates)
        self.istates = Array(state_structure, self.init_istates)

        self.done = Value('i', 0)

        # defenders and intruders
        self.defenders = [] # all the defender objectives
        self.intruders = []
        for i in range(self.icount):
            self.intruders.append(ProcessIntruder(self, i, self.istates[i], self.episode_count))
            self.intruders[i].daemon = True
        for d in range(self.dcount):
            self.defenders.append(ProcessDefender(self, d, self.dstates[d], self.episode_count))
            self.defenders[d].daemon = True
	def __init__(self, main):
		# transition from another state
		super(GameState, self).__init__(main)
		self.loadPlayer()

		# Initialize World
		self.wl = WorldLoader(config.WORLD_NAME)

		# Initialize World Map
		self.worldMap = WorldMap(self.wl)
		startMap = os.path.join("tygra", "0_0.map")

		# Starting map
		self.environment = self.wl.getMap(startMap, self.worldMap)
		self.currentMap = startMap


		# Initialize HUD
		self.hud = HUDManager()
		#TODO: FIX MUSIC pygame.mixer.init() filename = "worldAmbient.ogg"

		GameState.enemyGroup.add(Enemy(self, self.player.rect.left - 50, self.player.rect.top - 50, "skeleton"))
		GameState.enemyGroup.sprites()[0].movetowards(self.player.rect.left, self.player.rect.top)

		#''' npc_one = NPC(self, 30, 30, "Skeleton") '''
		'''TODO: FIX MUSIC
    def __init__(self, propsfile):
        self.canvas = Tk()

        self.props = json.load(open(propsfile))
        self.worldMap = WorldMap(propsfile)

        self.wg = WorldGrid(self.canvas, self.props, self.worldMap)
        self.wg.registerCallBack(self.processEvent)

        self.robot = Robot(self.props, self.worldMap)
        self.robot.registerSenseCallBack(self.sense)
        self.robot.registerMoveCallBack(self.move)

        self.rRow = -1
        self.rCol = -1

        self.randomizeRobotPosition()
        self.robot.sense()
        self.shadeSquares()
Esempio n. 4
0
def generatemap(level, key):
    map = WorldMap()
    map.playerPosX = WorldMapSize / 2
    map.playerPosY = WorldMapSize / 2
    map.exitPosX = WorldMapSize
    map.exitPosY = WorldMapSize / 2
    generateObstacles(map, level)
    map.worldmap[map.playerPosX][map.playerPosY] = 'P'

    map.worldmap[map.exitPosX][map.exitPosY] = 'E'

    if key:
        col = map.worldmap[WorldMapSize - 5]
        x = len(col)/2
        col[x] = 'K'
        col = map.worldmap[WorldMapSize - 3]
        for i, _ in enumerate(col):
            if i == len(col) / 2:
                col[i] = 'D'
            else:
                col[i] = 'W'

    return map
Esempio n. 5
0
    def run(self):
        """
        WorldMap creation, Beast and food positioning, game mechanics and final
        creation of ranking list
        also calling of the Visualisation and beastAnalytics
        """
        self.running = True
        if self.useNetworking:
            self.server.prepareGameStart()
                
        # ensure that at least configured minimum number of beasts are registered:
        availableBeasts = ['NikolaisBeast()', 'SamysBeast()', 'Team8Beast()']
        while (self.gameSignOnPossible() and len(self.beastObjectMap) < Config.__getMinimumBeasts__()):
            self.registerBeast(eval(random.choice(availableBeasts)))

        #final beastObjectMap gets passed to beastAnalytics
        if self.useBeastAnalytics:
            self.beastAnalytics.setBeastObjectMap(self.beastObjectMap)

        self.gameStarted = True
        
        #size = number of beast * value of fieldFactor(Config) * 25(beast-View)
        size = len(self.beastObjectMap) * Config.__getFieldFactor__() * 25
        self.worldMap = WorldMap(size, self)
        self.worldMap.placeBeasts()
        self.worldMap.placeStartFood()
        
        #calls outsourced round mechanic
        self.doRounds()
        self.gameFinished = True
        
        for beastObject in self.beastObjectMap.values():
            #this sends the last ten rounds to client after game is finished
            beastObject.beast.bewege(str(beastObject.energy) + ';' + 'Ende' + ';' + self.worldMap.getLastTenRoundsAsString() + ';')
          
        self.log.info(self.getRankingList())
        #BeastAnalytics
        if self.useBeastAnalytics and self.enableUrwidVisualisation == False:
            for i in range(len(self.getStatisticForBeast)):
                self.log.info(self.beastAnalytics.getStatistic(self.getStatisticForBeast[i]))
                self.beastAnalytics.getStatisticFile(self.getStatisticForBeast[i])

        # Added to stop Thread
        self.stop()
	def __init__(self,propsfile):
		self.canvas = Tk()
		
		self.props = json.load(open(propsfile))
		self.worldMap = WorldMap(propsfile)
		
		self.wg = WorldGrid(self.canvas,self.props,self.worldMap)
		self.wg.registerCallBack(self.processEvent)
		
		self.robot = Robot(self.props,self.worldMap)
		self.robot.registerSenseCallBack(self.sense)
		self.robot.registerMoveCallBack(self.move)
		
		self.rRow = -1
		self.rCol = -1

		self.randomizeRobotPosition()
		self.robot.sense()
		self.shadeSquares()
Esempio n. 7
0
import time
import sys
import random
from PyQt5.QtWidgets import QApplication

sys.path.insert(0, ".")
from WorldMap import WorldMap
from WorldUI import WorldUI
from WorldUnits import UnitOrganic
from WorldProtocols import CreateUnit

if __name__ == "__main__":
    app = QApplication(sys.argv)

    wmap = WorldMap(5, 5, "#000")
    wmap.append_protocol(CreateUnit(2, 2, UnitOrganic()))

    wui = WorldUI(wmap)
    app.exec_()
class GameState(State):
	'''
		State for game playing mode.
	'''
	bgGroup = pygame.sprite.OrderedUpdates()
	playerGroup = pygame.sprite.RenderPlain()
	guiGroup = pygame.sprite.OrderedUpdates()
	enemyGroup = pygame.sprite.RenderPlain()
	weaponGroup = pygame.sprite.RenderPlain()
	player = None
	terrainLayer = None
	cachedPathGraph = None
	curPathGraph = None

	def getPlayer():
		assert(player != None)
		return GameState.player

	@staticmethod
	def getCurrentAtMap():
		assert(GameState.terrainLayer != None)
		return GameState.terrainLayer.getMap().getAtLayer()

	def __init__(self, main):
		# transition from another state
		super(GameState, self).__init__(main)
		self.loadPlayer()

		# Initialize World
		self.wl = WorldLoader(config.WORLD_NAME)

		# Initialize World Map
		self.worldMap = WorldMap(self.wl)
		startMap = os.path.join("tygra", "0_0.map")

		# Starting map
		self.environment = self.wl.getMap(startMap, self.worldMap)
		self.currentMap = startMap


		# Initialize HUD
		self.hud = HUDManager()
		#TODO: FIX MUSIC pygame.mixer.init() filename = "worldAmbient.ogg"

		GameState.enemyGroup.add(Enemy(self, self.player.rect.left - 50, self.player.rect.top - 50, "skeleton"))
		GameState.enemyGroup.sprites()[0].movetowards(self.player.rect.left, self.player.rect.top)

		#''' npc_one = NPC(self, 30, 30, "Skeleton") '''
		'''TODO: FIX MUSIC
		pygame.mixer.init()
		filename = "worldAmbient.ogg"

		path = os.path.join(util.GAME_SOUNDS, filename)
		path = util.filepath(path)
		pygame.mixer.music.load(path)
		pygame.mixer.music.play()
		'''

	def __del__(self):
		# transition to another state
		super(GameState, self).__del__()

	def loadPlayer(self):
		self.player = Player(self)
		self.player.mapPos = [0,0]

		GameState.playerGroup.add(self.player)

	def update(self, clock):
		super(GameState, self).update(clock)
		GameState.guiGroup.update(clock)

		enemies = [enemy for enemy in GameState.enemyGroup]
		surfaces = [surface for surface in self.environment.atGroup]

		GameState.playerGroup.update(clock, self.player, enemies, surfaces)
		GameState.enemyGroup.update(clock, self.player, enemies, surfaces)
		GameState.weaponGroup.update(clock, self.player, enemies, surfaces)

		self.worldMap.update(clock)

		self.hud.update(clock, self.player)

	def handleEvent(self):
		super(GameState, self).handleEvent()
		self.sudoNext()
		# handle mouse
		mousePos = Vector2(pygame.mouse.get_pos())
		self.player.orient(mousePos)
		for event in pygame.event.get():
			if event.type == pygame.MOUSEBUTTONDOWN:
				if pygame.mouse.get_pressed()[0]:
					self.player.swingSword()
				if pygame.mouse.get_pressed()[2]:
					self.player.useMagic()

	def sudoNext(self):
	#Used for debugging,
		from config import keyboard, keymap
		mmap = None
		if keyboard.downup(keymap.DUP):
			mmap = self.wl.north[self.currentMap]
		elif keyboard.downup(keymap.DDOWN):
			mmap = self.wl.south[self.currentMap]
		elif keyboard.downup(keymap.DLEFT):
			mmap = self.wl.west[self.currentMap]
		elif keyboard.downup(keymap.DRIGHT):
			mmap = self.wl.east[self.currentMap]
		if mmap is not None:
			self.currentMap = mmap
			print "MAP: ", mmap
			self.environment = self.wl.getMap(mmap, self.worldMap)

			# Added for debugging purposes. Remove when not needed
			print "MAP: ", mmap

	def nextMap(self, direction, pos):
		# print "moving to: " + direction + " via: " + str(pos)
		mmap = None

		if direction == 'up':
			mmap = self.wl.north[self.currentMap]
			# update player mapPos
			self.player.mapPos[1] -= 1
			# position player at bottom minus almost half a tile
			if mmap is not None:
				self.player.setPos(pos[0], config.HEIGHT - 17)
		elif direction == 'down':
			mmap = self.wl.south[self.currentMap]
			self.player.mapPos[1] += 1
			if mmap is not None:
				self.player.setPos(pos[0], 17)
		elif direction == 'right':
			self.player.mapPos[0] += 1
			mmap = self.wl.east[self.currentMap]
			if mmap is not None:
				self.player.setPos(64 + 17, pos[1]) # just not touching the hud
		elif direction == 'left':
			self.player.mapPos[0] -= 1
			mmap = self.wl.west[self.currentMap]
			if mmap is not None:
				self.player.setPos(config.WIDTH - (64 + 17), pos[1])

		if mmap is not None:
			self.currentMap = mmap
			self.environment = self.wl.getMap(mmap, self.worldMap)

			# Added for debugging purposes. Remove when not needed
			print "MAP: ", mmap
			GameState.enemyGroup.empty()
			GameState.enemyGroup.add(Enemy(self, randrange(1, config.WIDTH), randrange(1, config.HEIGHT), "skeleton"))
			GameState.enemyGroup.add(Enemy(self, randrange(1, config.WIDTH), randrange(1, config.HEIGHT), "skeleton"))
			GameState.enemyGroup.add(Enemy(self, randrange(1, config.WIDTH), randrange(1, config.HEIGHT), "skeleton"))
			GameState.weaponGroup.empty()

	def draw(self):
		#draw environment
		self.environment.drawBackground(self.main.screen);

		# draw player
		GameState.playerGroup.draw(self.main.screen)

		# draw enemies
		GameState.enemyGroup.draw(self.main.screen)

		# draw weapons
		GameState.weaponGroup.draw(self.main.screen)

		# draw gui
		self.hud.draw(self.main.screen)

		# draw foreground
		self.environment.drawForeground(self.main.screen)

		# draw world map
		self.worldMap.draw(self.main.screen)

		# flip screen
		super(GameState, self).draw()
Esempio n. 9
0
class Game(threading.Thread):
    """ 
    global Game class
    here will your beast be registered and seated on WorldMap after it has been 
    created (dependend on the number of beasts)
    """

    def __init__(self, getStatisticForBeast=None):
        """
        constructor --> initialising Variables
        @param getStatisticForBeast List: insert a tupel of chars ('a','b')
        """
        threading.Thread.__init__(self)
        self.server = None
        self.gui = None
        self.beastObjectMap = {}
        self.rankingList = []
        self.worldMap = None
        self.foodCounter = 0
        self.enableUrwidVisualisation = Config.__getUseUrwidVisualisation__()
        self.useNetworking = Config.__getUseNetworking__()
        self.startTimeMillis = time.time() + Config.__getStartInSeconds__()
        self.startTime = time.ctime(self.startTimeMillis)
        self.roundCounter = 0
        self.getStatisticForBeast = getStatisticForBeast
        self.useBeastAnalytics = True if(getStatisticForBeast) else False
        self.deadBeasts = 0
        self.urwidRoundDelay = Config.__getUrwidRoundDelay__() / 1000.0
        self.gameStarted = False
        self.gameFinished = False
        self.running = False
        self.log = logging.getLogger('beast-arena-logging')

        if self.enableUrwidVisualisation:
            self.useBeastAnalytics = True
            self.getStatisticForBeast = ''
        self.beastAnalytics = BeastAnalytics() if(self.useBeastAnalytics) else False


    def registerBeast(self, beast):
        """
        registers a Beast instance: give it a name, create a BeastObject 
        instance and store it in internal dictionary 'beastObjectMap'.
        This method is called when a new Beast joins.
        @param beast Beast: is the clients beast
        @return returns the beast's name
        """

        #recursive call for every beast in passed beast array
        if isinstance(beast,list):
            for b in beast:
                self.registerBeast(b)

        if self.gameSignOnPossible():
            name = string.ascii_letters[len(self.beastObjectMap)]
        else:
            self.log.warning('registered beast limit reached')
            return
            
        beastObject = BeastObject(beast, name, self.beastAnalytics)
        self.rankingList.append(None) # generates proper length of rankingList
        self.beastObjectMap[name] = beastObject
        
        self.log.info("beast " + name + " registered")
        return name
    
    def getStartInSeconds(self):
        return str(self.startTimeMillis-time.time())
    
    def run(self):
        """
        WorldMap creation, Beast and food positioning, game mechanics and final
        creation of ranking list
        also calling of the Visualisation and beastAnalytics
        """
        self.running = True
        if self.useNetworking:
            self.server.prepareGameStart()
                
        # ensure that at least configured minimum number of beasts are registered:
        availableBeasts = ['NikolaisBeast()', 'SamysBeast()', 'Team8Beast()']
        while (self.gameSignOnPossible() and len(self.beastObjectMap) < Config.__getMinimumBeasts__()):
            self.registerBeast(eval(random.choice(availableBeasts)))

        #final beastObjectMap gets passed to beastAnalytics
        if self.useBeastAnalytics:
            self.beastAnalytics.setBeastObjectMap(self.beastObjectMap)

        self.gameStarted = True
        
        #size = number of beast * value of fieldFactor(Config) * 25(beast-View)
        size = len(self.beastObjectMap) * Config.__getFieldFactor__() * 25
        self.worldMap = WorldMap(size, self)
        self.worldMap.placeBeasts()
        self.worldMap.placeStartFood()
        
        #calls outsourced round mechanic
        self.doRounds()
        self.gameFinished = True
        
        for beastObject in self.beastObjectMap.values():
            #this sends the last ten rounds to client after game is finished
            beastObject.beast.bewege(str(beastObject.energy) + ';' + 'Ende' + ';' + self.worldMap.getLastTenRoundsAsString() + ';')
          
        self.log.info(self.getRankingList())
        #BeastAnalytics
        if self.useBeastAnalytics and self.enableUrwidVisualisation == False:
            for i in range(len(self.getStatisticForBeast)):
                self.log.info(self.beastAnalytics.getStatistic(self.getStatisticForBeast[i]))
                self.beastAnalytics.getStatisticFile(self.getStatisticForBeast[i])

        # Added to stop Thread
        self.stop()
        
    def doRounds(self):
        """
        round mechanic -runs until maxRounds are reached or only 1 beast remains
        random food positioning and calling of move() for every beast
        """
        while (self.roundCounter < Config.__getMaxRounds__() and \
                    self.deadBeasts < len(self.beastObjectMap) - 1 and self.running):
            #Generate/Save WorldMap state of last round

            self.foodCounter = 0 #needed for food arrangement
            for beastObject in self.beastObjectMap.values():
                self.arrangeFoodEveryRound()
                
                #calls move() for every beast, also if it's already dead    
                beastObject.move(self.worldMap)                
                if self.enableUrwidVisualisation and beastObject.energy > 0:
                    time.sleep(self.urwidRoundDelay)
                    
            self.arrangeFoodEveryRound(whileRoundState=False)
            self.worldMap.insertWorldToLastTenRoundsAsString()
            self.roundCounter += 1                             

            #BeastAnalytics
            if self.useBeastAnalytics:
                self.beastAnalytics.nextRound()
        
    def arrangeFoodEveryRound(self, whileRoundState=True):
        """
        arranges the correct number of food items every round
        @param whileRoundState (default=True) marks if this method is called 
        while or at the end of a round
        """
        if whileRoundState:
            #calls placeFoodItem once per per 3/5 beast
            rnd = random.randint(1, len(self.beastObjectMap))
            if rnd in range(len(self.beastObjectMap) * 3 / 5) and \
                            self.foodCounter < len(self.beastObjectMap) * 3 / 5:
                self.worldMap.placeFoodItem()
                self.foodCounter += 1  
        else:
            # is called if not enough food has been rained
            if self.foodCounter < len(self.beastObjectMap) * 3 / 5:
                
                counter = 0
                while counter in range(len(self.beastObjectMap) * 3 / 5 - self.foodCounter):
                    self.worldMap.placeFoodItem()
                    counter += 1
                    
    def getBeastByName(self, name):
        """
        @param name String: beast name
        @return socket, srcAddr: Returns client-socket, client-source-address of given beast-name from BeastObjectMap
        """
        beast = self.beastObjectMap.get(name)
        return beast.socket, beast.srcAddr
    
    def gameSignOnPossible(self):
        """
        Checks if game is full or has already started
        @return Boolean 
        """
        if not(self.gameStarted) and (len(self.beastObjectMap) < len(string.ascii_letters)):
            return True
        return False

    def getRankingList(self):
        """
        calculates the ranking of the beasts depending on their time of death or
        their remaining energy
        @return String: the ranking list of the beasts
        """
        survivedBeasts = []
        for beast in self.beastObjectMap.values():
            if beast.alive:
                survivedBeasts.append(beast)
        tmp = sorted(survivedBeasts, key=lambda BeastObject:BeastObject.energy, reverse=True)
        for i in range(len(tmp)):
            self.rankingList[i] = tmp[i]
   
        #Create return string
        dots=lambda x: x>=9 and'.'*12 or'.'*13
        returnString = 'Ranking:\n'
        for i in range(len(self.rankingList)):
            returnString += str(i + 1) + str(dots(i)) + str(
                self.rankingList[i]) + ' with ' + str(
                    self.rankingList[i].energy) + ' energy\n'          
        return returnString
            
    def markDeadBeast(self, name):
        """
        marks beasts who died in a fight as dead and writes them in the 
        rankingList (LIFO)
        @param name String: puts in the name of the dead beast
        """
        self.rankingList[len(self.rankingList) - 1 - self.deadBeasts] = self.beastObjectMap[name]
        self.deadBeasts += 1

    def setupUrwid(self):
        """
        checks if urwid should be used and starts its loops
        """
        if self.enableUrwidVisualisation: 
            #update content Loop:
            self.gui.start()            
            #main urwid loop:
            self.gui.runLoop()
            
    def stop(self):
        """
        stops game thread
        """
        self.running = False
class Simulation:
    def __init__(self, propsfile):
        self.canvas = Tk()

        self.props = json.load(open(propsfile))
        self.worldMap = WorldMap(propsfile)

        self.wg = WorldGrid(self.canvas, self.props, self.worldMap)
        self.wg.registerCallBack(self.processEvent)

        self.robot = Robot(self.props, self.worldMap)
        self.robot.registerSenseCallBack(self.sense)
        self.robot.registerMoveCallBack(self.move)

        self.rRow = -1
        self.rCol = -1

        self.randomizeRobotPosition()
        self.robot.sense()
        self.shadeSquares()

    def randomizeRobotPosition(self):
        # randomly select the starting robot location --
        # do this until a valid square (i.e., not a wall) is
        # selected
        found = False
        while (found == False):
            row = random.randint(0, self.worldMap.nRows - 1)
            col = random.randint(0, self.worldMap.nCols - 1)
            if (self.worldMap.isValidSquare(row, col)):
                found = True
                self.rRow = row
                self.rCol = col

    def move(self, dirc):

        row = self.rRow
        col = self.rCol
        if (dirc == 1):  # NORTH
            row -= 1
        elif (dirc == 2):  # EAST
            col += 1
        elif (dirc == 4):  # SOUTH
            row += 1
        elif (dirc == 8):  # WEST
            col -= 1
        else:
            print "ERROR: Invalid move direction"

        self.rRow = row
        self.rCol = col

    def sense(self):

        # NORTH
        meas = 0
        if (self.worldMap.isValidSquare(self.rRow - 1, self.rCol)):
            meas = meas | 1

        # EAST
        if (self.worldMap.isValidSquare(self.rRow, self.rCol + 1)):
            meas = meas | 2

        # SOUTH
        if (self.worldMap.isValidSquare(self.rRow + 1, self.rCol)):
            meas = meas | 4

        # WEST
        if (self.worldMap.isValidSquare(self.rRow, self.rCol - 1)):
            meas = meas | 8

        return meas

    def run(self):
        self.wg.draw()

        self.shadeSquares()

        self.wg.drawRobot(self.rRow, self.rCol)
        self.canvas.geometry(self.props["windowDimensions"])
        self.canvas.mainloop()

    def shadeSquares(self):
        probabilities = self.robot.mapProbabilities
        for i in range(0, len(probabilities)):
            for j in range(0, len(probabilities[i])):
                if (self.worldMap.isWall(i, j) == False):
                    if (self.robot.mapProbabilities[i][j] > 0):
                        # 0 is black, 255 is white
                        c = 125 - math.floor(
                            self.robot.mapProbabilities[i][j] * 125.0)
                        #c = 255 - int(self.robot.mapProbabilities[i][j]*255.0)
                        cstr = "#%02x%02x%02x" % (0, c, 0)
                        self.wg.shadeSquare(i, j, cstr)
                    else:
                        cstr = "#%02x%02x%02x" % (255, 255, 255)
                        self.wg.shadeSquare(i, j, cstr)

    def processEvent(self, event):
        self.robot.move()
        self.robot.sense()
        self.shadeSquares()
        self.wg.drawRobot(self.rRow, self.rCol)
class Simulation:

	def __init__(self,propsfile):
		self.canvas = Tk()
		
		self.props = json.load(open(propsfile))
		self.worldMap = WorldMap(propsfile)
		
		self.wg = WorldGrid(self.canvas,self.props,self.worldMap)
		self.wg.registerCallBack(self.processEvent)
		
		self.robot = Robot(self.props,self.worldMap)
		self.robot.registerSenseCallBack(self.sense)
		self.robot.registerMoveCallBack(self.move)
		
		self.rRow = -1
		self.rCol = -1

		self.randomizeRobotPosition()
		self.robot.sense()
		self.shadeSquares()
		
	def randomizeRobotPosition(self):
		# randomly select the starting robot location --
		# do this until a valid square (i.e., not a wall) is 
		# selected
		found = False
		while (found == False):
			row = random.randint(0,self.worldMap.nRows-1)
			col = random.randint(0,self.worldMap.nCols-1)
			if(self.worldMap.isValidSquare(row,col)):
				found = True
				self.rRow = row
				self.rCol = col


	def move(self,dirc):
		
		row = self.rRow
		col = self.rCol
		if(dirc == 1):	# NORTH
			row -= 1
		elif(dirc == 2):   # EAST
			col += 1
		elif(dirc == 4):   # SOUTH
			row += 1
		elif(dirc == 8):	# WEST
			col -= 1
		else:
			print "ERROR: Invalid move direction"
		
		self.rRow = row
		self.rCol = col
		
	def sense(self):
		
		# NORTH
		meas = 0
		if(self.worldMap.isValidSquare(self.rRow-1,self.rCol)):
			meas = meas | 1
		
		# EAST
		if(self.worldMap.isValidSquare(self.rRow,self.rCol+1)):
			meas = meas | 2
			
		# SOUTH
		if(self.worldMap.isValidSquare(self.rRow+1,self.rCol)):
			meas = meas | 4
			
		# WEST
		if(self.worldMap.isValidSquare(self.rRow,self.rCol-1)):
			meas = meas | 8
		
		return meas
		
		
	def run(self):
		self.wg.draw()
		
		self.shadeSquares()
				
		self.wg.drawRobot(self.rRow,self.rCol)
		self.canvas.geometry(self.props["windowDimensions"])
		self.canvas.mainloop()

	def shadeSquares(self):
		probabilities = self.robot.mapProbabilities
		for i in range(0,len(probabilities)):
			for j in range(0,len(probabilities[i])):
				if(self.worldMap.isWall(i,j)==False):
					if(self.robot.mapProbabilities[i][j]>0):      
						# 0 is black, 255 is white
						c = 125 - math.floor(self.robot.mapProbabilities[i][j]*125.0)
						#c = 255 - int(self.robot.mapProbabilities[i][j]*255.0)
						cstr = "#%02x%02x%02x" % (0,c,0)
						self.wg.shadeSquare(i,j,cstr)
					else:
						cstr = "#%02x%02x%02x" % (255,255,255)
						self.wg.shadeSquare(i,j,cstr)
						
	def processEvent(self,event):
		self.robot.move()
		self.robot.sense()
		self.shadeSquares()
		self.wg.drawRobot(self.rRow,self.rCol)