wip
This commit is contained in:
parent
d62184232c
commit
5d61d69c1a
69
blunderboard-py/.idea/workspace.xml
Normal file
69
blunderboard-py/.idea/workspace.xml
Normal 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>
|
|
@ -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)
|
||||||
|
|
|
@ -1,2 +1,17 @@
|
||||||
stockfish
|
stockfish
|
||||||
|
<<<<<<< Updated upstream
|
||||||
playsound
|
playsound
|
||||||
|
=======
|
||||||
|
<<<<<<< Updated upstream
|
||||||
|
playsound
|
||||||
|
pygobject
|
||||||
|
pgn_parser
|
||||||
|
=======
|
||||||
|
<<<<<<< Updated upstream
|
||||||
|
playsound
|
||||||
|
=======
|
||||||
|
pygame
|
||||||
|
pgn_parser
|
||||||
|
>>>>>>> Stashed changes
|
||||||
|
>>>>>>> Stashed changes
|
||||||
|
>>>>>>> Stashed changes
|
||||||
|
|
Loading…
Reference in a new issue