aboutsummaryrefslogtreecommitdiff
path: root/code/main.felan
diff options
context:
space:
mode:
Diffstat (limited to 'code/main.felan')
-rw-r--r--code/main.felan133
1 files changed, 125 insertions, 8 deletions
diff --git a/code/main.felan b/code/main.felan
index d70af9b..81862df 100644
--- a/code/main.felan
+++ b/code/main.felan
@@ -1,16 +1,133 @@
+/*
@import("basic.felan");
-f :: (comptime t:type,a:t) -> t {
- if t == u8 putc 'a';
- else putc 'b';
- return a;
+print :: (value:[]u8)->void{
+ i :u64 = 0;
+ while i < value.length {
+ putc value[i];
+ i += @cast(1,u64);
+ }
+};
+
+print :: (value:i64)->void{
+ value := value;
+ str : [20]u8 = undefined;
+ i :u64= 19;
+ while {
+ str[i] = @cast(value % 10,u8) + '0';
+ i -= @cast(1,u64);
+ value /= 10;
+ value != 0;
+ } {}
+
+ j :u64= i+@cast(1,u64);
+ while j < @cast(20,u64) {
+ putc str[j];
+ j += @cast(1,u64);
+ }
+};
+
+println :: (value:i64)->void{
+ print(value);
+ putc '\n';
+};
+
+println :: ()->void{
+ putc '\n';
};
main :: () -> void {
- b:u8 = '1';
- c:i64 = 69;
- f(u8,b);
- f(i64,c);
+ stones := 6;
+ player := 1;
+ while stones != 0 {
+ c := choose_ai(stones);
+ print("player: ");
+ print(player);
+ print(" ---------\n");
+ println(stones);
+ println(c);
+
+ if (stones == 2 || stones == 1) && stones == c {
+ print("player: ");
+ print(player);
+ print(" won\n");
+ }
+
+ stones -= c;
+
+ player = (if (player == 1) 2 else 1);
+ }
};
+choose_ai :: (stones_left:i64) -> i64 {
+ return (if (stones_left % 3 == 0) 1 else stones_left % 3);
+};
+*/
+@import("basic.felan");
+
+main :: () -> void {
+ stones := 6;
+ player := 1;
+ while stones > 0 {
+ r :res =minimax(stones,true);
+ stones -= r.move;
+ putc @cast(stones,u8) + '0';
+ putc '\n';
+ putc 'p';
+ putc @cast(player,u8) + '0';
+ putc '\n';
+ player = (if player == 2 1 else 2);
+ }
+};
+
+res :: struct {
+ move : i64;
+ score : i64;
+};
+
+minimax :: (currentStones:i64, isMaximizing:bool) -> res {
+ if currentStones <= 0 {
+ r : res = undefined;
+ r.move = 0;
+ r.score = (if isMaximizing {-1;} else {1;});
+ return r;
+ }
+
+ found := false;
+ bestMove : res = undefined;
+ score := (if isMaximizing {-1000000;} else {1000000;});
+ move := 1;
+
+ while move <= 2 {
+ if currentStones - move >= 0 {
+ found = true;
+ result : res = minimax(currentStones - move, !isMaximizing);
+ if isMaximizing {
+ if result.score > score {
+ bestMove.move = move;
+ bestMove.score = result.score;
+ score = result.score;
+ }
+ }else{
+ if result.score < score {
+ bestMove.move = move;
+ bestMove.score = result.score;
+ score = result.score;
+ }
+ }
+ }
+ move += 1;
+ }
+
+ if !found {
+ r : res = undefined;
+ r.move = 0;
+ r.score = (if isMaximizing {-1;} else {1;});
+ return r;
+ }
+
+ return bestMove;
+};
+
+