Skip to content
This repository has been archived by the owner on Aug 29, 2019. It is now read-only.

Commit

Permalink
Path finding
Browse files Browse the repository at this point in the history
  • Loading branch information
vishwasns99 committed Jan 21, 2019
1 parent 5430b3f commit 30e1267
Show file tree
Hide file tree
Showing 9 changed files with 8,679 additions and 68 deletions.
2,271 changes: 2,271 additions & 0 deletions compiled_bot1.js

Large diffs are not rendered by default.

2,278 changes: 2,278 additions & 0 deletions compiled_bot2.js

Large diffs are not rendered by default.

2,194 changes: 2,194 additions & 0 deletions compiled_bot3.js

Large diffs are not rendered by default.

Binary file added final_bot/__pycache__/heap.cpython-35.pyc
Binary file not shown.
56 changes: 56 additions & 0 deletions final_bot/heap.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
class Heap(object):
""""
Attributes:
heap: List representation of the heap
compar(p, c): comparator function, returns true if the relation between p and c is parent-chield
"""
def __init__(self, compar):
self.heap = []
self.compar = compar

def is_empty(self):
return len(self.heap) == 0

def _inv_heapify(self, element_id):
"""
Do heapifying starting from bottom till it reaches the root.
"""
while element_id > 0:
if self.compar(self.heap[element_id // 2], self.heap[element_id]):
return
self.heap[element_id // 2], self.heap[element_id] = self.heap[element_id], self.heap[element_id // 2]
element_id //=2

def _heapify(self, element_id):
"""
Do heepifying starting from the root.
"""
l = len(self.heap)
if l == 1:
return
while 2 * element_id < l:
el_id = 2 * element_id
if 2 * element_id + 1 < l and self.compar(self.heap[element_id * 2 + 1], self.heap[element_id * 2]):
el_id += 1
if self.compar(self.heap[element_id], self.heap[el_id]):
return
self.heap[element_id], self.heap[el_id] = self.heap[el_id], self.heap[element_id]
element_id = el_id

def del_min(self):
if self.is_empty():
return None
x = self.heap.pop(0)
if not self.is_empty():
self.heap = [self.heap[-1]] + self.heap[0:-1]
self._heapify (0)
return x

def min(self):
if self.is_empty():
return None
return self.heap[0]

def add(self, element):
self.heap.append(element)
self._inv_heapify (len (self.heap) - 1)
68 changes: 42 additions & 26 deletions final_bot/path_finding.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@

import heap

class Node():
"""A node class for A* Pathfinding"""
Expand All @@ -14,6 +14,9 @@ def __init__(self, parent=None, position=None):
def __eq__(self, other):
return self.position == other.position

def compare(parent, child):
return parent.f <= child.f

def astar(maze, start, end):
"""Returns a list of tuples as a path from the given start to the given end in the given maze"""

Expand All @@ -24,26 +27,27 @@ def astar(maze, start, end):
end_node.g = end_node.h = end_node.f = 0

# Initialize both open and closed list
open_list = []
closed_list = []
open_heap = heap.Heap(compare)
closed_list = [[0 for i in range(len(maze))] for i in range(len(maze))]
open_list = [[0 for i in range(len(maze))] for i in range(len(maze))]


# Add the start node
open_list.append(start_node)
open_heap.add(start_node)
x,y = start_node.position
open_list[x][y] = 1

# Loop until you find the end
while len(open_list) > 0:
while not open_heap.is_empty():

# Get the current node
current_node = open_list[0]
current_index = 0
for index, item in enumerate(open_list):
if item.f < current_node.f:
current_node = item
current_index = index
current_node = open_heap.min()

# Pop current off open list, add to closed list
open_list.pop(current_index)
closed_list.append(current_node)
open_heap.del_min()
x,y = current_node.position
closed_list[x][y] = 1
open_list[x][y] = 0

# Found the goal
if current_node == end_node:
Expand All @@ -52,7 +56,7 @@ def astar(maze, start, end):
while current is not None:
path.append(current.position)
current = current.parent
return path[::-1] # Return reversed path
return path # Return reversed path

# Generate children
children = []
Expand All @@ -66,7 +70,7 @@ def astar(maze, start, end):
continue

# Make sure walkable terrain
if maze[node_position[0]][node_position[1]] != 1:
if maze[node_position[0]][node_position[1]] != True:
continue

# Create new node
Expand All @@ -79,26 +83,38 @@ def astar(maze, start, end):
for child in children:

# Child is on the closed list
for closed_child in closed_list:
if child == closed_child:
continue
x,y = child.position
if closed_list[x][y]:
continue

# Create the f, g, and h values
child.g = current_node.g + 1
child.h = ((child.position[0] - end_node.position[0]) ** 2) + ((child.position[1] - end_node.position[1]) ** 2)
child.f = child.g + child.h

# Child is already in the open list
for open_node in open_list:
if child == open_node and child.g > open_node.g:
continue
if open_list[x][y]:
continue

# Add the child to the open list
open_list.append(child)
open_heap.add(child)
x,y = child.position
open_list[x][y] = 1


def main():

m = [
[True, True, True, True, False, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, False, False, True, True, True, True],
[True, False, False, False, False, False, False, False, False, False, True, True, True, True, True, True, True, True, True, True, True, True, False, False, False, False, False, False, False, False, False, True],
[True, False, False, False, False, True, True, False, False, False, True, True, True, True, True, True, True, True, True, True, True, True, False, False, False, True, True, False, False, False, False, True],
[True, True, False, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, False, False, True, True],
[True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True],
[True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True],
[True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True],
[True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True], [True, True, True, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, False, True, True, True], [True, True, False, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, False, False, True, True], [True, True, False, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, False, False, True, True], [True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True], [True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True], [True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True], [True, True, True, True, True, True, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, False, True, True, True, True, True, True], [True, True, True, True, True, False, False, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, False, False, False, True, True, True, True, True], [True, True, True, True, True, False, False, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, False, False, False, True, True, True, True, True], [True, True, True, True, True, False, False, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, False, False, False, True, True, True, True, True], [True, True, True, True, True, False, False, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, False, False, False, True, True, True, True, True], [True, False, False, True, False, False, False, False, False, True, True, True, False, True, True, True, True, True, True, False, True, True, True, False, False, False, False, False, True, False, False, True], [True, True, True, False, False, False, False, False, False, False, False, False, False, False, True, True, True, True, False, False, False, False, False, False, False, False, False, False, False, True, True, True], [True, True, True, True, True, True, True, False, False, False, False, False, False, False, True, True, True, True, False, False, False, False, False, False, False, True, True, True, True, True, True, True], [True, True, True, True, True, True, True, True, False, False, False, False, False, False, True, True, True, True, False, False, False, False, False, False, True, True, True, True, True, True, True, True], [True, True, True, True, True, True, True, True, True, True, False, False, False, True, True, True, True, True, True, False, False, False, True, True, True, True, True, True, True, True, True, True], [True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True], [True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True], [True, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, False, True], [True, False, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, False, False, True], [True, False, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, False, False, True], [True, False, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, False, False, True], [True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True], [True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True]]

start = (12,24)
end = (13, 26)
maze = [[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
Expand All @@ -110,10 +126,10 @@ def main():
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 1, 0, 0, 0]]

start = (0, 4)
end = (8, 4)
#start = (0, 4)
#end = (8, 4)

path = astar(maze, start, end)
path = astar(m, start, end)
print(path)


Expand Down
86 changes: 44 additions & 42 deletions final_bot/robot.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
from battlecode import BCAbstractRobot, SPECS
import battlecode as bc
import random
import path_finding
#import path_finding

__pragma__('iconv')
__pragma__('tconv')
# __pragma__('opov')
__pragma__('opov')


# don't try to use global variables!!
Expand All @@ -32,77 +32,78 @@ class MyRobot(BCAbstractRobot):
destination = None
destination_path = None

def get_closest_resource(self, map, x, y): # Gives x,y of closest resource
loc = [x, y]
def get_closest_resource(self, m, x, y): # Gives x,y of closest resource
loc = (x, y)
closest_loc = (-1, -1)
best_dist_sq = 64 * 64 + 64 * 64 + 1
for x in range(len(map)):
for x in range(len(m)):
if (x - loc[0])**2 > best_dist_sq:
continue
for y in range(len(map[0])):
for y in range(len(m[0])):
if (y - loc[1])**2 > best_dist_sq:
continue
d = (x-loc[0]) ** 2 + (y-loc[1]) ** 2
if map[y][x] and d < best_dist_sq:
if m[y][x] and d < best_dist_sq:
best_dist_sq = d
closest_loc = {'x':x,'y':y}
closest_loc = (x,y)
return closest_loc

# moves "smartly" to [x,y]. Make sure [x,y] is passable
def move_to(self, passable_map, visible_map):
y = self.y
x = self.x
if(x == self.destination[1] and y==self.destination[0]):
y = self.me.y
x = self.me.x
if(x == self.destination[0] and y==self.destination[1]):
return None
for i in range(len(self.destination_path)-1, -1, -1):
x1, y1 = self.destination_path[i]
if(passable_map[y][x] and visible_map[y][x] == 0 and (x-x1)**2+(y-y1)**2 <= SPECS['UNITS'][self.me.unit()]['SPEED']):
return self.move(x1-x, y1-y)

def get_path(self,x,y,passable_map): #returns path to [x,y], tile by tile
return path_finding.astar(passable_map,[self.y,self.x],[y,x])
return path_finding.astar(passable_map,[self.me.y,self.me.x],[y,x])

def in_map(self, x, y, n):
if(x >= 0 and y >= 0 and x < n and y < n):
return True
return False

def is_adjacent(self, r): # Returns true if 'r' object is adjacent to 'self' object
l = [r.x-self.x, r.y-self.y]
l = [r.x-self.me.x, r.y-self.me.y]
for i in self.surrounding_tiles:
if(l == i):
return True
return False

def turn(self):
self.round += 1
pass
'''
attackable = []
passable_map = self.get_passable_map()
karbonite_map = self.get_karbonite_map()
visible_map = self.get_visible_robot_map()
fuel_map = self.get_fuel_map()
#fuel_map = self.get_fuel_map()
visible_robots = self.get_visible_robots()
if self.spawnloc is None:
# first turn!
self.spawnloc = (self.me['x'], self.me['y'])
self.spawnloc = (self.me.x, self.me.y)
for r in visible_robots:
if not self.is_visible(r):
continue
dist = (r['x'] - self.me['x'])**2 + (r['y'] - self.me['y'])**2
if r['team'] != self.me['team'] and SPECS['UNITS'][SPECS["CRUSADER"]]['ATTACK_RADIUS'][0] <= dist <= SPECS['UNITS'][SPECS["CRUSADER"]]['ATTACK_RADIUS'][1]:
dist = (r.x - self.me.x)**2 + (r.y - self.me.y)**2
if r.team != self.me.team and SPECS['UNITS'][SPECS["CRUSADER"]]['ATTACK_RADIUS'][0] <= dist <= SPECS['UNITS'][SPECS["CRUSADER"]]['ATTACK_RADIUS'][1]:
attackable.append(r)
if r['team'] == self.me['team'] and r['unit'] == SPECS['CASTLE']:
if r.team == self.me.team and r.unit == SPECS['CASTLE']:
if self.me.karbonite > 0 or self.me.fuel > 0 and dist < 3.5:
return self.give(r['x'] - self.me['x'], r['y'] - self.me['y'], self.me.karbonite, self.me.fuel)
return self.give(r.x - self.me.x, r.y - self.me.y, self.me.karbonite, self.me.fuel)
if self.me['unit'] == SPECS['CASTLE']:
self.log("Castle: "+str(self.round))
self.log("Castle")
for dx, dy in self.surrounding_tiles:
x = self.me.x+dx
y = self.me.y+dy
if(passable_map[y][x] == True and visible_map[y][x] == 0):
if(self.in_map(x,y,len(passable_map)) and passable_map[y][x] == True and visible_map[y][x] == 0):
if(self.initial_pilgrims > 0):
self.log("Created pilgrim.")
self.initial_pilgrims -= 1
Expand All @@ -112,41 +113,42 @@ def turn(self):
self.initial_crusaders -= 1
return self.build_unit(SPECS['CRUSADER'], dx, dy)
if self.me['unit'] == SPECS['PILGRIM']:
self.log("Pilgrim: "+str(self.round))
if self.destination == None:
self.destination = self.get_closest_resource(
karbonite_map, self.x, self.y)
if self.destination_path == None:
elif self.me['unit'] == SPECS['PILGRIM']:
self.log("Pilgrim:")
if self.destination is None:
self.destination = self.get_closest_resource(karbonite_map, self.me.x, self.me.y)
if self.destination_path is None:
self.destination_path = self.get_path(*self.destination, passable_map)
self.log("Found path.")
if self.me.karbonite == SPECS['UNITS'][SPECS["PILGRIM"]]['KARBONITE_CAPACITY']:
for r in visible_robots:
if(r.team == self.me.team and r.id == SPECS['CRUSADER'] and self.is_adjacent(r)):
return self.give(r.x-self.x, r.y-self.y, self.me.karbonite, 0)
return self.give(r.x-self.me.x, r.y-self.me.y, self.me.karbonite, 0)
if(self.x == self.destination[0] and self.y == self.destination[1]):
if(self.me.x == self.destination[0] and self.me.y == self.destination[1]):
return self.mine()
else:
move = self.move_to(*self.destination, passable_map, visible_map)
if(move != None):
if(move is not None):
return move
if self.me['unit'] == SPECS["CRUSADER"]:
self.log("Crusader" + str(self.round))
elif self.me['unit'] == SPECS["CRUSADER"]:
self.log("Crusader" + str(self.me.turn))
if attackable:
r = attackable[0]
self.log('attacking! ' + str(r) + ' at loc ' +
(r['x'] - self.me['x'], r['y'] - self.me['y']))
return self.attack(r['x'] - self.me['x'], r['y'] - self.me['y'])
(r.x - self.me.x, r.y - self.me.y))
return self.attack(r.x - self.me.x, r.y - self.me.y)
if self.destination == None:
if self.me.karbonite == SPECS['UNITS'][SPECS["CRUSADER"]]['KARBONITE_CAPACITY']:
if self.destination is None:
if self.me.karbonite is SPECS['UNITS'][SPECS["CRUSADER"]]['KARBONITE_CAPACITY']:
self.destination = self.spawnloc
else:
self.destination = self.get_closest_resource(
karbonite_map, self.spawnloc[0], self.spawnloc[1])
return self.self.move_to(*self.destination, passable_map, visible_map)


self.destination = self.get_closest_resource(karbonite_map, self.spawnloc[0], self.spawnloc[1])
move = self.move_to(*self.destination, passable_map, visible_map)
if(move is not None):
return move
'''
robot = MyRobot()
Loading

0 comments on commit 30e1267

Please sign in to comment.