CLI can play some version of a whole game
This commit is contained in:
		
							parent
							
								
									1d6eeada83
								
							
						
					
					
						commit
						06352344fb
					
				
							
								
								
									
										90
									
								
								src/cli.rs
									
									
									
									
									
								
							
							
						
						
									
										90
									
								
								src/cli.rs
									
									
									
									
									
								
							| @ -1,5 +1,6 @@ | |||||||
| use coup::*; | use coup::*; | ||||||
| use Action::*; | use Action::*; | ||||||
|  | use Card::*; | ||||||
| 
 | 
 | ||||||
| use std::io; | use std::io; | ||||||
| use std::io::Write; | use std::io::Write; | ||||||
| @ -22,6 +23,7 @@ impl HumanAgent { | |||||||
|             &[card] => println!("Your identity is {}", card), |             &[card] => println!("Your identity is {}", card), | ||||||
|             _ => unreachable!(), |             _ => unreachable!(), | ||||||
|         } |         } | ||||||
|  |         println!("You have {} coin(s)", game.players[self.turn].coins); | ||||||
|         println!("Remaining players are:"); |         println!("Remaining players are:"); | ||||||
|         for id in 0..game.players.len() { |         for id in 0..game.players.len() { | ||||||
|             if id == self.turn || !game.players[id].is_alive() { |             if id == self.turn || !game.players[id].is_alive() { | ||||||
| @ -52,7 +54,13 @@ impl Agent for HumanAgent { | |||||||
|                 println!("Bad choice"); |                 println!("Bad choice"); | ||||||
|             } |             } | ||||||
|         }; |         }; | ||||||
|         let target = if action.is_targeted() { Some(get_index()) } else { None }; |         let target = if action.is_targeted() { | ||||||
|  |             print!("Select a target: "); | ||||||
|  |             flush(); | ||||||
|  |             Some(get_index()) | ||||||
|  |         } else { | ||||||
|  |             None | ||||||
|  |         }; | ||||||
|         Move { action, target } |         Move { action, target } | ||||||
|     } |     } | ||||||
|     fn should_action_challenge(&self, game: &Game, move_: Move) -> bool { |     fn should_action_challenge(&self, game: &Game, move_: Move) -> bool { | ||||||
| @ -74,16 +82,82 @@ impl Agent for HumanAgent { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     fn choose_block_card(&self, game: &Game, move_: Move) -> Option<Card> { |     fn choose_block_card(&self, game: &Game, move_: Move) -> Option<Card> { | ||||||
|         todo!(); |         self.inform(game); | ||||||
|  |         match move_.action { | ||||||
|  |             Tax => { | ||||||
|  |                 print!("Will you claim Duke to block Foreign Aid?"); | ||||||
|  |                 match yes_or_no() { | ||||||
|  |                     Some(true) => Some(Duke), | ||||||
|  |                     _ => None, | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             Assassinate => { | ||||||
|  |                 print!("Will you claim Contessa to block Assassination?"); | ||||||
|  |                 match yes_or_no() { | ||||||
|  |                     Some(true) => Some(Contessa), | ||||||
|  |                     _ => None, | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             Steal => { | ||||||
|  |                 println!("Choose a Card to block Steal, or choose None:"); | ||||||
|  |                 println!("    1) Ambassador"); | ||||||
|  |                 println!("    2) Captain"); | ||||||
|  |                 println!("    3) None"); | ||||||
|  |                 match get_index() { | ||||||
|  |                     1 => Some(Ambassador), | ||||||
|  |                     2 => Some(Captain), | ||||||
|  |                     _ => None | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             _ => unreachable!(), | ||||||
|  |         } | ||||||
|  |             
 | ||||||
|     } |     } | ||||||
|     fn should_block_challenge(&self, game: &Game, move_: Move, block: Block) -> bool { |     fn should_block_challenge(&self, game: &Game, move_: Move, block: Block) -> bool { | ||||||
|         todo!(); |         self.inform(game); | ||||||
|  |         loop { | ||||||
|  |             print!("Will you challenge the block?"); | ||||||
|  |             match yes_or_no() { | ||||||
|  |                 Some(b) => break b, | ||||||
|  |                 None => println!("Bad input"), | ||||||
|  |             } | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|     fn exchange(&self, game: &Game, cards: &[Card]) -> [Card; 2] { |     fn exchange(&self, game: &Game, cards: &[Card]) -> [Card; 2] { | ||||||
|         todo!(); |         self.inform(game); | ||||||
|  |         let mut cards = Vec::from(cards); | ||||||
|  |         while cards.len() > 2 { | ||||||
|  |             println!("Choose a card to keep:"); | ||||||
|  |             for (i, card) in cards.iter().enumerate() { | ||||||
|  |                 println!("    {}) {}", i+1, card); | ||||||
|  |             } | ||||||
|  |             let index = get_index() - 1; | ||||||
|  |             if index < cards.len() { | ||||||
|  |                 cards.remove(index); | ||||||
|  |             } else { | ||||||
|  |                 println!("Bad input"); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         cards.try_into().unwrap() | ||||||
|     } |     } | ||||||
|     fn choose_lost_influence(&self, game: &Game) -> Card { |     fn choose_lost_influence(&self, game: &Game) -> Card { | ||||||
|         todo!(); |         match game.players[self.turn].cards.as_slice() { | ||||||
|  |             &[card] => card, | ||||||
|  |             &[card1, card2] => { | ||||||
|  |                 self.inform(game); | ||||||
|  |                 loop { | ||||||
|  |                     println!("Choose a card to lose influence"); | ||||||
|  |                     println!("    1) {}", card1); | ||||||
|  |                     println!("    2) {}", card2); | ||||||
|  |                     match get_index() { | ||||||
|  |                         1 => break card1, | ||||||
|  |                         2 => break card2, | ||||||
|  |                         _ => println!("Bad input"), | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             _ => unreachable!(), | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -113,7 +187,7 @@ fn get_index() -> usize { | |||||||
| 
 | 
 | ||||||
| fn yes_or_no() -> Option<bool> { | fn yes_or_no() -> Option<bool> { | ||||||
|     print!(" [y/n]: "); |     print!(" [y/n]: "); | ||||||
|     io::stdout().flush().unwrap(); |     flush(); | ||||||
|     let mut string = String::new(); |     let mut string = String::new(); | ||||||
|     io::stdin() |     io::stdin() | ||||||
|         .read_line(&mut string) |         .read_line(&mut string) | ||||||
| @ -128,3 +202,7 @@ fn yes_or_no() -> Option<bool> { | |||||||
|         None |         None | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | fn flush() { | ||||||
|  |     io::stdout().flush().unwrap(); | ||||||
|  | } | ||||||
|  | |||||||
| @ -286,6 +286,7 @@ impl Game { | |||||||
|                         // Player loses influence
 |                         // Player loses influence
 | ||||||
|                         self.player_lose_influence(self.turn, agents)?; |                         self.player_lose_influence(self.turn, agents)?; | ||||||
|                         // Turn is forfeit
 |                         // Turn is forfeit
 | ||||||
|  |                         self.advance(); | ||||||
|                         Ok(Phase::Done) |                         Ok(Phase::Done) | ||||||
|                     } |                     } | ||||||
|                 } else { |                 } else { | ||||||
| @ -334,6 +335,7 @@ impl Game { | |||||||
|             if self.players[block.blocker].holds(block.card) { |             if self.players[block.blocker].holds(block.card) { | ||||||
|                 // Player challenged incorrectly, loses influence and turn is forfeit
 |                 // Player challenged incorrectly, loses influence and turn is forfeit
 | ||||||
|                 self.player_lose_influence(self.turn, agents)?; |                 self.player_lose_influence(self.turn, agents)?; | ||||||
|  |                 self.advance(); | ||||||
|                 Ok(Phase::Done) |                 Ok(Phase::Done) | ||||||
|             } else { |             } else { | ||||||
|                 // Player challenged correctly, blocker loses a card
 |                 // Player challenged correctly, blocker loses a card
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user