Skip to content

Instantly share code, notes, and snippets.

@vk2gpu
Created April 11, 2016 13:18
Show Gist options
  • Select an option

  • Save vk2gpu/cdecff593f75f5baddf053bd98c9bb92 to your computer and use it in GitHub Desktop.

Select an option

Save vk2gpu/cdecff593f75f5baddf053bd98c9bb92 to your computer and use it in GitHub Desktop.
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