From 42876f41c8e069b8d897a345a7946be3566f316f Mon Sep 17 00:00:00 2001 From: nanochess Date: Mon, 1 Mar 2021 21:48:52 -0600 Subject: [PATCH] Ported NIM to Javascript --- 65 Nim/javascript/nim.html | 9 ++ 65 Nim/javascript/nim.js | 270 +++++++++++++++++++++++++++++++++++++ 2 files changed, 279 insertions(+) create mode 100644 65 Nim/javascript/nim.html create mode 100644 65 Nim/javascript/nim.js diff --git a/65 Nim/javascript/nim.html b/65 Nim/javascript/nim.html new file mode 100644 index 00000000..db914b25 --- /dev/null +++ b/65 Nim/javascript/nim.html @@ -0,0 +1,9 @@ + + +NIM + + +

+
+
+
diff --git a/65 Nim/javascript/nim.js b/65 Nim/javascript/nim.js
new file mode 100644
index 00000000..847c049a
--- /dev/null
+++ b/65 Nim/javascript/nim.js	
@@ -0,0 +1,270 @@
+// NIM
+//
+// Converted from BASIC to Javascript by Oscar Toledo G. (nanochess)
+//
+
+function print(str)
+{
+    document.getElementById("output").appendChild(document.createTextNode(str));
+}
+
+function input()
+{
+    var input_element;
+    var input_str;
+    
+    return new Promise(function (resolve) {
+                       input_element = document.createElement("INPUT");
+                       
+                       print("? ");
+                       input_element.setAttribute("type", "text");
+                       input_element.setAttribute("length", "50");
+                       document.getElementById("output").appendChild(input_element);
+                       input_element.focus();
+                       input_str = undefined;
+                       input_element.addEventListener("keydown", function (event) {
+                                                      if (event.keyCode == 13) {
+                                                      input_str = input_element.value;
+                                                      document.getElementById("output").removeChild(input_element);
+                                                      print(input_str);
+                                                      print("\n");
+                                                      resolve(input_str);
+                                                      }
+                                                      });
+                       });
+}
+
+function tab(space)
+{
+    var str = "";
+    while (space-- > 0)
+        str += " ";
+    return str;
+}
+
+var a = [];
+var b = [];
+var d = [];
+
+// Main program
+async function main()
+{
+    print(tab(33) + "NIM\n");
+    print(tab(15) + "CREATIVE COMPUTING  MORRISTOWN, NEW JERSEY\n");
+    print("\n");
+    print("\n");
+    print("\n");
+    for (i = 1; i <= 100; i++) {
+        a[i] = 0;
+        b[i] = [];
+        for (j = 0; j <= 10; j++)
+            b[i][j] = 0;
+    }
+    d[0] = 0;
+    d[1] = 0;
+    d[2] = 0;
+    print("DO YOU WANT INSTRUCTIONS");
+    while (1) {
+        str = await input();
+        str = str.toUpperCase();
+        if (str == "YES" || str == "NO")
+            break;
+        print("PLEASE ANSWER YES OR NO\n");
+    }
+    if (str == "YES") {
+        print("THE GAME IS PLAYED WITH A NUMBER OF PILES OF OBJECTS.\n");
+        print("ANY NUMBER OF OBJECTS ARE REMOVED FROM ONE PILE BY YOU AND\n");
+        print("THE MACHINE ALTERNATELY.  ON YOUR TURN, YOU MAY TAKE\n");
+        print("ALL THE OBJECTS THAT REMAIN IN ANY PILE, BUT YOU MUST\n");
+        print("TAKE AT LEAST ONE OBJECT, AND YOU MAY TAKE OBJECTS FROM\n");
+        print("ONLY ONE PILE ON A SINGLE TURN.  YOU MUST SPECIFY WHETHER\n");
+        print("WINNING IS DEFINED AS TAKING OR NOT TAKING THE LAST OBJECT,\n");
+        print("THE NUMBER OF PILES IN THE GAME, AND HOW MANY OBJECTS ARE\n");
+        print("ORIGINALLY IN EACH PILE.  EACH PILE MAY CONTAIN A\n");
+        print("DIFFERENT NUMBER OF OBJECTS.\n");
+        print("THE MACHINE WILL SHOW ITS MOVE BY LISTING EACH PILE AND THE\n");
+        print("NUMBER OF OBJECTS REMAINING IN THE PILES AFTER  EACH OF ITS\n");
+        print("MOVES.\n");
+    }
+    while (1) {
+        print("\n");
+        while (1) {
+            print("ENTER WIN OPTION - 1 TO TAKE LAST, 2 TO AVOID LAST");
+            w = parseInt(await input());
+            if (w == 1 || w == 2)
+                break;
+        }
+        while (1) {
+            print("ENTER NUMBER OF PILES");
+            n = parseInt(await input());
+            if (n >= 1 && n <= 100)
+                break;
+        }
+        print("ENTER PILE SIZES\n");
+        for (i = 1; i <= n; i++) {
+            while (1) {
+                print(i + " ");
+                a[i] = parseInt(await input());
+                if (a[i] >= 1 && a[i] <= 2000)
+                    break;
+            }
+        }
+        print("DO YOU WANT TO MOVE FIRST");
+        while (1) {
+            str = await input();
+            str = str.toUpperCase();
+            if (str == "YES" || str == "NO")
+                break;
+            print("PLEASE ANSWER YES OR NO.\n");
+        }
+        if (str == "YES")
+            player_first = true;
+        else
+            player_first = false;
+        while (1) {
+            if (!player_first) {
+                if (w != 1) {
+                    c = 0;
+                    for (i = 1; i <= n; i++) {
+                        if (a[i] == 0)
+                            continue;
+                        c++;
+                        if (c == 3)
+                            break;
+                        d[c] = i;
+                    }
+                    if (i > n) {
+                        if (c == 2) {
+                            if (a[d[1]] == 1 || a[d[2]] == 1) {
+                                print("MACHINE WINS\n");
+                                break;
+                            }
+                        } else {
+                            if (a[d[1]] > 1)
+                                print("MACHINE WINS\n");
+                            else
+                                print("MACHINE LOSES\n");
+                            break;
+                        }
+                        
+                    } else {
+                        c = 0;
+                        for (i = 1; i <= n; i++) {
+                            if (a[i] > 1)
+                                break;
+                            if (a[i] == 0)
+                                continue;
+                            c++;
+                        }
+                        if (i > n && c % 2) {
+                            print("MACHINE LOSES\n");
+                            break;
+                        }
+                    }
+                }
+                for (i = 1; i <= n; i++) {
+                    e = a[i];
+                    for (j = 0; j <= 10; j++) {
+                        f = e / 2;
+                        b[i][j] = 2 * (f - Math.floor(f));
+                        e = Math.floor(f);
+                    }
+                }
+                for (j = 10; j >= 0; j--) {
+                    c = 0;
+                    h = 0;
+                    for (i = 1; i <= n; i++) {
+                        if (b[i][j] == 0)
+                            continue;
+                        c++;
+                        if (a[i] <= h)
+                            continue;
+                        h = a[i];
+                        g = i;
+                    }
+                    if (c % 2)
+                        break;
+                }
+                if (j < 0) {
+                    do {
+                        e = Math.floor(n * Math.random() + 1);
+                    } while (a[e] == 0) ;
+                    f = Math.floor(a[e] * Math.random() + 1);
+                    a[e] -= f;
+                } else {
+                    a[g] = 0;
+                    for (j = 0; j <= 10; j++) {
+                        b[g][j] = 0;
+                        c = 0;
+                        for (i = 1; i <= n; i++) {
+                            if (b[i][j] == 0)
+                                continue;
+                            c++;
+                        }
+                        a[g] = a[g] + (c % 2) * Math.pow(2, j);
+                    }
+                    if (w != 1) {
+                        c = 0;
+                        for (i = 1; i <= n; i++) {
+                            if (a[i] > 1)
+                                break;
+                            if (a[i] == 0)
+                                continue;
+                            c++;
+                        }
+                        if (i > n && c % 2 == 0)
+                            a[g] = 1 - a[g];
+                    }
+                }
+                print("PILE  SIZE\n");
+                for (i = 1; i <= n; i++)
+                    print(" " + i + "  " + a[i] + "\n");
+                if (w != 2) {
+                    if (game_completed()) {
+                        print("MACHINE WINS");
+                        break;
+                    }
+                }
+            } else {
+                player_first = false;
+            }
+            while (1) {
+                print("YOUR MOVE - PILE , NUMBER TO BE REMOVED");
+                str = await input();
+                x = parseInt(str);
+                y = parseInt(str.substr(str.indexOf(",") + 1));
+                if (x < 1 || x > n)
+                    continue;
+                if (y < 1 || y > a[x])
+                    continue;
+                break;
+            }
+            a[x] -= y;
+            if (game_completed()) {
+                print("MACHINE LOSES");
+                break;
+            }
+        }
+        print("DO YOU WANT TO PLAY ANOTHER GAME");
+        while (1) {
+            str = await input();
+            str = str.toUpperCase();
+            if (str == "YES" || str == "NO")
+                break;
+            print("PLEASE ANSWER YES OR NO.\n");
+        }
+        if (str == "NO")
+            break;
+    }
+}
+
+function game_completed()
+{
+    for (var i = 1; i <= n; i++) {
+        if (a[i] != 0)
+            return false;
+    }
+    return true;
+}
+
+main();