Created
April 11, 2016 13:18
-
-
Save vk2gpu/cdecff593f75f5baddf053bd98c9bb92 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| fn get_piece(piece: i32) -> String | |
| { | |
| let mut string = String::new(); | |
| match piece | |
| { | |
| -1 => string.push_str(" "), | |
| 0 => string.push_str("O"), | |
| 1 => string.push_str("X"), | |
| _ => panic!("Invalid piece"), | |
| }; | |
| return string; | |
| } | |
| struct GameState | |
| { | |
| board: [i32; 9], | |
| curr_player: i32, | |
| } | |
| impl GameState | |
| { | |
| fn new() -> GameState | |
| { | |
| GameState | |
| { | |
| board: [-1, -1, -1, | |
| -1, -1, -1, | |
| -1, -1, -1], | |
| curr_player: 0 | |
| } | |
| } | |
| fn print(&self) | |
| { | |
| println!(""); | |
| println!("Board:"); | |
| println!(" {} | {} | {} (0, 1, 2)", get_piece(self.board[0]), get_piece(self.board[1]), get_piece(self.board[2])); | |
| println!("-----------"); | |
| println!(" {} | {} | {} (3, 4, 5)", get_piece(self.board[3]), get_piece(self.board[4]), get_piece(self.board[5])); | |
| println!("-----------"); | |
| println!(" {} | {} | {} (6, 7, 8)", get_piece(self.board[6]), get_piece(self.board[7]), get_piece(self.board[8])); | |
| } | |
| fn place_piece(&mut self, slot: i32) -> bool | |
| { | |
| if self.board[slot as usize] == -1 | |
| { | |
| self.board[slot as usize] = self.curr_player; | |
| self.curr_player = 1 - self.curr_player; | |
| return true; | |
| } | |
| return false; | |
| } | |
| fn winning_player(&self) -> i32 | |
| { | |
| // Fuck for loops. | |
| if self.board[0] == self.board[1] && self.board[1] == self.board[2] | |
| { | |
| return self.board[0]; | |
| } | |
| else if self.board[3] == self.board[4] && self.board[4] == self.board[5] | |
| { | |
| return self.board[3]; | |
| } | |
| else if self.board[6] == self.board[7] && self.board[7] == self.board[8] | |
| { | |
| return self.board[6]; | |
| } | |
| else if self.board[0] == self.board[3] && self.board[3] == self.board[6] | |
| { | |
| return self.board[0]; | |
| } | |
| else if self.board[1] == self.board[4] && self.board[4] == self.board[7] | |
| { | |
| return self.board[1]; | |
| } | |
| else if self.board[2] == self.board[5] && self.board[5] == self.board[8] | |
| { | |
| return self.board[2]; | |
| } | |
| else if self.board[0] == self.board[4] && self.board[4] == self.board[8] | |
| { | |
| return self.board[0]; | |
| } | |
| else if self.board[2] == self.board[4] && self.board[4] == self.board[6] | |
| { | |
| return self.board[2]; | |
| } | |
| return -1; | |
| } | |
| } | |
| fn get_input_num() -> i32 | |
| { | |
| let stdin = std::io::stdin(); | |
| loop | |
| { | |
| println!("Enter slot number:"); | |
| let mut user_input = String::new(); | |
| match stdin.read_line(&mut user_input) | |
| { | |
| Err(error) => panic!("Failure reading line: {}", error), | |
| _ => {} | |
| } | |
| if user_input.len() < 2 | |
| { | |
| println!("Invalid slot number. Try again."); | |
| continue; | |
| } | |
| let trimmed_length = user_input.len()-2; | |
| let trimmed_user_input = &user_input[..trimmed_length]; | |
| let number = match trimmed_user_input.parse::<i32>() | |
| { | |
| Ok(n) => n, | |
| Err(error) => { println!("{}. Try again.", error); continue; } | |
| }; | |
| if number < 0 || number >= 9 | |
| { | |
| println!("Number out of range. Try again."); | |
| continue; | |
| } | |
| return number; | |
| } | |
| } | |
| fn main() | |
| { | |
| let mut game_state = GameState::new(); | |
| loop | |
| { | |
| game_state.print(); | |
| let slot_number = get_input_num(); | |
| println!("You chose {}", slot_number); | |
| if !game_state.place_piece(slot_number) | |
| { | |
| println!("Invalid slot. Try again."); | |
| } | |
| let winner = game_state.winning_player(); | |
| if winner != -1 | |
| { | |
| game_state.print(); | |
| println!("Player {} wins!", winner); | |
| break; | |
| } | |
| } | |
| } | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment