121 lines
3.1 KiB
C#
121 lines
3.1 KiB
C#
// See https://aka.ms/new-console-template for more information
|
|
using HightechICT.Amazeing.Client.Rest;
|
|
using System.Net;
|
|
using System.Xml.Linq;
|
|
|
|
string apiAuthorization = "HTI Thanks You [OZL]";
|
|
string baseUrl = @"https://maze.hightechict.nl/";
|
|
|
|
string username = "Hi Hightech!";
|
|
string mazeName = "Example Maze";
|
|
|
|
Console.WriteLine("Starting bot...");
|
|
|
|
HttpClient httpClient = new ();
|
|
httpClient.DefaultRequestHeaders.Add("Authorization", apiAuthorization);
|
|
|
|
AmazeingClient mazeClient = new AmazeingClient(baseUrl, httpClient);
|
|
|
|
|
|
ICollection<MazeInfo> mazeInfos = await mazeClient.AllMazes();
|
|
|
|
foreach(MazeInfo info in mazeInfos)
|
|
{
|
|
Console.WriteLine($"Name: {info.Name}, Tiles: {info.TotalTiles}");
|
|
}
|
|
|
|
|
|
bool registered = await RegisterPlayer(username, true);
|
|
|
|
if (!registered)
|
|
{
|
|
Console.WriteLine($"Player '{username}' failed to register");
|
|
return;
|
|
}
|
|
|
|
Console.WriteLine($"Player '{username}' registered");
|
|
|
|
Random random = new Random();
|
|
|
|
Console.WriteLine($"Entering maze '{mazeName}'");
|
|
PossibleActionsAndCurrentScore result = await mazeClient.EnterMaze(mazeName);
|
|
|
|
do
|
|
{
|
|
await Task.Delay(100);
|
|
// select a way to go
|
|
MoveAction[] moves = result.PossibleMoveActions.ToArray();
|
|
MoveAction[] notExploredMoves = moves.Any(m => !m.HasBeenVisited) ? moves.Where(m => !m.HasBeenVisited).ToArray() : moves;
|
|
|
|
if (moves.All(m => m.HasBeenVisited))
|
|
{
|
|
Console.WriteLine("All adjacent tiles have been visited! Selecting next path random.");
|
|
}
|
|
else
|
|
{
|
|
Console.WriteLine($"{string.Join(", ", notExploredMoves.Select(m => m.Direction.ToString()))} have not been visited, selecting next move.");
|
|
}
|
|
|
|
int selected = random.Next(notExploredMoves.Length - 1);
|
|
|
|
MoveAction moveAction = notExploredMoves[selected];
|
|
|
|
Console.WriteLine($"Moving {moveAction.Direction}, I have {(!moveAction.HasBeenVisited ? "not" : string.Empty)} been here.");
|
|
|
|
result = await mazeClient.Move(moveAction.Direction);
|
|
|
|
Console.WriteLine($"New tile has {(!result.CanExitMazeHere ? "no" : string.Empty)} exit.");
|
|
|
|
} while (!result.CanExitMazeHere);
|
|
|
|
await mazeClient.ExitMaze();
|
|
|
|
Console.WriteLine($"Exited the maze!");
|
|
|
|
async Task<bool> RegisterPlayer(string username, bool reset = false)
|
|
{
|
|
PlayerInfo? info = null;
|
|
try
|
|
{
|
|
info = await mazeClient.GetPlayerInfo();
|
|
}
|
|
catch (ApiException apiEx) when (apiEx.StatusCode == (int)HttpStatusCode.NotFound)
|
|
{
|
|
// no player registered.
|
|
// do some logging
|
|
}
|
|
|
|
if (info != null && reset == false)
|
|
{
|
|
// player already registered and no re-register needed.
|
|
return true;
|
|
}
|
|
|
|
if (info != null && reset == true)
|
|
{
|
|
// player already registered and re-register needed.
|
|
try
|
|
{
|
|
// forget the player.
|
|
await mazeClient.ForgetPlayer();
|
|
return true;
|
|
}
|
|
catch (ApiException apiEx)
|
|
{
|
|
// do some logging
|
|
return false;
|
|
}
|
|
}
|
|
|
|
try
|
|
{
|
|
// register the player.
|
|
await mazeClient.RegisterPlayer(username);
|
|
return true;
|
|
}
|
|
catch (ApiException apiEx)
|
|
{
|
|
// do some logging
|
|
return false;
|
|
}
|
|
} |