Run a test game between two rust bots.
(mut r: R, mut b: B, turns: usize, delay: u32)
| 1435 | |
| 1436 | /// Run a test game between two rust bots. |
| 1437 | pub fn run_game_ansi<R, B>(mut r: R, mut b: B, turns: usize, delay: u32) |
| 1438 | where R: FnMut(&mut GameController) -> Result<(), failure::Error>, |
| 1439 | B: FnMut(&mut GameController) -> Result<(), failure::Error> { |
| 1440 | |
| 1441 | // A filler time that doesn't matter for this test game. |
| 1442 | let time = 10000; |
| 1443 | let mut map = GameMap::test_map(); |
| 1444 | |
| 1445 | map.earth_map.is_passable_terrain[5][16] = false; |
| 1446 | map.earth_map.is_passable_terrain[12][0] = false; |
| 1447 | |
| 1448 | let mut master = GameController::new_manager(map); |
| 1449 | let players: [Player; 4] = [ |
| 1450 | Player { team: Red, planet: Earth }, |
| 1451 | Player { team: Blue, planet: Earth }, |
| 1452 | Player { team: Red, planet: Mars }, |
| 1453 | Player { team: Blue, planet: Mars } |
| 1454 | ]; |
| 1455 | let mut pcs: Vec<_> = players.iter().map(|p| GameController::new_player(master.start_game(*p))).collect(); |
| 1456 | |
| 1457 | let mut lastturn: Option<StartTurnMessage> = None; |
| 1458 | |
| 1459 | for i in 0..turns*4 { |
| 1460 | let p = i % 4; |
| 1461 | if lastturn.is_some() { |
| 1462 | let mut nx = None; |
| 1463 | mem::swap(&mut lastturn, &mut nx); |
| 1464 | pcs[p].start_turn(&nx.unwrap()); |
| 1465 | } else { |
| 1466 | pcs[p].start_turn(&master.initial_start_turn_message(time).start_turn); |
| 1467 | } |
| 1468 | |
| 1469 | if players[p].team == Red { |
| 1470 | r(&mut pcs[p]).expect("player errored"); |
| 1471 | } else { |
| 1472 | b(&mut pcs[p]).expect("player errored"); |
| 1473 | } |
| 1474 | |
| 1475 | println!("round: {:?} team: {:?} planet: {:?} karbonite: {:?}", |
| 1476 | pcs[p].round(), pcs[p].team(), pcs[p].planet(), pcs[p].karbonite()); |
| 1477 | |
| 1478 | let TurnApplication { start_turn, .. } = master.apply_turn(&pcs[p].end_turn(), time); |
| 1479 | lastturn = Some(start_turn); |
| 1480 | |
| 1481 | println!("-- master view --"); |
| 1482 | master.print_game_ansi(); |
| 1483 | println!("-- player view --"); |
| 1484 | pcs[p].print_game_ansi(); |
| 1485 | use std::{thread, time}; |
| 1486 | thread::sleep(time::Duration::from_millis(delay.into())); |
| 1487 | if let Some(team) = master.is_game_over() { |
| 1488 | println!("Winner: {:?}", team); |
| 1489 | return; |
| 1490 | } |
| 1491 | } |
| 1492 | } |
| 1493 | |
| 1494 | #[cfg(test)] |
no test coverage detected