1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
#[deprecated( since = "0.1.2", note = "Please use the MancalaBoard::default() instead" )] pub fn basic_board() -> MancalaBoard { return MancalaBoard { values: [0, 4, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4, 4], }; } #[derive(PartialEq)] pub enum Side { Left, Right, } pub struct MancalaBoard { pub values: [u32; 14], } impl MancalaBoard { pub fn default()-> MancalaBoard { return MancalaBoard { values: [0, 4, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4, 4], }; } pub fn from_position(values: [u32;14])-> MancalaBoard { return MancalaBoard { values: values, }; } pub fn print(&self) { println!( " _____________\n( {:2} )\n ‾‾‾‾‾‾‾‾‾‾‾‾‾", self.values[0] ); for index in 1..7 { println!(" ____ | ____"); println!( "( {:2} ) | ( {:2} )", self.values[index], self.values[14 - index] ); println!(" ‾‾‾‾ | ‾‾‾‾"); } println!( " _____________\n( {:2} )\n ‾‾‾‾‾‾‾‾‾‾‾‾‾", self.values[7] ); } pub fn move_piece(&mut self, index: usize, side: Side) -> bool { let mut amount = self.values[index]; self.values[index] = 0; let mut add_index = index + 1; while add_index < (index + amount as usize + 1) { let formatted_index = add_index - 14 * ((add_index / 14) as f32).ceil() as usize; if formatted_index == 0 && side == Side::Left || formatted_index == 7 && side == Side::Right { amount += 1; } else { self.values[formatted_index] += 1; } add_index += 1; } let end_index = get_end_index(index, amount); println!("END INDEX: {}", index); self.print(); if end_index == 0 && end_index == 7 { return true; } else if self.values[end_index] > 1 { return self.move_piece(end_index, side); } else { return false; } } pub fn game_over(&self) -> bool { return self.values[1..7].iter().all(|&item| item == 0) || self.values[8..14].iter().all(|&item| item == 0); } pub fn winning(&self) -> Side { if self.values[0] > self.values[7] { return Side::Right; } else { return Side::Left; } } } fn get_end_index(start_index: usize, amount: u32) -> usize { let mut total = start_index + amount as usize; while total > 13 { total -= 14 } return total; }