aboutsummaryrefslogtreecommitdiff
path: root/voerbak
diff options
context:
space:
mode:
Diffstat (limited to 'voerbak')
-rw-r--r--voerbak/input14
-rw-r--r--voerbak/main.py90
-rw-r--r--voerbak/makefile21
-rw-r--r--voerbak/test.py24
-rw-r--r--voerbak/v2.py105
-rw-r--r--voerbak/voerbak.c110
6 files changed, 364 insertions, 0 deletions
diff --git a/voerbak/input b/voerbak/input
new file mode 100644
index 0000000..1243fe0
--- /dev/null
+++ b/voerbak/input
@@ -0,0 +1,14 @@
+7 6
+4
+3
+3
+2
+1
+2
+2
+7
+1
+7
+1
+7
+1
diff --git a/voerbak/main.py b/voerbak/main.py
new file mode 100644
index 0000000..433f130
--- /dev/null
+++ b/voerbak/main.py
@@ -0,0 +1,90 @@
+from colorama import Fore
+import os
+
+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
+
+class bord:
+ def __init__(self, w, h):
+ self.width = w
+ self.height = h
+ self.board = [[EMPTY for x in range(self.width)] for u in range(self.height)]
+
+ def print(self):
+ print("\n".join([" ".join(self.board[y]) for y in range(len(self.board) -1, -1, -1)]))
+
+ def outside_board(self, coords):
+ return coords[0] < 0 or \
+ coords[1] < 0 or \
+ coords[0] > self.height - 1 or \
+ coords[1] > self.width - 1
+
+ def recursive_solve(self, coords, check_for, direction, current_length):
+ new_position = (
+ coords[0] + direction[0],
+ coords[1] + direction[1]
+ )
+ if self.outside_board(new_position) or self.board[new_position[0]][new_position[1]] != check_for:
+ return current_length
+ else:
+ return self.recursive_solve(new_position, check_for, direction, current_length + 1)
+
+ def check_win(self, coords):
+ directions = [
+ ( 1, 0),
+ ( 1, 1),
+ ( 0, 1),
+ (-1, 1),
+ (-1, 0),
+ (-1, -1),
+ ( 0, -1),
+ ( 1, -1)
+ ]
+ values = list()
+ for direction in directions:
+ values.append(self.recursive_solve(coords, self.board[coords[0]][coords[1]], direction, 0))
+ joined_directions = [
+ values[0] + values[4],
+ values[1] + values[5],
+ values[2] + values[6],
+ values[3] + values[7]
+ ]
+ won = any(i >= 3 for i in joined_directions)
+ if won:
+ for i, value in enumerate(joined_directions):
+ if value >= 3:
+ start_pos = (
+ coords[0] + directions[i][0] * values[i],
+ coords[1] + directions[i][1] * values[i],
+ )
+ end_pos = (
+ coords[0] + directions[i+4][0] * values[i+4],
+ coords[1] + directions[i+4][1] * values[i+4],
+ )
+ print(start_pos, end_pos)
+
+ return won
+
+ def drop_fisje(self, column, disc):
+ for row, value in enumerate(self.board):
+ if self.board[row][column] == EMPTY:
+ self.board[row][column] = disc
+ won = self.check_win((row, column))
+ print(won)
+ return
+
+def main():
+ disc_a = True
+ gert = bord(11, 8)
+ while True:
+ gert.print()
+ column = int(input("column?: ")) - 1
+ os.system("clear")
+ gert.drop_fisje(column, DISC_A if disc_a else DISC_B)
+ disc_a = not disc_a
+
+if __name__ == "__main__":
+ main()
+
diff --git a/voerbak/makefile b/voerbak/makefile
new file mode 100644
index 0000000..a4102d4
--- /dev/null
+++ b/voerbak/makefile
@@ -0,0 +1,21 @@
+CC = gcc
+LD = gcc
+RM = rm -f
+CFLAGS =
+
+SOURCES := $(wildcard *.c)
+OBJECTS := $(patsubst %.c,%.o, $(SOURCES))
+
+all: voerbak
+
+.cpp.o:
+ $(CC) -c $(CFLAGS) $<
+
+voerbak: $(OBJECTS)
+ $(CC) $(OBJECTS) -o voerbak
+
+clean:
+ $(RM) voerbak
+
+distclean: clean
+ $(RM) *.o
diff --git a/voerbak/test.py b/voerbak/test.py
new file mode 100644
index 0000000..8cc1db9
--- /dev/null
+++ b/voerbak/test.py
@@ -0,0 +1,24 @@
+import subprocess
+
+w = 7
+h = 6
+column = 3
+
+process = subprocess.Popen(["./voerbak"],
+ stdin=subprocess.PIPE,
+ stdout=subprocess.PIPE,
+ stderr=None)
+
+process.stdin.write(bytearray(f"{w} {h}\n", "utf-8"))
+process.stdin.flush()
+
+process.stdin.write(bytearray(f"{column}\n", "utf-8"))
+process.stdin.flush()
+
+# process.stdin.write(b"0\n")
+# process.stdin.flush()
+# for c in iter(lambda: process.stdout.read(1), b''):
+# sys.stdout.write(c)
+
+print(process.stdout.readlines(5))
+
diff --git a/voerbak/v2.py b/voerbak/v2.py
new file mode 100644
index 0000000..69e61aa
--- /dev/null
+++ b/voerbak/v2.py
@@ -0,0 +1,105 @@
+from colorama import Fore
+import os
+import time
+
+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
+
+class bord:
+ def __init__(self, w, h):
+ self.width = w
+ self.height = h
+ self.board = [EMPTY] * (w * h)
+
+ def print(self):
+ for y in range(self.height -1, -1, -1):
+ for x in range(self.width):
+ print(self.board[x + y * self.width], end=" ")
+ print("\n", end="")
+
+ def recursive_solve(self, pos, check_for, direction, current_length):
+ overflow = (pos % self.width) + direction
+ if overflow == self.width or overflow == -1: # horizontal overflow
+ return current_length
+ new_position = pos + direction
+ if new_position < 0 or new_position > self.width * self.height - 1: # vertical overflow
+ return current_length
+ if self.board[new_position] != check_for:
+ return current_length
+ return self.recursive_solve(new_position, check_for, direction, current_length + 1)
+
+ def check_win(self, pos):
+ directions = [
+ self.width, # north
+ self.width + 1, # northeast
+ 1, # east
+ -self.width + 1, # southeast
+ -self.width, # south
+ -self.width - 1, # southwest
+ -1, # west
+ self.width - 1, # northwest
+ ]
+ values = list()
+ for direction in directions:
+ values.append(self.recursive_solve(pos, self.board[pos], direction, 0))
+ joined_directions = [
+ values[0] + values[4],
+ values[1] + values[5],
+ values[2] + values[6],
+ values[3] + values[7]
+ ]
+ won = any(i >= 3 for i in joined_directions)
+ if won:
+ for i, value in enumerate(joined_directions):
+ if value >= 3:
+ start_pos = pos + directions[i] * values[i]
+ end_pos = pos + directions[i+4] * values[i+4]
+ print(start_pos, end_pos)
+ self.board[start_pos] = "x"
+ self.board[end_pos] = "x"
+ return won
+
+ def debug(self, pos):
+ self.board[pos] = "x"
+ directions = [
+ self.width, # 0: north
+ self.width + 1, # 1: northeast
+ 1, # 2: east
+ -self.width + 1, # 3: southeast
+ -self.width, # 4: south
+ -self.width - 1, # 5: southwest
+ -1, # 6: west
+ self.width - 1, # 7: northwest
+ ]
+
+ for index, direction in enumerate(directions):
+ new_position = pos + direction
+ if new_position > len(self.board) - 1 or new_position < 0: continue
+ if index in range(1, 4) and pos % self.width == self.width -1: continue
+ if index in range(5, 8) and pos % self.width == 0: continue
+ self.board[new_position] = "o"
+
+ def drop_fisje(self, column, disc):
+ for row in range(self.height):
+ pos = column + row * self.width
+ if self.board[pos] == EMPTY:
+ self.board[pos] = disc
+ won = self.check_win(pos)
+ print(won)
+ return
+
+def main():
+ disc_a = True
+ gert = bord(7, 6)
+ for x in range(len(gert.board)):
+ gert = bord(7, 6)
+ gert.debug(x)
+ gert.print()
+ print("\n\n", end='')
+ time.sleep(0.1)
+
+if __name__ == "__main__":
+ main()
+
diff --git a/voerbak/voerbak.c b/voerbak/voerbak.c
new file mode 100644
index 0000000..e7c6c86
--- /dev/null
+++ b/voerbak/voerbak.c
@@ -0,0 +1,110 @@
+#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 d_index, int currentLength) {
+ int newPos = pos + direction;
+ if (newPos > width * height - 1 || newPos < 0) return currentLength;
+ int row = pos % width;
+ if (row == width && d_index >= 1 && d_index <= 3) return currentLength;
+ if (row == 0 && d_index >= 5 && d_index <= 7) return currentLength;
+ if (board[newPos] != checkFor) return currentLength;
+ return recursiveSolve(board, width, height, newPos, checkFor, direction, d_index, 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], 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 boardFull(int board[], int width, int height) {
+ for (int i = 0; i < width * height; i++)
+ if (board[i] == 0) return false;
+ return true;
+}
+
+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() {
+ printf("voerbak v2\n");
+ 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);
+
+ if (boardFull(board, width, height)) {
+ printf("d:full\n");
+ fflush(stdout);
+ }
+
+ printBoard(board, width, height);
+ }
+
+ return 0;
+}