This commit is contained in:
hagi 2022-12-23 21:49:58 +01:00
parent d62184232c
commit 5d61d69c1a
3 changed files with 142 additions and 28 deletions

View file

@ -0,0 +1,69 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="3e262a23-1a63-4818-97cf-591091cd1e52" name="Changes" comment="">
<change beforePath="$PROJECT_DIR$/blunderboard.py" beforeDir="false" afterPath="$PROJECT_DIR$/blunderboard.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/requirements.txt" beforeDir="false" afterPath="$PROJECT_DIR$/requirements.txt" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="MarkdownSettingsMigration">
<option name="stateVersion" value="1" />
</component>
<component name="ProjectId" id="2JHA16UVCORl9oGXtkokQL85N3r" />
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent"><![CDATA[{
"keyToString": {
"RunOnceActivity.OpenProjectViewOnStart": "true",
"RunOnceActivity.ShowReadmeOnStart": "true",
"WebServerToolWindowFactoryState": "false",
"last_opened_file_path": "/home/hagenest/Repos/blunderboard/blunderboard-py",
"node.js.detected.package.eslint": "true",
"node.js.detected.package.tslint": "true",
"node.js.selected.package.eslint": "(autodetect)",
"node.js.selected.package.tslint": "(autodetect)",
"vue.rearranger.settings.migration": "true"
}
}]]></component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="3e262a23-1a63-4818-97cf-591091cd1e52" name="Changes" comment="" />
<created>1671724416846</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1671724416846</updated>
<workItem from="1671724417946" duration="16204000" />
</task>
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="3" />
</component>
<component name="UnknownFeatures">
<option featureType="com.intellij.fileTypeFactory" implementationName="requirements.txt" />
</component>
<component name="Vcs.Log.Tabs.Properties">
<option name="TAB_STATES">
<map>
<entry key="MAIN">
<value>
<State />
</value>
</entry>
</map>
</option>
</component>
<component name="com.intellij.coverage.CoverageDataManagerImpl">
<SUITE FILE_PATH="coverage/blunderboard_py$blunderboard.coverage" NAME="blunderboard Coverage Results" MODIFIED="1671828227830" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
</component>
</project>

View file

@ -1,7 +1,10 @@
from stockfish import Stockfish from stockfish import Stockfish
from playsound import playsound from pygame import mixer
import time
from pathlib import Path from pathlib import Path
import random import random
import os
import RPi.GPIO as GPIO
settings = { settings = {
"Debug Log File": "", "Debug Log File": "",
@ -24,7 +27,7 @@ settings = {
"UCI_Elo": 1350 "UCI_Elo": 1350
} }
sound_path = [Path("sounds/")] sound_path = Path("sounds")
class BoardReader: class BoardReader:
@ -41,44 +44,71 @@ class BoardReader:
return "" return ""
def play_sound() -> None:
"""
Plays a random sound from the sound path
:return: None
"""
mixer.init()
mixer.music.load("sounds/" + random.choice(os.listdir(sound_path)))
mixer.music.play()
while mixer.music.get_busy():
time.sleep(0.1)
class Game: class Game:
""" """
A class representing the game state A class representing the game state
""" """
def __init__(self, settings: dict): def __init__(self, engine_settings: dict):
self.engine = Stockfish("/usr/local/bin/stockfish") self.engine = Stockfish("/usr/bin/stockfish")
self.settings = settings self.settings = engine_settings
self.engine.update_engine_parameters(self.settings) self.engine.update_engine_parameters(self.settings)
self.matrix = BoardReader() self.matrix = BoardReader()
self.current_evaluation = self.engine.get_evaluation() self.current_evaluation = self.engine.get_evaluation() # This is not necessary, now that I think about it.
self.evaluations = [] self.evaluations = []
self.engine.set_position() self.engine.set_position()
def make_move(move) -> None: def move_was_blunder(self) -> bool:
""" """
Makes a move on the board and updates the game state Returns true if the last move was a blunder
:param move: :return: bool
:return: None """
""" if len(self.evaluations) > 1: # Don't check for blunders on the first move
if self.engine.is_move_correct(move): previous_evaluation = self.evaluations[len(self.evaluations) - 2]
self.engine.make_moves_from_current_position([move]) return abs(self.current_evaluation["value"] - previous_evaluation["value"]) > 100
self.current_evaluation = self.engine.get_evaluation() # TODO This is not a particularly good way to identify a blunder
self.evaluations.append(self.current_evaluation) else:
if move_was_blunder(): return False
# If the played move was a blunder play a random sound from the sound path
playsound(random.choice(sound_path))
def move_was_blunder() -> bool: def make_move(self, move) -> None:
""" """
Returns true if the last move was a blunder Makes a move on the board and updates the game state
:return: bool :param move: str
""" :return: None
previous_evaluation = self.evaluations[-1] """
return self.current_evaluation["value"] < (previous_evaluation["value"] + 3) # TODO This is not a if self.engine.is_move_correct(move):
# particularly good way to identify a blunder self.engine.make_moves_from_current_position([move])
self.current_evaluation = self.engine.get_evaluation()
self.evaluations.append(self.current_evaluation)
print(test_game.current_evaluation)
if self.move_was_blunder():
# If the played move was a blunder play a random sound from the sound path
play_sound()
print("Blunder!")
else:
print("Invalid move")
def __str__(self): def __str__(self):
return "" return ""
test_game = Game(settings)
moves_manual = ["e2e4", "e7e6", "e4e5", "d7d5", "e5d6", "c7d6", "b1c3", "b8c6", "f1b5", "a7a6", "b5a4", "b7b5", "a4b3",
"d6d5", "a2a4", "c8b7", "a4b5", "a6b5", "a1a8", "d8a8", "c3b5", "a8a5", "c2c4", "b7a6", "b5c3", "a6c4",
"b3c4", "d5c4", "d1g4", "a5a1"]
for move in moves_manual:
print(move)
test_game.make_move(move)

View file

@ -1,2 +1,17 @@
stockfish stockfish
playsound <<<<<<< Updated upstream
playsound
=======
<<<<<<< Updated upstream
playsound
pygobject
pgn_parser
=======
<<<<<<< Updated upstream
playsound
=======
pygame
pgn_parser
>>>>>>> Stashed changes
>>>>>>> Stashed changes
>>>>>>> Stashed changes