# ychess ![ychess-logo](./art/ychess.png) ychess is a chess implementation and engine written in nim. ## Usage and contribution For the following subsections to work properly you need to have `nim.cfg` files so you don't need to pass all compiler arguments manually. To automatically create the config files run `nim c -r createCfg.nim` from the root directory of the project. ### Todos [TODO.md](./TODO.md) contains a list of features that are planned. ### Command line To play chess in the commandline simply download the code (or clone the repository) and run `nim c -r game.nim`. You can either play the 1v1 hotseat mode or a single player mode vs the engine. ### Lichess ychess uses the lichess api to make playing more convenient. An instance of the engine occasionally plays on [lichess](https://lichess.org/@/tiyn-ychess). To get into the whitelist just write a ingame message to the account. If you want to create an instance on lichess yourself you need to set a api token. This is done in `src/engine/secret.nim`. It should have the following structure: ```nim let api_token* = "" ``` Following that you will want to set your username into the whitelist in `src/engine/lichessBridge.nim`. After that you can start the lichess bot by running `nim c -r src/engine/lichessBridge.nim`. ## Project Structure - `art` - contains pictures and arts not used in the code. - `bin` - is not pushed to the git repository but contains all binaries and will be created if you compile a program. - `htmldocs` - is not pushed to the git repository but contains all automatically generated documentation. - `ressources` - is not pushed to the git repository but contains all the data used in source code but not being source code itself (e.g. databases). - `src` - is the root folder for all programs except tests. - `tests` - contains all tests. ### Documentation Documentation is written into the code via DocGen. For this reason it is not saved in this repository. To extract it into html (assuming you want the documentation for `game.nim`) run `nim doc --project --index:on --outdir:htmldocs game.nim`. ## Additional Documentation ### Moves Moves are read from the commandline as [pure coordinate notation](https://www.chessprogramming.org/Algebraic_Chess_Notation#Pure_coordinate_notation). The inner program will convert this notation to a move-tuple. ### Board Representation Due to easier off the board checking a [10x12](https://www.chessprogramming.org/10x12_Board) board is used. ### Engine The engine uses a simple implementation of the [NegaMax](https://www.chessprogramming.org/NegaMax)-algorithm with [Alpha-Beta-Pruning](https://www.chessprogramming.org/Alpha-Beta#Negamax_Framework). For the evaluation function each piece has a corresponding value. Additionally [piece-square tables](https://www.chessprogramming.org/Piece-Square_Tables) are used. ### Code Style Guide Make sure to take a look at the [official nim style guide](https://nim-lang.org/docs/nep1.html). All conventions should be applied to this code. Additionally there are a bunch of steps to make the code more consistent. #### Constants Constants should start with an uppercase letter but shouldn't be written in all caps (`const FooBar = 2`). #### Whitespaces Basic arithmetic operations should be surrounded by spaces for example: `1 + 3`. This however is not true for negation of a single value (`-1`) or if the arithmetic operation is done inside array brackets or in iterators (`a+1..3`, `a[c+3]`). #### Function calls Determining the length of a string, array, etc should not be done via a function (`len(array)`) but by appending it like `array.len`. In the same style function calls should be done (`chess.convertToFen()` instead of `convertToFen(chess)`). This however is not true if the function takes a first argument that is not an abstract datatype like the joinPath function (all the parameters are strings). #### booleans and logic If statements should not contain outer brackets. In some cases (especially concatenations of `and` and `or`) inner brackets are useful to increase readability in complexer logic formulas. When assigning booleans with logical formulas outer brackets are expected (`var boolVar = (1 == 1)`).