rusty2048_core/
score.rs

1use serde::{Deserialize, Serialize};
2
3/// Score tracking and calculation
4#[derive(Debug, Clone, Serialize, Deserialize)]
5pub struct Score {
6    /// Current score
7    current: u32,
8    /// Best score achieved
9    best: u32,
10    /// Score gained from last move
11    last_move: u32,
12}
13
14impl Score {
15    /// Create a new score tracker
16    pub fn new() -> Self {
17        Self {
18            current: 0,
19            best: 0,
20            last_move: 0,
21        }
22    }
23
24    /// Get current score
25    pub fn current(&self) -> u32 {
26        self.current
27    }
28
29    /// Get best score
30    pub fn best(&self) -> u32 {
31        self.best
32    }
33
34    /// Get score from last move
35    pub fn last_move(&self) -> u32 {
36        self.last_move
37    }
38
39    /// Add points from a merge
40    pub fn add_merge_points(&mut self, merged_value: u32) {
41        self.last_move = merged_value;
42        self.current += merged_value;
43
44        if self.current > self.best {
45            self.best = self.current;
46        }
47    }
48
49    /// Reset current score (for new game)
50    pub fn reset_current(&mut self) {
51        self.current = 0;
52        self.last_move = 0;
53    }
54
55    /// Reset all scores
56    pub fn reset_all(&mut self) {
57        self.current = 0;
58        self.best = 0;
59        self.last_move = 0;
60    }
61
62    /// Calculate score for a specific merge
63    pub fn calculate_merge_score(merged_value: u32) -> u32 {
64        merged_value
65    }
66}
67
68impl Default for Score {
69    fn default() -> Self {
70        Self::new()
71    }
72}
73
74#[cfg(test)]
75mod tests {
76    use super::*;
77
78    #[test]
79    fn test_score_creation() {
80        let score = Score::new();
81        assert_eq!(score.current(), 0);
82        assert_eq!(score.best(), 0);
83        assert_eq!(score.last_move(), 0);
84    }
85
86    #[test]
87    fn test_score_operations() {
88        let mut score = Score::new();
89
90        // Add merge points
91        score.add_merge_points(4);
92        assert_eq!(score.current(), 4);
93        assert_eq!(score.best(), 4);
94        assert_eq!(score.last_move(), 4);
95
96        // Add more points
97        score.add_merge_points(8);
98        assert_eq!(score.current(), 12);
99        assert_eq!(score.best(), 12);
100        assert_eq!(score.last_move(), 8);
101
102        // Reset current
103        score.reset_current();
104        assert_eq!(score.current(), 0);
105        assert_eq!(score.best(), 12); // Best should remain
106        assert_eq!(score.last_move(), 0);
107    }
108
109    #[test]
110    fn test_merge_score_calculation() {
111        assert_eq!(Score::calculate_merge_score(2), 2);
112        assert_eq!(Score::calculate_merge_score(4), 4);
113        assert_eq!(Score::calculate_merge_score(8), 8);
114        assert_eq!(Score::calculate_merge_score(2048), 2048);
115    }
116}