aboutsummaryrefslogtreecommitdiff
path: root/api
diff options
context:
space:
mode:
Diffstat (limited to 'api')
-rw-r--r--api/game/socket.py39
-rwxr-xr-xapi/game/voerbakbin0 -> 16592 bytes
-rw-r--r--api/game/voerbak.c100
-rw-r--r--api/game/voerbak_connector.py79
4 files changed, 200 insertions, 18 deletions
diff --git a/api/game/socket.py b/api/game/socket.py
index c4e5ac7..d6dff1b 100644
--- a/api/game/socket.py
+++ b/api/game/socket.py
@@ -1,30 +1,33 @@
from flask import Blueprint, request, make_response
-from flask_socketio import SocketIO, emit, disconnect, Namespace, emit
+from flask_socketio import SocketIO, emit, disconnect, emit
+from game.voerbak_connector import bord
+from db import cursor
import time
import json
-class GameSocketNamespace(Namespace):
- def connect(self):
- print("new connection")
- emit("gert", {"gert": "banaan"})
+namespace = "/game/socket"
- def on_connect(self):
- print("new connection")
- emit("gert", {"gert": "banaan"})
+class game:
+ def __init__(self, game_id):
+ self.game_id = game_id
+ self.board = bord(7, 6)
- def on_disconnect(self):
- print("disconnect")
+ def move(self, user_id, column):
+ # player_1 = cursor.execute("select player_1_id from games where game_id = ?", [self.game_id]).fetchone()[0]
+ # player_1_move = player_1 == user_id
+ # if not self.board.player_1 == player_1_move: return
+ self.board.drop_fisje(column)
- def new_move(self, data):
- print("new_move")
+def run(app):
+ io = SocketIO(app)
+
+ @io.on("new_move", namespace)
+ def new_move(data):
print(data)
- def resign(self, data):
- print("resign")
+ @io.on("resign", namespace)
+ def resign(data):
print(data)
-def run(app):
- socketio = SocketIO(app)
- socketio.on_namespace(GameSocketNamespace("/game/socket"))
- socketio.run(app, host="127.0.0.1", port=5000, debug=True)
+ io.run(app, host="127.0.0.1", port=5000, debug=True)
diff --git a/api/game/voerbak b/api/game/voerbak
new file mode 100755
index 0000000..e7b7a14
--- /dev/null
+++ b/api/game/voerbak
Binary files differ
diff --git a/api/game/voerbak.c b/api/game/voerbak.c
new file mode 100644
index 0000000..f0ecb4a
--- /dev/null
+++ b/api/game/voerbak.c
@@ -0,0 +1,100 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <memory.h>
+#include <stdbool.h>
+
+void printBoard(int board[], int width, int height) {
+ for (int i = 0; i < width * height; i++)
+ printf("%d", board[i]);
+ printf("\n");
+ fflush(stdout);
+}
+
+int recursiveSolve(int board[], int width, int height, int pos, int checkFor, int direction, int currentLength) {
+ int overflow = (pos % width) + direction;
+ if (overflow == width || overflow == -1)
+ return currentLength;
+ int newPos = pos + direction;
+ if (newPos < 0 || newPos > width * height - 1)
+ return currentLength;
+ if (board[newPos] != checkFor)
+ return currentLength;
+ return recursiveSolve(board, width, height, newPos, checkFor, direction, currentLength + 1);
+}
+
+bool checkWin(int board[], int width, int height, int pos) {
+ int directions[8] = {
+ width, // north
+ width + 1, // northeast
+ 1, // east
+ -width + 1, // southeast
+ -width, // south
+ -width -1, // southwest
+ -1, // west
+ width -1 // northwest
+ };
+
+ int values[8];
+ for (int i = 0; i < 8; i++)
+ values[i] = recursiveSolve(board, width, height, pos, board[pos], directions[i], 0);
+
+ int joinedValues[4] = {
+ values[0] + values[4],
+ values[1] + values[5],
+ values[2] + values[6],
+ values[3] + values[7]
+ };
+
+ bool won = false;
+ for (int i = 0; i < 4; i++) {
+ if (joinedValues[i] >= 3) {
+ won = won || true;
+
+ int start_pos = pos + directions[i+0] * values[i+0];
+ int end_pos = pos + directions[i+4] * values[i+4];
+ printf("w:%d-%d\n", start_pos, end_pos);
+ fflush(stdout);
+ }
+ }
+
+ return won;
+}
+
+bool dropFisje(int board[], int width, int height, int column, int disc) {
+ for (int row = 0; row < height; row++) {
+ int pos = column + row * width;
+ if (board[pos] == 0) {
+ board[pos] = disc;
+ bool won = checkWin(board, width, height, pos);
+ return true; // success
+ }
+ }
+ printf("e:full\n");
+ fflush(stdout);
+ return false; // unsuccessful drop on board full
+}
+
+int main() {
+ int width, height;
+ scanf("%d %d", &width, &height);
+
+ int board[width * height];
+ memset(board, 0, sizeof board);
+
+ bool player_1 = true;
+ int move = 0;
+ while (scanf("%d", &move) == 1) {
+ if (move == 0) break;
+ if (move < 1 || move > width) continue;
+
+ bool dropSuccess = dropFisje(board, width, height, move - 1, player_1 + 1);
+
+ player_1 = player_1 ^ dropSuccess; // only flip turns on successful drop
+ printf("m:%s\n", player_1 ? "true" : "false");
+ fflush(stdout);
+
+ printBoard(board, width, height);
+ }
+
+ return 0;
+}
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()
+