summaryrefslogtreecommitdiff
path: root/src/game.rs
diff options
context:
space:
mode:
authorElias Fleckenstein <eliasfleckenstein@web.de>2022-09-12 21:24:24 +0200
committerElias Fleckenstein <eliasfleckenstein@web.de>2022-09-12 21:24:24 +0200
commit81784859d61d2d6fc29f6e908612438a94d9ed1d (patch)
tree017c9f7ae5aec9fb92b9dc9b444c02c95865a660 /src/game.rs
parent7f66024efc3a84fbfb2345aa30e7afa0309162d0 (diff)
downloadrs2048-81784859d61d2d6fc29f6e908612438a94d9ed1d.tar.xz
Add score display
Diffstat (limited to 'src/game.rs')
-rw-r--r--src/game.rs20
1 files changed, 9 insertions, 11 deletions
diff --git a/src/game.rs b/src/game.rs
index 19940cd..bec487a 100644
--- a/src/game.rs
+++ b/src/game.rs
@@ -15,7 +15,7 @@ impl Swap for Pos {
pub struct Field(RefCell<u32>);
enum MergeResult {
- Merged,
+ Merged(u32),
Replaced,
Blocked,
Empty,
@@ -49,7 +49,7 @@ impl Field {
*s += 1;
*o = 0;
- return MergeResult::Merged;
+ return MergeResult::Merged(1 << *s);
}
MergeResult::Blocked
@@ -78,7 +78,7 @@ impl Board {
}
}
- pub fn step(&self, dir: Dir) -> bool {
+ pub fn step(&self, dir: Dir) -> Option<u32> {
let dir = match dir {
Dir::Up => -Pos::Y,
Dir::Down => Pos::Y,
@@ -94,7 +94,7 @@ impl Board {
let start = (dir + Pos::ONE) / 2 * (self.size - Pos::ONE);
- let mut moved = false;
+ let mut score = None;
for row in 0..len_row {
let start_row = start + row * step_row;
@@ -106,21 +106,19 @@ impl Board {
let field2 = self.get(start_row + col2 * step_col);
match field1.merge(field2) {
- MergeResult::Merged => {
- moved = true;
+ MergeResult::Merged(sc) => {
+ score = Some(score.unwrap_or(0) + sc);
break;
}
- MergeResult::Replaced => {
- moved = true;
- }
+ MergeResult::Replaced => score = Some(score.unwrap_or(0)),
MergeResult::Blocked => break,
- MergeResult::Empty => {}
+ MergeResult::Empty => continue,
}
}
}
}
- moved
+ score
}
pub fn get(&self, pos: Pos) -> &Field {