All pastes #1793119 Raw Edit

Stuff

public cpp v1 · immutable
#1793119 ·published 2010-02-10 21:56 UTC
rendered paste body
// This software is released under the DBAD (Dont be a duche) license.// If you improve this code in any way, you must release your modifications publicly.#include "Map.h"#include <string>#include <vector>#include <iostream>#define DEPTH 3const char *moves[] = {	"SOUTH",	"NORTH",	"EAST",	"WEST"};bool is_blocked(int x, int y, const Map &map,	std::vector<std::vector<bool> > &blocked_grid){	return map.IsWall(x, y) || blocked_grid[x][y];}int flood_fill_grid(const Map &map,	std::vector<std::vector<bool> > &blocked_grid,	std::vector<std::vector<bool> > &grid,	int x, int y){	int count = 1;	if (is_blocked(x, y, map, blocked_grid) || grid[x][y])		return 0;	grid[x][y] = true;	count += flood_fill_grid(map, blocked_grid, grid, x, y+1);	count += flood_fill_grid(map, blocked_grid, grid, x, y-1);	count += flood_fill_grid(map, blocked_grid, grid, x+1, y);	count += flood_fill_grid(map, blocked_grid, grid, x-1, y);	return count;}std::vector<std::vector<bool> > *create_map_grid(const Map &map){	return new std::vector<std::vector<bool> >(map.Width(),		std::vector<bool>(map.Height(), false));}bool can_move_from(int x, int y, const Map &map, std::vector<std::vector<bool> > &blocked_grid){	if(!is_blocked(x, y+1, map, blocked_grid))		return true;	if(!is_blocked(x, y-1, map ,blocked_grid))		return true;	if(!is_blocked(x+1, y, map, blocked_grid))		return true;	if(!is_blocked(x-1, y, map, blocked_grid))		return true;	return false;}bool is_same_location(int x1, int y1, int x2, int y2){	return x1 == x2 && y1 == y2;}int max(std::vector<int> &vals){	unsigned int i;	int highest;	highest = vals[0];	for(i=1;i<vals.size();i++)	{		if(vals[i] > highest)			highest = vals[i];	}	return highest;}int score_my_move(const Map &map,	std::vector<std::vector<bool> > &blocked_grid,	int my_x, int my_y,	int their_x, int their_y,	int max_depth);int move_count(const Map &map,	std::vector<std::vector<bool> > &blocked_grid,	int x, int y){	int count = 0;	if(!is_blocked(x, y+1, map, blocked_grid))		count++;	if(!is_blocked(x, y-1, map, blocked_grid))		count++;	if(!is_blocked(x+1, y, map, blocked_grid))		count++;	if(!is_blocked(x-1, y, map, blocked_grid))		count++;	return count;}int abs(int val){	if(val >= 0)		return val;	return -val;}int score_their_move(const Map &map,	std::vector<std::vector<bool> > &blocked_grid,	int my_x, int my_y,	int their_x, int their_y,	int max_depth){	int my_area, their_area;	bool they_have_moves, we_have_moves;	std::vector<int> scores(4, -100);	if(is_same_location(my_x, my_y, their_x, their_y))		return 50;		they_have_moves = can_move_from(their_x, their_y, map, blocked_grid);	we_have_moves = can_move_from(my_x, my_y, map, blocked_grid);	if(!they_have_moves)	{		if(!we_have_moves)			return 50;		return -100;	}	if(!we_have_moves)		return 100;	if(max_depth > 0)	{		max_depth--;		blocked_grid[my_x][my_y] = true;		blocked_grid[their_x][their_y] = true;		if(!is_blocked(my_x, my_y+1, map, blocked_grid))			scores[0] = -score_my_move(map, blocked_grid, my_x, my_y+1, their_x, their_y, max_depth);		if(!is_blocked(my_x, my_y-1, map, blocked_grid))			scores[1] = -score_my_move(map, blocked_grid, my_x, my_y-1, their_x, their_y, max_depth);		if(!is_blocked(my_x+1, my_y, map, blocked_grid))			scores[2] = -score_my_move(map, blocked_grid, my_x+1, my_y, their_x, their_y, max_depth);		if(!is_blocked(my_x-1, my_y, map, blocked_grid))			scores[3] = -score_my_move(map, blocked_grid, my_x-1, my_y, their_x, their_y, max_depth);		blocked_grid[my_x][my_y] = false;		blocked_grid[their_x][their_y] = false;		return max(scores);	}		std::vector<std::vector<bool> > *fg = create_map_grid(map);	my_area = flood_fill_grid(map, blocked_grid, *fg, my_x, my_y);	if(!(*fg)[their_x][their_y])	{		their_area = flood_fill_grid(map, blocked_grid, *fg, their_x, their_y);		delete fg;		fg = 0;		if(their_area > my_area)			return 75;		if(their_area < my_area)			return -75;	}	if(fg)		delete fg;		float dist = abs(my_x - their_x) + abs(my_y - their_y);	return -20 + ((dist / map.Width() + map.Height())* 40.0f);}int score_my_move(const Map &map,	std::vector<std::vector<bool> > &blocked_grid,	int my_x, int my_y,	int their_x, int their_y,	int max_depth){	if(is_blocked(my_x, my_y, map, blocked_grid))	{		if(is_blocked(their_x, their_y, map, blocked_grid))			return -50;		return -100;	}	std::vector<int> scores(4, -100);#define try_move(t_x, t_y, n)\	if(!is_blocked(t_x, t_y, map, blocked_grid))\		scores[n] = -score_their_move(map, blocked_grid, my_x, my_y, t_x, t_y, max_depth);	try_move(their_x, their_y+1, 0);	try_move(their_x, their_y-1, 1);	try_move(their_x+1, their_y, 2);	try_move(their_x-1, their_y, 3);#undef try_move	return max(scores);}std::string MakeMove(const Map& map) {	int x = map.MyX();	int y = map.MyY();	int their_x = map.OpponentX();	int their_y = map.OpponentY();	int best_score = -101;	int best_move = 2;	int score;	std::vector<std::vector<bool> > *grid = create_map_grid(map);#define try_move(my_x, my_y, n)\	if (!map.IsWall(my_x, my_y)) {\		score = score_my_move(map, *grid, my_x, my_y, their_x, their_y, DEPTH);\		if(score > best_score)\		{\			best_score = score;\			best_move = n;\		}\	}\	try_move(x, y+1, 0);	try_move(x, y-1, 1);	try_move(x+1, y, 2);	try_move(x-1, y, 3);#undef try_move	return moves[best_move];}// Ignore this function. It is just handling boring stuff for you, like// communicating with the Tron tournament engine.int main() {  while (true) {    Map map;    Map::MakeMove(MakeMove(map));  }  return 0;}