Implementation of the Blokus board game as an exercise to learn Rust. Currently supports single-player only, with limited rules and termination conditions.
Main game
- Make the pieces in hand like the actual game
- Add bot to play against
- Handle multiple players
GUI
- Handle pieces bigger than one cell
- Handle returning pieces to the hand after deselecting
- Allow rotating pieces
- Abolish globals -- configurable board size, pixel size
Run tests:
$ cargo test
How to run GUI:
$ cargo run --bin gui
Example of the CLI output:
$ cargo run --bin console
Finished dev [unoptimized + debuginfo] target(s) in 0.09s
Running `target/debug/blokus`
Pieces:
[0]
0
0 x
1 x
2 x
[1]
0 1 2
0 x x x
[2]
0 1 2
0 x x x
1 x . .
2 x . .
Choose piece:
1
Moves: 2
[0]
0 1 2 3 4 5 6 7 8 9
0 o o o . . . . . . .
1 . . . . . . . . . .
2 . . . . . . . . . .
3 . . . . . . . . . .
4 . . . . . . . . . .
5 . . . . . . . . . .
6 . . . . . . . . . .
7 . . . . . . . . . .
8 . . . . . . . . . .
9 . . . . . . . . . .
[1]
0 1 2 3 4 5 6 7 8 9
0 o . . . . . . . . .
1 o . . . . . . . . .
2 o . . . . . . . . .
3 . . . . . . . . . .
4 . . . . . . . . . .
5 . . . . . . . . . .
6 . . . . . . . . . .
7 . . . . . . . . . .
8 . . . . . . . . . .
9 . . . . . . . . . .
Choose move:
0
Grid:
0 1 2 3 4 5 6 7 8 9
0 x x x . . . . . . .
1 . . . . . . . . . .
2 . . . . . . . . . .
3 . . . . . . . . . .
4 . . . . . . . . . .
5 . . . . . . . . . .
6 . . . . . . . . . .
7 . . . . . . . . . .
8 . . . . . . . . . .
9 . . . . . . . . . .
Pieces:
[0]
0
0 x
1 x
2 x
[1]
0 1 2
0 x x x
1 x . .
2 x . .
Choose piece:
1
Moves: 4
[0]
0 1 2 3 4 5 6 7 8 9
0 x x x . . . . . . .
1 . . . o . . . . . .
2 . . . o . . . . . .
3 . o o o . . . . . .
4 . . . . . . . . . .
5 . . . . . . . . . .
6 . . . . . . . . . .
7 . . . . . . . . . .
8 . . . . . . . . . .
9 . . . . . . . . . .
[1]
0 1 2 3 4 5 6 7 8 9
0 x x x . . . . . . .
1 . . . o o o . . . .
2 . . . o . . . . . .
3 . . . o . . . . . .
4 . . . . . . . . . .
5 . . . . . . . . . .
6 . . . . . . . . . .
7 . . . . . . . . . .
8 . . . . . . . . . .
9 . . . . . . . . . .
[2]
0 1 2 3 4 5 6 7 8 9
0 x x x . . . . . . .
1 . . . o . . . . . .
2 . . . o . . . . . .
3 . . . o o o . . . .
4 . . . . . . . . . .
5 . . . . . . . . . .
6 . . . . . . . . . .
7 . . . . . . . . . .
8 . . . . . . . . . .
9 . . . . . . . . . .
[3]
0 1 2 3 4 5 6 7 8 9
0 x x x . . . . . . .
1 . . . o o o . . . .
2 . . . . . o . . . .
3 . . . . . o . . . .
4 . . . . . . . . . .
5 . . . . . . . . . .
6 . . . . . . . . . .
7 . . . . . . . . . .
8 . . . . . . . . . .
9 . . . . . . . . . .
Choose move:
3
Grid:
0 1 2 3 4 5 6 7 8 9
0 x x x . . . . . . .
1 . . . x x x . . . .
2 . . . . . x . . . .
3 . . . . . x . . . .
4 . . . . . . . . . .
5 . . . . . . . . . .
6 . . . . . . . . . .
7 . . . . . . . . . .
8 . . . . . . . . . .
9 . . . . . . . . . .
Pieces:
[0]
0
0 x
1 x
2 x
Choose piece:
0
Moves: 7
[0]
0 1 2 3 4 5 6 7 8 9
0 x x x . . . . . . .
1 . . . x x x . . . .
2 . . . . . x . . . .
3 . . . . . x . . . .
4 . . o o o . . . . .
5 . . . . . . . . . .
6 . . . . . . . . . .
7 . . . . . . . . . .
8 . . . . . . . . . .
9 . . . . . . . . . .
[1]
0 1 2 3 4 5 6 7 8 9
0 x x x . . . . . . .
1 . . . x x x . . . .
2 o o o . . x . . . .
3 . . . . . x . . . .
4 . . . . . . . . . .
5 . . . . . . . . . .
6 . . . . . . . . . .
7 . . . . . . . . . .
8 . . . . . . . . . .
9 . . . . . . . . . .
[2]
0 1 2 3 4 5 6 7 8 9
0 x x x . . . . . . .
1 . . . x x x . . . .
2 . . . . . x . . . .
3 . . . . . x . . . .
4 . . . . . . o . . .
5 . . . . . . o . . .
6 . . . . . . o . . .
7 . . . . . . . . . .
8 . . . . . . . . . .
9 . . . . . . . . . .
[3]
0 1 2 3 4 5 6 7 8 9
0 x x x . . . . . . .
1 . . . x x x . . . .
2 . . o . . x . . . .
3 . . o . . x . . . .
4 . . o . . . . . . .
5 . . . . . . . . . .
6 . . . . . . . . . .
7 . . . . . . . . . .
8 . . . . . . . . . .
9 . . . . . . . . . .
[4]
0 1 2 3 4 5 6 7 8 9
0 x x x . . . . . . .
1 . . . x x x . . . .
2 . . . . . x . . . .
3 . . . . . x . . . .
4 . . . . . . o o o .
5 . . . . . . . . . .
6 . . . . . . . . . .
7 . . . . . . . . . .
8 . . . . . . . . . .
9 . . . . . . . . . .
[5]
0 1 2 3 4 5 6 7 8 9
0 x x x . . . . . . .
1 . . . x x x . . . .
2 . . . . . x . . . .
3 . . . . . x . . . .
4 . . . . o . . . . .
5 . . . . o . . . . .
6 . . . . o . . . . .
7 . . . . . . . . . .
8 . . . . . . . . . .
9 . . . . . . . . . .
[6]
0 1 2 3 4 5 6 7 8 9
0 x x x . . . o o o .
1 . . . x x x . . . .
2 . . . . . x . . . .
3 . . . . . x . . . .
4 . . . . . . . . . .
5 . . . . . . . . . .
6 . . . . . . . . . .
7 . . . . . . . . . .
8 . . . . . . . . . .
9 . . . . . . . . . .
Choose move:
5
Used all pieces!
Final grid:
0 1 2 3 4 5 6 7 8 9
0 x x x . . . . . . .
1 . . . x x x . . . .
2 . . . . . x . . . .
3 . . . . . x . . . .
4 . . . . x . . . . .
5 . . . . x . . . . .
6 . . . . x . . . . .
7 . . . . . . . . . .
8 . . . . . . . . . .
9 . . . . . . . . . .