diff --git a/46 Hexapawn/javascript/hexapawn.html b/46 Hexapawn/javascript/hexapawn.html new file mode 100644 index 00000000..5ac2b08c --- /dev/null +++ b/46 Hexapawn/javascript/hexapawn.html @@ -0,0 +1,9 @@ + + +HEXAPAWN + + +

+
+
+
diff --git a/46 Hexapawn/javascript/hexapawn.js b/46 Hexapawn/javascript/hexapawn.js
new file mode 100644
index 00000000..6e36428c
--- /dev/null
+++ b/46 Hexapawn/javascript/hexapawn.js	
@@ -0,0 +1,337 @@
+// HEXAPAWN
+//
+// 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 ba = [,
+          [,-1,-1,-1,1,0,0,0,1,1],
+          [,-1,-1,-1,0,1,0,1,0,1],
+          [,-1,0,-1,-1,1,0,0,0,1],
+          [,0,-1,-1,1,-1,0,0,0,1],
+          [,-1,0,-1,1,1,0,0,1,0],
+          [,-1,-1,0,1,0,1,0,0,1],
+          [,0,-1,-1,0,-1,1,1,0,0],
+          [,0,-1,-1,-1,1,1,1,0,0],
+          [,-1,0,-1,-1,0,1,0,1,0],
+          [,0,-1,-1,0,1,0,0,0,1],
+          [,0,-1,-1,0,1,0,1,0,0],
+          [,-1,0,-1,1,0,0,0,0,1],
+          [,0,0,-1,-1,-1,1,0,0,0],
+          [,-1,0,0,1,1,1,0,0,0],
+          [,0,-1,0,-1,1,1,0,0,0],
+          [,-1,0,0,-1,-1,1,0,0,0],
+          [,0,0,-1,-1,1,0,0,0,0],
+          [,0,-1,0,1,-1,0,0,0,0],
+          [,-1,0,0,-1,1,0,0,0,0]];
+var ma = [,
+          [,24,25,36,0],
+          [,14,15,36,0],
+          [,15,35,36,47],
+          [,36,58,59,0],
+          [,15,35,36,0],
+          [,24,25,26,0],
+          [,26,57,58,0],
+          [,26,35,0,0],
+          [,47,48,0,0],
+          [,35,36,0,0],
+          [,35,36,0,0],
+          [,36,0,0,0],
+          [,47,58,0,0],
+          [,15,0,0,0],
+          [,26,47,0,0],
+          [,47,58,0,0],
+          [,35,36,47,0],
+          [,28,58,0,0],
+          [,15,47,0,0]];
+var s = [];
+var t = [];
+var ps = "X.O";
+
+function show_board()
+{
+    print("\n");
+    for (var i = 1; i <= 3; i++) {
+        print(tab(10));
+        for (var j = 1; j <= 3; j++) {
+            print(ps[s[(i - 1) * 3 + j] + 1]);
+        }
+        print("\n");
+    }
+}
+
+function mirror(x)
+{
+    if (x == 1)
+        return 3;
+    if (x == 3)
+        return 1;
+    if (x == 6)
+        return 4;
+    if (x == 4)
+        return 6;
+    if (x == 9)
+        return 7;
+    if (x == 7)
+        return 9;
+    return x;
+}
+
+// Main program
+async function main()
+{
+    print(tab(32) + "HEXAPAWN\n");
+    print(tab(15) + "CREATIVE COMPUTING  MORRISTOWN, NEW JERSEY\n");
+    print("\n");
+    print("\n");
+    print("\n");
+    // HEXAPAWN:  INTERPRETATION OF HEXAPAWN GAME AS PRESENTED IN
+    // MARTIN GARDNER'S "THE UNEXPECTED HANGING AND OTHER MATHEMATIC-
+    // AL DIVERSIONS", CHAPTER EIGHT:  A MATCHBOX GAME-LEARNING MACHINE
+    // ORIGINAL VERSION FOR H-P TIMESHARE SYSTEM BY R.A. KAAPKE 5/5/76
+    // INSTRUCTIONS BY JEFF DALTON
+    // CONVERSION TO MITS BASIC BY STEVE NORTH
+    for (i = 0; i <= 9; i++) {
+        s[i] = 0;
+    }
+    w = 0;
+    l = 0;
+    do {
+        print("INSTRUCTIONS (Y-N)");
+        str = await input();
+        str = str.substr(0, 1);
+    } while (str != "Y" && str != "N") ;
+    if (str == "Y") {
+        print("\n");
+        print("THIS PROGRAM PLAYS THE GAME OF HEXAPAWN.\n");
+        print("HEXAPAWN IS PLAYED WITH CHESS PAWNS ON A 3 BY 3 BOARD.\n");
+        print("THE PAWNS ARE MOVED AS IN CHESS - ONE SPACE FORWARD TO\n");
+        print("AN EMPTY SPACE OR ONE SPACE FORWARD AND DIAGONALLY TO\n");
+        print("CAPTURE AN OPPOSING MAN.  ON THE BOARD, YOUR PAWNS\n");
+        print("ARE 'O', THE COMPUTER'S PAWNS ARE 'X', AND EMPTY \n");
+        print("SQUARES ARE '.'.  TO ENTER A MOVE, TYPE THE NUMBER OF\n");
+        print("THE SQUARE YOU ARE MOVING FROM, FOLLOWED BY THE NUMBER\n");
+        print("OF THE SQUARE YOU WILL MOVE TO.  THE NUMBERS MUST BE\n");
+        print("SEPERATED BY A COMMA.\n");
+        print("\n");
+        print("THE COMPUTER STARTS A SERIES OF GAMES KNOWING ONLY WHEN\n");
+        print("THE GAME IS WON (A DRAW IS IMPOSSIBLE) AND HOW TO MOVE.\n");
+        print("IT HAS NO STRATEGY AT FIRST AND JUST MOVES RANDOMLY.\n");
+        print("HOWEVER, IT LEARNS FROM EACH GAME.  THUS, WINNING BECOMES\n");
+        print("MORE AND MORE DIFFICULT.  ALSO, TO HELP OFFSET YOUR\n");
+        print("INITIAL ADVANTAGE, YOU WILL NOT BE TOLD HOW TO WIN THE\n");
+        print("GAME BUT MUST LEARN THIS BY PLAYING.\n");
+        print("\n");
+        print("THE NUMBERING OF THE BOARD IS AS FOLLOWS:\n");
+        print(tab(10) + "123\n");
+        print(tab(10) + "456\n");
+        print(tab(10) + "789\n");
+        print("\n");
+        print("FOR EXAMPLE, TO MOVE YOUR RIGHTMOST PAWN FORWARD,\n");
+        print("YOU WOULD TYPE 9,6 IN RESPONSE TO THE QUESTION\n");
+        print("'YOUR MOVE ?'.  SINCE I'M A GOOD SPORT, YOU'LL ALWAYS\n");
+        print("GO FIRST.\n");
+        print("\n");
+    }
+    while (1) {
+        x = 0;
+        y = 0;
+        s[4] = 0;
+        s[5] = 0;
+        s[6] = 0;
+        s[1] = -1;
+        s[2] = -1;
+        s[3] = -1;
+        s[7] = 1;
+        s[8] = 1;
+        s[9] = 1;
+        show_board();
+        while (1) {
+            while (1) {
+                print("YOUR MOVE");
+                str = await input();
+                m1 = parseInt(str);
+                m2 = parseInt(str.substr(str.indexOf(",") + 1));
+                if (m1 > 0 && m1 < 10 && m2 > 0 && m2 < 10) {
+                    if (s[m1] != 1 || s[m2] == 1 || (m2 - m1 != -3 && s[m2] != -1) || (m2 > m1) || (m2 - m1 == -3 && s[m2] != 0) || (m2 - m1 < -4) || (m1 == 7 && m2 == 3))
+                        print("ILLEGAL MOVE.\n");
+                    else
+                        break;
+                } else {
+                    print("ILLEGAL CO-ORDINATES.\n");
+                }
+            }
+            
+            // Move player's pawn
+            s[m1] = 0;
+            s[m2] = 1;
+            show_board();
+            
+            // Find computer pawns
+            for (i = 1; i <= 9; i++) {
+                if (s[i] == -1)
+                    break;
+            }
+            // If none or player reached top then finish
+            if (i > 9 || s[1] == 1 || s[2] == 1 || s[3] == 1) {
+                computer = false;
+                break;
+            }
+            // Find computer pawns with valid move
+            for (i = 1; i <= 9; i++) {
+                if (s[i] != -1)
+                    continue;
+                if (s[i + 3] == 0
+                 || (mirror(i) == i && (s[i + 2] == 1 || s[i + 4] == 1))
+                 || (i <= 3 && s[5] == 1)
+                 || s[8] == 1)
+                    break;
+            }
+            if (i > 9) {  // Finish if none possible
+                computer = false;
+                break;
+            }
+            for (i = 1; i <= 19; i++) {
+                for (j = 1; j <= 3; j++) {
+                    for (k = 3; k >= 1; k--) {
+                        t[(j - 1) * 3 + k] = ba[i][(j - 1) * 3 + 4 - k];
+                    }
+                }
+                for (j = 1; j <= 9; j++) {
+                    if (s[j] != ba[i][j])
+                        break;
+                }
+                if (j > 9) {
+                    r = 0;
+                    break;
+                }
+                for (j = 1; j <= 9; j++) {
+                    if (s[j] != t[j])
+                        break;
+                }
+                if (j > 9) {
+                    r = 1;
+                    break;
+                }
+            }
+            if (i > 19) {
+                print("ILLEGAL BOARD PATTERN\n");
+                break;
+            }
+            x = i;
+            for (i = 1; i <= 4; i++) {
+                if (ma[x][i] != 0)
+                    break;
+            }
+            if (i > 4) {
+                print("I RESIGN.\n");
+                computer = false;
+                break;
+            }
+            // Select random move from possibilities
+            do {
+                y = Math.floor(Math.random() * 4 + 1);
+            } while (ma[x][y] == 0) ;
+            // Announce move
+            if (r == 0) {
+                print("I MOVE FROM " + Math.floor(ma[x][y] / 10) + " TO " + ma[x][y] % 10 + "\n");
+                s[Math.floor(ma[x][y] / 10)] = 0;
+                s[ma[x][y] % 10] = -1;
+            } else {
+                print("I MOVE FROM " + mirror(Math.floor(ma[x][y] / 10)) + " TO " + mirror(ma[x][y]) % 10 + "\n");
+                s[mirror(Math.floor(ma[x][y] / 10))] = 0;
+                s[mirror(ma[x][y] % 10)] = -1;
+            }
+            show_board();
+            // Finish if computer reaches bottom
+            if (s[7] == -1 || s[8] == -1 || s[9] == -1) {
+                computer = true;
+                break;
+            }
+            // Finish if no player pawns
+            for (i = 1; i <= 9; i++) {
+                if (s[i] == 1)
+                    break;
+            }
+            if (i > 9) {
+                computer = true;
+                break;
+            }
+            // Finish if player cannot move
+            for (i = 1; i <= 9; i++) {
+                if (s[i] != 1)
+                    continue;
+                if (s[i - 3] == 0)
+                    break;
+                if (mirror(i) != i) {
+                    if (i >= 7) {
+                        if (s[5] == -1)
+                            break;
+                    } else {
+                        if (s[2] == -1)
+                            break;
+                    }
+                } else {
+                    if (s[i - 2] == -1 || s[i - 4] == -1)
+                        break;
+                }
+                
+            }
+            if (i > 9) {
+                print("YOU CAN'T MOVE, SO ");
+                computer = true;
+                break;
+            }
+        }
+        if (computer) {
+            print("I WIN.\n");
+            w++;
+        } else {
+            print("YOU WIN\n");
+            ma[x][y] = 0;
+            l++;
+        }
+        print("I HAVE WON " + w + " AND YOU " + l + " OUT OF " + (l + w) + " GAMES.\n");
+        print("\n");
+    }
+}
+
+main();