aboutsummaryrefslogtreecommitdiff
path: root/api/game/voerbak_connector.py
diff options
context:
space:
mode:
Diffstat (limited to 'api/game/voerbak_connector.py')
-rw-r--r--api/game/voerbak_connector.py79
1 files changed, 79 insertions, 0 deletions
diff --git a/api/game/voerbak_connector.py b/api/game/voerbak_connector.py
new file mode 100644
index 0000000..6274ada
--- /dev/null
+++ b/api/game/voerbak_connector.py
@@ -0,0 +1,79 @@
+from colorama import Fore
+import logging as log
+import subprocess
+import os
+
+VERBOSE = log.ERROR
+log.basicConfig(format="[ %(levelname)s ]: %(message)s", level=VERBOSE)
+
+DISC_SHAPE = "o"
+DISC_A = Fore.RED + DISC_SHAPE + Fore.RESET
+DISC_B = Fore.BLUE + DISC_SHAPE + Fore.RESET
+EMPTY = Fore.LIGHTBLACK_EX + "_" + Fore.RESET
+
+VOERBAK_LOCATION = "./voerbak"
+if os.name == "nt": VOERBAK_LOCATION += ".exe"
+
+class bord:
+ def __init__(self, w, h):
+ self.width = w
+ self.height = h
+ self.player_1 = True
+ self.board = "0" * (w * h)
+ self.win_positions = []
+ self.process = subprocess.Popen(["./voerbak"],
+ stdin=subprocess.PIPE,
+ stdout=subprocess.PIPE,
+ stderr=None)
+ self.process.stdin.write(bytearray(f"{w} {h}\n", "utf-8"))
+ self.process.stdin.flush()
+
+ def get_output(self):
+ return self.process.stdout.readline().decode()[:-1]
+
+ def update_board(self):
+ buffer = self.get_output()
+ while not buffer.isdigit():
+ if buffer.startswith("w:"):
+ self.win_positions.append(buffer[2:].split("-"))
+ log.info(f"won: {buffer[2:].split('-')}")
+ elif buffer.startswith("e:"):
+ log.warning(buffer[2:])
+ elif buffer.startswith("m:"):
+ substr = buffer[2:]
+ self.player_1 = True if substr == "true" else False
+ buffer = self.get_output()
+ self.board = buffer
+
+ def print(self):
+ for y in range(self.height -1, -1, -1):
+ for x in range(self.width):
+ state = self.board[x + y * self.width]
+ char = [EMPTY,
+ DISC_A,
+ DISC_B
+ ]
+ print(char[int(state)], end=" ")
+ print("\n", end="")
+
+ def drop_fisje(self, column):
+ self.process.stdin.write(bytearray(f"{column}\n", "utf-8"))
+ self.process.stdin.flush()
+ self.update_board()
+
+def main():
+ gert = bord(7, 6)
+ while True:
+ print(gert.player_1)
+ if len(gert.win_positions) > 0:
+ print(f"won: {gert.win_positions}")
+ exit(0)
+ gert.print()
+ column = int(input("column?: ")) - 1
+ if column not in range(gert.width):
+ continue
+ gert.drop_fisje(column + 1)
+
+if __name__ == "__main__":
+ main()
+