private async void BeginRender_Click(object sender, EventArgs e) { beginRender.Enabled = false; IAi ai = DemoAi.Create(DemoResult.AiIdentifier, DemoResult.Parameters); Level originalLevel = DemoResult.OriginalLevel; MutableLevel workingLevel = originalLevel.AsMutable(); using (var source = new System.Threading.CancellationTokenSource()) { IRover rover = new ReportingRover( new Rover(workingLevel, DemoResult.Parameters), new Progress <TerrainUpdate>(UpdateTerrain), new Progress <PositionUpdate>(UpdateRoverPosition), new Progress <StatsUpdate>(UpdateStats), source.Token ); Simulation sim = new Simulation(originalLevel, DemoResult.Parameters, ai, rover); _renderData = RenderData.GenerateBlank(originalLevel.BottomRight, rover.Position); try { await Task.Run(sim.Simulate, source.Token); } catch (OperationCanceledException) { // Ignore this exception, since it'll only happen when we've already closed the form } catch (OutOfPowerOrMovesException) { // This is to be expected if an AI doesn't keep track of their power or moves } } }
public IRover Create(MutableLevel level, SimulationParameters parameters) => new Rover(level, parameters);