diff options
author | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-05-15 13:11:23 +0330 |
---|---|---|
committer | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-05-15 13:11:23 +0330 |
commit | f8f1c956b1592a737c9318624e0fc2b4231bd782 (patch) | |
tree | a2ae08815de3e38fd7b7b343aa881d99a341584c /code | |
parent | ebe981b03447877dff6eec263953c48943a5c426 (diff) |
fix some type bugs
Diffstat (limited to 'code')
-rw-r--r-- | code/main.felan | 133 |
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; +}; + + |