\ # This article is a continuation of "CodinGame may be the right way to enjoy fighting with BOT (AI program)".
I modified CodinGame's TRON BATTLE program so that the following debug output can be obtained.
`+`
symbol. By the way, the minus sign is a mark with nothing.P=0
Input{X0:2, Y0:2, X1:10, Y1:0}
+ + + + + + + + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
using System;
using System.Linq;
using System.IO;
using System.Text;
using System.Collections;
using System.Collections.Generic;
class Player
{
static void Main(string[] args) {
Player control = new Player();
string[] numbers;
Input[] inputs;
// game loop
while (true) {
numbers = Console.ReadLine().Split(' ');
int N = int.Parse(numbers[0]);
int P = int.Parse(numbers[1]);
Console.Error.WriteLine("P={0}", P);
inputs = new Input[N];
for (int i = 0; i < N; i++) {
numbers = Console.ReadLine().Split(' ');
int X0 = int.Parse(numbers[0]);
int Y0 = int.Parse(numbers[1]);
int X1 = int.Parse(numbers[2]);
int Y1 = int.Parse(numbers[3]);
inputs[i] = new Input(i, X0, Y0, X1, Y1);
}
Input me = inputs[P];
string dir = control.HandleInputs(me, inputs);
control.DumpMap();
Console.WriteLine(dir);
}
}
Cell[,] map = new Cell[30, 20];
Queue<Cell> ffQueue = new Queue<Cell>();
private Player() {
for(int y=0; y<20; y++) {
for(int x=0; x<30; x++) {
map[x, y] = new Cell(x, y, -1);
}
}
}
private string HandleInputs(Input me, Input[] inputs) {
Console.Error.WriteLine(me);
foreach(var input in inputs) {
if (input.X1 < 0) DeleteIdsFromMap(input.Id);
else AddInputToMap(input);
}
ExecuteFloodfill(me);
if (CanMoveTo(me, -1, 0)) return "LEFT";
if (CanMoveTo(me, 1, 0)) return "RIGHT";
if (CanMoveTo(me, 0, -1)) return "UP";
if (CanMoveTo(me, 0, 1)) return "DOWN";
return "?";
}
void AddInputToMap(Input input) {
this.map[input.X1, input.Y1].V = input.Id;
}
void DeleteIdsFromMap(int id) {
for(int y=0; y<20; y++) {
for(int x=0; x<30; x++) {
if (map[x, y].V == id) map[x, y].V = -1;
}
}
}
bool CanMoveTo(Input me, int xOffset, int yOffset) {
int x = me.X1+xOffset;
int y = me.Y1+yOffset;
if (x < 0) return false;
if (x > 29) return false;
if (y < 0) return false;
if (y > 19) return false;
return map[x, y].V == -1 || map[x, y].V == 9;
}
bool IsEmptyCell(Cell center, int xOffset, int yOffset) {
int x = center.X+xOffset;
int y = center.Y+yOffset;
if (x < 0) return false;
if (x > 29) return false;
if (y < 0) return false;
if (y > 19) return false;
return map[x, y].V == -1;
}
void DumpMap() {
for(int y=0; y<20; y++) {
for(int x=0; x<30; x++) {
if (map[x, y].V == -1) Console.Error.Write("-");
else if (map[x, y].V == 9) Console.Error.Write("+");
else Console.Error.Write(map[x, y].V);
Console.Error.Write(" ");
}
Console.Error.WriteLine();
}
}
void ExecuteFloodfill(Input me) {
for(int y=0; y<20; y++) {
for(int x=0; x<30; x++) {
if (map[x, y].V == 9) map[x, y].V = -1;
}
}
Cell c = map[me.X1, me.Y1];
if (IsEmptyCell(c, -1, 0)) ffQueue.Enqueue(map[c.X-1, c.Y]);
if (IsEmptyCell(c, 1, 0)) ffQueue.Enqueue(map[c.X+1, c.Y]);
if (IsEmptyCell(c, 0, -1)) ffQueue.Enqueue(map[c.X, c.Y-1]);
if (IsEmptyCell(c, 0, 1)) ffQueue.Enqueue(map[c.X, c.Y+1]);
FloodfillLoop();
}
void FloodfillLoop() {
while(ffQueue.Count > 0) {
Cell c = ffQueue.Dequeue();
if(map[c.X, c.Y].V != -1) continue;
c.V = 9;
if (IsEmptyCell(c, -1, 0)) ffQueue.Enqueue(map[c.X-1, c.Y]);
if (IsEmptyCell(c, 1, 0)) ffQueue.Enqueue(map[c.X+1, c.Y]);
if (IsEmptyCell(c, 0, -1)) ffQueue.Enqueue(map[c.X, c.Y-1]);
if (IsEmptyCell(c, 0, 1)) ffQueue.Enqueue(map[c.X, c.Y+1]);
}
}
}
class Input
{
public int Id;
public int X0;
public int Y0;
public int X1;
public int Y1;
public Input(int id, int x0, int y0, int x1, int y1) {
this.Id = id;
this.X0 = x0;
this.Y0 = y0;
this.X1 = x1;
this.Y1 = y1;
}
public override string ToString() {
return String.Format("Input{{X0:{0}, Y0:{1}, X1:{2}, Y1:{3}}}", X0, Y0, X1, Y1);
}
}
class Cell
{
public int X;
public int Y;
public int V;
public Cell(int x, int y, int v) {
this.X = x;
this.Y = y;
this.V = v;
}
public override string ToString() {
return String.Format("Cell{{X:{0}, Y:{1}, V:{2}}}", X, Y, V);
}
}
This may be the end of the article I write about TRON BATTLE. I posted it with the hope that it will serve as a reference for those who are challenged in C #.
\ # I want to get out of the Wood 1 League ...
Recommended Posts