{"id":21607786,"url":"https://github.com/assios/bekk-sjakkbot","last_synced_at":"2025-03-18T15:22:47.459Z","repository":{"id":146418161,"uuid":"399796624","full_name":"Assios/bekk-sjakkbot","owner":"Assios","description":null,"archived":false,"fork":false,"pushed_at":"2021-08-25T12:50:40.000Z","size":9,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-01-24T19:36:36.586Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Assios.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-08-25T11:39:18.000Z","updated_at":"2023-03-08T18:51:23.000Z","dependencies_parsed_at":null,"dependency_job_id":"fc57ffe8-7244-45db-8a73-03ea9e59b413","html_url":"https://github.com/Assios/bekk-sjakkbot","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Assios%2Fbekk-sjakkbot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Assios%2Fbekk-sjakkbot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Assios%2Fbekk-sjakkbot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Assios%2Fbekk-sjakkbot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Assios","download_url":"https://codeload.github.com/Assios/bekk-sjakkbot/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244246571,"owners_count":20422461,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-24T20:33:52.311Z","updated_at":"2025-03-18T15:22:47.439Z","avatar_url":"https://github.com/Assios.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# Sjakkbot\n\n## Hvordan komme i gang?\n\n### Starte sjakkboten\n\nFørst installer avhengigheter med `pip install -r requirements.txt`.\n \nDu kan velge om du vil kjøre boten fra terminalen, eller kjøre den opp på Lichess sånn at du kan spille mot den der. For å starte sjakkboten i terminalen, kjør `python engine.py`. For å spille mot boten i terminalen, må du skrive fra-koordinaten fulgt av til-koordinaten, f.eks. `e2e4` for å spille bonde fra e2 til e4. Det har ikke noe å si hvilken brikke det er, så om du vil flytte springer fra g1 til f3, skriver du `g1f3`. Boten svarer på samme måte.\n\nFor å starte boten på Lichess slik at du kan spille mot den der, legg inn brukernavnet og tokenet til boten i filen `keys.py`. Så er det bare å kjøre `python lichess.py`.\n\nNå er det bare å logge seg på en annen Lichess-konto (du kan [opprette en her](https://lichess.org/signup)) og utfordre boten! Gå til profilen til boten på https://lichess.org/@/BRUKERNAVN, f.eks.  https://lichess.org/@/Bottios. Så klikker du på sverdikonet, velger en tidskontroll og utfordrer boten:\n\n![](https://user-images.githubusercontent.com/1413265/130758914-6a973908-f54c-4bef-841d-0cc4facdccf4.png)\n\n### Hvordan forbedre den \n\nI `evaluation.py` finner dere evalueringsfunksjonen `evaluate`. Den tar inn stillingen (noden), og returnerer en score. Siden den nå bare returnerer et tilfeldig tall, vil boten spille helt tilfeldig. Målet er å forbedre denne evalueringsfunsjonen.\n\nDen enkleste måten å evaluerere stillingen på, er å telle opp brikkene på brettet. Legg sammen verdien på de hvite brikkene og trekk fra verdien på de svarte brikkene, så har du en verdi på stillingen.\n\nFor å hjelpe deg i gang, skal vi vise hvordan du kan gjøre en slik brikkeopptelling. Men først en forklaring av variabelen `node`, som representerer stillingen. Dere kan se på `node` som selve sjakkbrettet med alle brikkene på. Vi bruker biblioteket `python-chess` for å representere brettet og generere lovlige trekk, og `node` kommer fra denne pakken, der den er av typen Board.\n\nSe `Board` i dokumentasjonen til `python-chess`: https://python-chess.readthedocs.io/en/latest/\n\nRadene på et sjakkbrett går fra 1 til 8, og kolonnene går fra A til H:\n\n![Screenshot](http://3.bp.blogspot.com/-OeoLo7bgI3s/UCSMlx1trbI/AAAAAAAAAFY/O8gCOQkZypE/s1600/annotated-chess_algebraic_naming-squares.gif)\n\nDet er disse koordinatene vi bruker for å referere til felter på brettet. Feltet helt nede til venstre heter A1, og feltet der svarts konge starter heter E8.\n\nFor å finne ut hvilken brikke som står på A1, kan vi skrive `piece = node.piece_at(chess.A1)` (og `chess.A1` kan skrives `get_attr(chess, \"A1\")`). Da vil `piece` inneholde brikken dersom det står en brikke der, ellers `None`. Hvite brikker har store bokstaver, mens svarte brikker har små. En hvit bonde vil være `P`, mens en svart konge vil være `k`.\n\nBonde: P, Løper: B, Springer: N, Tårn: R, Dronning: Q, Konge: K.\n\n`fields`-variabelen i `evaluation.py` er en liste med alle feltene på brettet: `['A1', 'A2', ..., 'H8']`. Så ved å loope gjennom denne listen kan man legge til eller trekke fra en score basert på hvilken brikke som står på feltet.\n\nVanligvis brukes disse verdiene på brikkene: Bonde: 1, løper og springer: 3, tårn: 5, dronning 9. Så kan man sette en verdi på kongen som er mye høyere enn alle de andre til sammen, f.eks. 100. For å kunne justere verdiene mer nøyaktig, pleier man å oppgi verdier i \"centipawns\", altså hundredeler av bondeverdien. Da blir verdiene 100 for bonde, 300 for løper, osv... Finn mer informasjon om brikkeverdier på https://www.chessprogramming.org/Point_Value\n\nFor eksempel:\n\n```\ndef evaluate(node):\n    score = 0\n\n    for field in fields:\n        piece = node.piece_at(getattr(chess, field))\n\n        if piece:\n            p = str(piece)\n\n            if p == \"P\":\n                score += 100\n            elif p == \"p\":\n                score -= 100\n            elif p == \"B\":\n                score += 300\n        # osv...\n\n    return score\n```\n\nSå kan dere jo prøve å justere på verdiene for å se om den blir bedre. Det er for eksempel kjent at det er en fordel å ha løperparet (begge løperne), så man kan prøve å gi en ekstra score for dette. [En halv bonde](https://www.chessprogramming.org/Bishop_Pair) er ofte foreslått.\n\n### Piece-Square Tables\n\nFor å tildele brikkene verdier basert på hvor på brettet de står, brukes [piece-square tables](https://www.chessprogramming.org/Piece-Square_Tables). I `evaluation`-mappa ligger det tabeller med verdier for alle brikkene, så om dere får tid kan dere prøve å bruke disse for å gjøre den enda bedre.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fassios%2Fbekk-sjakkbot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fassios%2Fbekk-sjakkbot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fassios%2Fbekk-sjakkbot/lists"}