summaryrefslogtreecommitdiff
path: root/src/game.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/game.rs')
-rw-r--r--src/game.rs21
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);