chore: add board and pawn

This commit is contained in:
2026-08-11 18:44:36 +02:00
parent 9964eaa875
commit 53beada33c
5 changed files with 136 additions and 0 deletions

26
.gitignore vendored
View File

@@ -1 +1,27 @@
target target
.devenv/
# Generated by Cargo
# will have compiled files and executables
debug
target
# These are backup files generated by rustfmt
**/*.rs.bk
# MSVC Windows builds of rustc generate these, which store debugging information
*.pdb
# Generated by cargo mutants
# Contains mutation testing data
**/mutants.out*/
# rustc will dump stack traces when hitting an internal compiler error to PWD
rustc-ice-*.txt
# RustRover
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/

48
src/logic/board.rs Normal file
View File

@@ -0,0 +1,48 @@
use crate::logic::utils::Field;
use std::ops::Index;
pub struct Board {
board: Vec<Field>,
pub size: usize,
}
impl Board {
/// Board is always a square. Size parameter is a side of this rectangle. Defaults to 8
pub fn new(size: Option<usize>) -> Self {
let size = size.unwrap_or(8);
let board: Vec<Field> = (0..size)
.flat_map(|row| (0..size).map(move |column| Field { row, column }))
.collect();
Board { board, size }
}
}
impl Index<usize> for Board {
type Output = [Field];
fn index<'a>(&'a self, i: usize) -> &'a [Field] {
let start = i * &self.size;
let end: usize = start + &self.size;
&self.board[start..end]
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn new_board_test() {
let test_board: Board = Board::new(None);
let size: usize = test_board.size;
for row in 0..size {
for column in 0..size {
assert_eq!(test_board[row][column].row, row);
assert_eq!(test_board[row][column].column, column);
}
}
}
}

4
src/logic/mod.rs Normal file
View File

@@ -0,0 +1,4 @@
mod board;
mod pawn;
mod player;
mod utils;

54
src/logic/pawn.rs Normal file
View File

@@ -0,0 +1,54 @@
use crate::logic::utils::Field;
pub enum PawnState {
Man(Field),
Dame(Field),
Captured,
}
/// Basic pawn
pub struct Pawn {
state: PawnState,
// TODO! Change this to Player when Player is implemented
owner: String,
}
impl Pawn {
// TODO! Look at line 16
/// Every new Pawn is of type Man
pub fn new(start_pos: Field, owner: String) -> Self {
Self {
state: PawnState::Man(start_pos),
owner,
}
}
/// Return true if a pawn on given position is owned by the same player that this is
// TODO! Implement
fn is_mine(pos: Field) -> bool {
true
}
pub fn can_capture(&self) -> bool {
match &self.state {
PawnState::Man(pos) => {
// Man can capture only on diagonal axis going one up, left or right
let left_pos: Field = Field {
row: (pos.row + 1),
column: (pos.column - 1),
};
let left_right: Field = Field {
row: (pos.row + 1),
column: (pos.column + 1),
};
}
PawnState::Dame(pos) => {}
PawnState::Captured => {
// Captured pawns cannot capture
return false;
}
}
false
}
}

4
src/logic/utils.rs Normal file
View File

@@ -0,0 +1,4 @@
pub struct Field {
pub row: usize,
pub column: usize,
}