Advertisement
Guest User

Untitled

a guest
May 20th, 2015
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 5.30 KB | None | 0 0
  1. diff -u a/tictactoe.rs b/tictactoe.rs
  2. --- a/tictactoe.rs  2015-05-19 23:00:25.261881078 +0200
  3. +++ b/tictactoe.rs  2015-05-20 14:46:25.370780762 +0200
  4. @@ -1,16 +1,19 @@
  5. +#![feature(core, rand)]
  6.  extern crate core;
  7. -use std::io;
  8. +use std::io::{self,Write};
  9.  use std::rand;
  10.  use std::rand::distributions::{IndependentSample, Range};
  11.  
  12. -#[deriving(PartialEq)]
  13. +#[derive(PartialEq, Clone, Copy)]
  14.  enum Field {
  15.     N,
  16.     X,
  17.     O,
  18.  }
  19.  
  20. -impl core::fmt::Show for Field {
  21. +use Field::{N,X,O};
  22. +
  23. +impl core::fmt::Display for Field {
  24.     fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
  25.         write!(f, "{}", match *self {
  26.             N => ' ',
  27. @@ -28,7 +31,7 @@
  28.     }
  29.  }
  30.  
  31. -fn show(board:&[Field, ..9]) {
  32. +fn show(board:&[Field; 9]) {
  33.     print!("+---+\n");
  34.     print!("|{}{}{}|\n", board[0], board[1], board[2]);
  35.     print!("|{}{}{}|\n", board[3], board[4], board[5]);
  36. @@ -37,20 +40,20 @@
  37.  }
  38.  
  39.  // Should perhaps be refactored to iterator?
  40. -fn streaks(board:&[Field, ..9], streak_handler:|[Field, ..3]|->()) {
  41. -   for row in range(0u, 3u) {
  42. +fn streaks<F>(board:&[Field; 9], streak_handler:&mut F) where F : FnMut([Field; 3]) {
  43. +   for row in 0..3 {
  44.         streak_handler([board[3*row + 0], board[3*row + 1], board[3*row + 2]]);
  45.     }
  46. -   for col in range(0u, 3u) {
  47. +   for col in 0..3 {
  48.         streak_handler([board[3*0 + col], board[3*1 + col], board[3*2 + col]]);
  49.     }
  50.     streak_handler([board[3*0 + 0], board[3*1 + 1], board[3*2 + 2]]);
  51.     streak_handler([board[3*0 + 2], board[3*1 + 1], board[3*2 + 0]]);
  52.  }
  53.  
  54. -fn find_winner(board:&[Field, ..9]) -> Field {
  55. -   let mut winner:Field = N;
  56. -   streaks(board, |streak| {
  57. +fn find_winner(board:&[Field; 9]) -> Field {
  58. +   let mut winner = N;
  59. +   streaks(board, &mut |streak:[Field; 3]| {
  60.         if streak[0] != N && streak[0] == streak[1] && streak[1] == streak[2] {
  61.             winner = streak[0];
  62.         }
  63. @@ -58,24 +61,24 @@
  64.     return winner;
  65.  }
  66.  
  67. -fn free_pos(board:&[Field, ..9], pos_handler:|uint|->()) {
  68. -   for pos in range(0u, 9u) {
  69. +fn free_pos<F>(board:&[Field; 9], pos_handler:&mut F) where F : FnMut(usize) {
  70. +   for pos in 0..9 {
  71.         if board[pos] == N {
  72.             pos_handler(pos);
  73.         }
  74.     }
  75.  }
  76.  
  77. -fn moves(board:&[Field, ..9], to_play:Field, move_handler:|uint, &[Field, ..9]|->()) {
  78. +fn moves<F>(board:&[Field; 9], to_play:Field, move_handler:&mut F) where F : FnMut(usize, &[Field; 9]) {
  79.     let mut new_board = *board;
  80. -   free_pos(board, |pos| {
  81. +   free_pos(board, &mut |pos| {
  82.         new_board[pos] = to_play;
  83.         move_handler(pos, &new_board);
  84.         new_board[pos] = N;
  85.     });
  86.  }
  87.  
  88. -fn finished(board:&[Field, ..9]) -> bool {
  89. +fn finished(board:&[Field; 9]) -> bool {
  90.     if board.iter().find(|x| { **x == N }) == None {
  91.         return true;
  92.     }
  93. @@ -85,14 +88,14 @@
  94.     return false;
  95.  }
  96.  
  97. -fn score(board:&[Field, ..9], player:Field, to_play:Field) -> u32 {
  98. +fn score(board:&[Field; 9], player:Field, to_play:Field) -> u32 {
  99.     let winner = find_winner(board);
  100.     if winner == player { return 2; }
  101.     if winner == other_player(player) { return 0; }
  102.  
  103.     let mut scores:Vec<u32> = vec![];
  104.     let next_player = other_player(to_play);
  105. -   moves(board, to_play, |_pos, new_board| {
  106. +   moves(board, to_play, &mut |_pos, new_board| {
  107.         scores.push(score(new_board, player, next_player));
  108.     });
  109.  
  110. @@ -103,11 +106,11 @@
  111.     }
  112.  }
  113.  
  114. -fn best_move(rng:&mut rand::TaskRng, board:&[Field, ..9], player:Field) -> uint {
  115. -   let mut scores:Vec<(uint, u32)> = vec![];
  116. +fn best_move(rng:&mut rand::ThreadRng, board:&[Field; 9], player:Field) -> usize {
  117. +   let mut scores:Vec<(usize, u32)> = vec![];
  118.     let next_player = other_player(player);
  119.  
  120. -   moves(board, player, |pos, new_board| {
  121. +   moves(board, player, &mut |pos, new_board| {
  122.         scores.push((pos, score(new_board, player, next_player)));
  123.     });
  124.  
  125. @@ -119,18 +122,21 @@
  126.  
  127.     let good_moves = scores.iter()
  128.         .filter(|&&(_, score)| { score == max_score })
  129. -       .collect::<Vec<&(uint, u32)>>();
  130. +       .collect::<Vec<&(usize, u32)>>();
  131.  
  132.     let choice = Range::new(0, good_moves.len()).ind_sample(rng);
  133.     let (pos, _) = *good_moves[choice];
  134.     return pos;
  135.  }
  136.  
  137. -fn read_move(reader: &mut io::Buffer, &board: &[Field, ..9]) -> Result<uint, io::IoError> {
  138. +fn read_move(reader: &mut io::BufRead, &board: &[Field; 9]) -> Result<usize, io::Error> {
  139.     loop {
  140.         print!("X's move [0-8]: ");
  141. -       match from_str::<uint>(try! { reader.read_line() }.as_slice().trim()) {
  142. -           Some(n) => {
  143. +       io::stdout().flush().ok().expect("Could not flush stdout");
  144. +       let mut buffer = String::new();
  145. +       try! { reader.read_line(&mut buffer) };
  146. +       match buffer.trim().parse::<usize>() {
  147. +           Ok(n) => {
  148.                 if n > 8 {
  149.                     println!("out of range");
  150.                 } else if board[n] != N {
  151. @@ -139,25 +145,25 @@
  152.                     return Ok(n);
  153.                 }
  154.             },
  155. -           None => println!("enter an integer")
  156. +           Err(_) => println!("enter an integer")
  157.         }
  158.     }
  159.  }
  160.  
  161. -fn main_core() -> Result<int, io::IoError> {
  162. -   let mut rng = rand::task_rng();
  163. -   let mut board:[Field, ..9] = [
  164. +fn main_core() -> Result<i32, io::Error> {
  165. +   let mut rng = rand::thread_rng();
  166. +   let mut board:[Field; 9] = [
  167.         N, N, N,
  168.         N, N, N,
  169.         N, N, N,
  170.     ];
  171.  
  172. -   let mut reader = io::stdin();
  173. +   let reader = io::stdin();
  174.  
  175.     while !finished(&board) {
  176.         show(&board);
  177.  
  178. -       let xmove = try!{ read_move(&mut reader, &board) };
  179. +       let xmove = try!{ read_move(&mut reader.lock(), &board) };
  180.         board[xmove] = X;
  181.         if finished(&board) {
  182.             break;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement