diff options
| author | tslil clingman <> | 2020-01-20 23:41:44 -0800 |
|---|---|---|
| committer | tslil clingman <> | 2020-01-20 23:41:44 -0800 |
| commit | fa04cc6ecf3ac1b4b8e8561c5969ee64f09f59fa (patch) | |
| tree | d96b2cae013ba5b42b4bf4366474b65367ffd95a /src/game.rs | |
| parent | ec4ae2a749315720cc12f3d71f0860e2a32f96d2 (diff) | |
Some bug in moving tall stacks ... ?
Diffstat (limited to 'src/game.rs')
| -rw-r--r-- | src/game.rs | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/src/game.rs b/src/game.rs index 2922121..4cb6fdd 100644 --- a/src/game.rs +++ b/src/game.rs @@ -317,16 +317,16 @@ impl GameState { } } - let num_dropped = drops.iter().map(|&d| d as usize).sum::<usize>(); + let sum_dropped = drops.iter().map(|&d| d as usize).sum::<usize>(); let carry_capacity = self.size as usize; - if num_dropped > carry_capacity { + if sum_dropped > carry_capacity { return Err(format!( "A move may not exceed the carry capacity of {} stones.", self.size )); } - if num_dropped != std::cmp::max(carry_capacity, stack_len) { + if sum_dropped != std::cmp::min(carry_capacity, stack_len) { return Err(String::from( "A move must effect the whole stack, up to the carry limit.", )); @@ -356,7 +356,7 @@ impl GameState { } if let Some(stack) = &self.board.get(self.pos_to_idx(&pos_new)) { if stack.len() > 0 { - match stack[0].stone { + match stack[stack.len() - 1].stone { Stone::Capstone => { return Err(String::from( "A move may not cover a capstone.", @@ -409,10 +409,19 @@ impl GameState { let idx = copy.pos_to_idx(&pos); let stack: &Stack = &self.board[self.pos_to_idx(pos)]; - copy.board[idx].clear(); + let len = copy.board[idx].len(); - let num_drops = drops.len(); let mut offset = 0; + if len > self.size as usize { + for _i in 0..self.size { + copy.board[idx].pop(); + } + offset = self.size - 1; + } else { + copy.board[idx].clear(); + } + + let num_drops = drops.len(); for drop_idx in 0..num_drops { let pos = pos_vec[pos_vec.len() - 1]; let idx = copy.pos_to_idx(&pos); |
