Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/qubist/hc-ur
The Ancient Mesopotamian Royal Game of Ur written as a simple Holochain app
https://github.com/qubist/hc-ur
Last synced: about 2 months ago
JSON representation
The Ancient Mesopotamian Royal Game of Ur written as a simple Holochain app
- Host: GitHub
- URL: https://github.com/qubist/hc-ur
- Owner: qubist
- License: gpl-3.0
- Created: 2019-07-06T14:37:06.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2022-06-15T00:49:48.000Z (over 2 years ago)
- Last Synced: 2024-10-09T15:42:50.132Z (2 months ago)
- Language: Rust
- Homepage:
- Size: 180 KB
- Stars: 4
- Watchers: 1
- Forks: 0
- Open Issues: 9
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# hc-ur
[![GitHub license](https://img.shields.io/github/license/qubist/hc-ur.svg)](https://github.com/qubist/hc-ur/blob/master/LICENSE.txt)
> The Ancient Mesopotamian Royal Game of Ur written as a simple Holochain app
## Background
Ur is an ancient board game. See [this video](https://www.youtube.com/watch?v=WZskjLq040I).
## The game
### Board setupThe game is played on a board consisting of an 8 x 3 grid with four squares missing at the following positions: (4,0),(5,0),(4,2),(5,2). Positions (0,0),(0,2),(3,1),(6,0), and (6,2) have "rosettes", decorative flowers, on them which affect gameplay. The board looks like this:
| [\*] | [ ] | [ ] | [ ] | | | [\*] | [ ] |
|------|-----|-----|------|-----|-----|------|-----|
| [ ] | [ ] | [ ] | [\*] | [ ] | [ ] | [ ] | [ ] |
| [\*] | [ ] | [ ] | [ ] | | | [\*] | [ ] |From now on, let's denote it like this, with curly-brackets representing positions with rosettes.
| { } | [ ] | [ ] | [ ] | | | { } | [ ] |
|-----|-----|-----|-----|-----|-----|-----|-----|
| [ ] | [ ] | [ ] | { } | [ ] | [ ] | [ ] | [ ] |
| { } | [ ] | [ ] | [ ] | | | { } | [ ] |### Game rules
*This is a condensed version of the rules suitible for describing the game for implementation to Holochain, but not historically accurate. For details, check the [Wikipedia page](https://en.wikipedia.org/wiki/Royal_Game_of_Ur) or play the game online at [YourTurnMyTurn](https://www.yourturnmyturn.com/java/ur/index.php) [WARNING: FLASH].*
* Each player has 7 of their tokens.
* Players alternate turns.
* On their turn the player flips four coins. The number of heads shown is how far they may move one of their token, including moving a token onto the board.
* Tokens move in this pattern:| { ⇩ } | [ ⇦ ] | [ ⇦ ] | [ ⇦ ] | | | { ⇦ } | [ ⇦ ] |
|--------|--------|--------|--------|------|------|--------|--------|
| [⇨→] | [⇨→] | [⇨→] | {⇨→} | [⇨→] | [⇨→] | [⇨→] | [⇧↓] |
| { ↑ } | [ ← ] | [ ← ] | [ ← ] | | | { ← } | [ ← ] |* Tokens can't move on top of tokens of the same type.
* A move may capture an opponent's token if the moved token lands on the opponent's token, except if the opponent's token is on a rosette.
* A captured token is bumped off the board.
* If a player moves a token to a rosette, they take an extra turn.
* If a player moves a token off the end of the path described above, that token is home but the token must exit exactly. (If I move to square (0,6) I then must roll a 1 to move my token off the board.)
* The objective of the game is to get all one's tokens home before one's opponent. The first player with all their tokens home wins.## Implementation of the game to Holochain
### Moves
Moving a token already on the board:
```javascript
{
game: "QmHashOfGame123",
author: "QmMyAgentAddress000",
previous_move: "QmHashOfPreviousMove"
move_type: {
MoveToken: {
from: {x: 0, y: 2},
distance: 4
}
}
}
```
Moving a token onto the board:
```javascript
{
game: "QmHashOfGame123",
author: "QmMyAgentAddress000",
previous_move: "QmHashOfPreviousMove"
move_type: {
CreateToken: {
distance: 3
}
}
}
```### A player makes a valid move when:
* **CreateToken**
* the game is not over
* it is the player's turn *(calculate from who was the last player to move and whether they landed on a rosette)*
* the move length is no more than 4 tiles
* the move destination is not on top of another of the player's tokens *(calculate by reducing game state)*
* the move length matches the player's roll \* I will not implement this to start with
* *the player is not out of tokens* (tokens on board + tokens home < 7)
* **MoveToken**
* the game is not over
* it is the player's turn
* the move length is no more than 4 tiles
* the move destination is not on top of another of the player's tokens
* the move length matches the player's roll
* *a token belonging to the player exists at the from coordinates of the move*
* *the move is no more than one tile off the end of the board*### Game state
```javascript
{
complete: false,
player_1: {
tokens: [{x: 4, y: 1}, {x: 2, y: 2}, {x: 6, y: 1}],
tokens_home: 1,
resigned: false,
}
player_2: {
tokens: [{x: 2, y: 0}, {x: 5, y: 1}],
tokens_home: 4,
resigned: false,
}
}
```
(to calculate tokens remaining off the board: `7 - [tokens_home + length(tokens)]`)Reducing a sequence of moves into a game state:
* Keep track of tiles entering the board and moving and update their positions
* Watch tiles leaving the board and add them to the home tally
* Keep track of turns and double-turns