diff --git a/77 Salvo/javascript/salvo.html b/77 Salvo/javascript/salvo.html new file mode 100644 index 00000000..25752f0f --- /dev/null +++ b/77 Salvo/javascript/salvo.html @@ -0,0 +1,9 @@ + + +SALVO + + +

+
+
+
diff --git a/77 Salvo/javascript/salvo.js b/77 Salvo/javascript/salvo.js
new file mode 100644
index 00000000..b75f5088
--- /dev/null
+++ b/77 Salvo/javascript/salvo.js	
@@ -0,0 +1,504 @@
+// SALVO
+//
+// 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 aa = [];
+var ba = [];
+var ca = [];
+var da = [];
+var ea = [];
+var fa = [];
+var ga = [];
+var ha = [];
+var ka = [];
+var w;
+var r3;
+var x;
+var y;
+var v;
+var v2;
+
+function sgn(k)
+{
+    if (k < 0)
+        return -1;
+    if (k > 0)
+        return 1;
+    return 0;
+}
+
+function fna(k)
+{
+    return (5 - k) * 3 - 2 * Math.floor(k / 4) + sgn(k - 1) - 1;
+}
+
+function fnb(k)
+{
+    return k + Math.floor(k / 4) - sgn(k - 1);
+}
+
+function generate_random()
+{
+    x = Math.floor(Math.random() * 10 + 1);
+    y = Math.floor(Math.random() * 10 + 1);
+    v = Math.floor(3 * Math.random() - 1);
+    v2 = Math.floor(3 * Math.random() - 1);
+}
+
+// Main program
+async function main()
+{
+    print(tab(33) + "SALVO\n");
+    print(tab(15) + "CREATIVE COMPUTING  MORRISTOWN, NEW JERSEY\n");
+    print("\n");
+    print("\n");
+    print("\n");
+    z8 = 0;
+    for (w = 1; w <= 12; w++) {
+        ea[w] = -1;
+        ha[w] = -1;
+    }
+    for (x = 1; x <= 10; x++) {
+        ba[x] = [];
+        ka[x] = [];
+        for (y = 1; y <= 10; y++) {
+            ba[x][y] = 0;
+            ka[x][y] = 0;
+        }
+    }
+    for (x = 1; x <= 12; x++) {
+        fa[x] = 0;
+        ga[x] = 0;
+    }
+    for (x = 1; x <= 10; x++) {
+        aa[x] = [];
+        for (y = 1; y <= 10; y++) {
+            aa[x][y] = 0;
+        }
+    }
+    u6 = 0;
+    for (k = 4; k >= 1; k--) {
+        do {
+            generate_random();
+        } while (v + v2 + v * v2 == 0 || y + v * fnb(k) > 10 || y + v * fnb(k) < 1 || x + v2 * fnb(k) > 10 || x + v2 * fnb(k) < 1) ;
+        u6++;
+        if (u6 > 25) {
+            for (x = 1; x <= 10; x++) {
+                aa[x] = [];
+                for (y = 1; y <= 10; y++) {
+                    aa[x][y] = 0;
+                }
+            }
+            u6 = 0;
+            k = 5;
+            continue;
+        }
+        for (z = 0; z <= fnb(k); z++) {
+            fa[z + fna(k)] = x + v2 * z;
+            ga[z + fna(k)] = y + v * z;
+        }
+        u8 = fna(k);
+        if (u8 <= u8 + fnb(k)) {
+            retry = false;
+            for (z2 = u8; z2 <= u8 + fnb(k); z2++) {
+                if (u8 >= 2) {
+                    for (z3 = 1; z3 < u8 - 1; z3++) {
+                        if (Math.sqrt(Math.pow((fa[z3] - fa[z2]), 2)) + Math.pow((ga[z3] - ga[z2]), 2) < 3.59) {
+                            retry = true;
+                            break;
+                        }
+                    }
+                    if (retry)
+                        break;
+                }
+            }
+            if (retry) {
+                k++;
+                continue;
+            }
+        }
+        for (z = 0; z <= fnb(k); z++) {
+            if (k - 1 < 0)
+                sk = -1;
+            else if (k - 1 > 0)
+                sk = 1;
+            else
+                sk = 0;
+            aa[fa[z + u8]][ga[z + u8]] = 0.5 + sk * (k - 1.5);
+        }
+        u6 = 0;
+    }
+    print("ENTER COORDINATES FOR...\n");
+    print("BATTLESHIP\n");
+    for (x = 1; x <= 5; x++) {
+        str = await input();
+        y = parseInt(str);
+        z = parseInt(str.substr(str.indexOf(",") + 1));
+        ba[y][z] = 3;
+    }
+    print("CRUISER\n");
+    for (x = 1; x <= 3; x++) {
+        str = await input();
+        y = parseInt(str);
+        z = parseInt(str.substr(str.indexOf(",") + 1));
+        ba[y][z] = 2;
+    }
+    print("DESTROYER\n");
+    for (x = 1; x <= 2; x++) {
+        str = await input();
+        y = parseInt(str);
+        z = parseInt(str.substr(str.indexOf(",") + 1));
+        ba[y][z] = 1;
+    }
+    print("DESTROYER\n");
+    for (x = 1; x <= 2; x++) {
+        str = await input();
+        y = parseInt(str);
+        z = parseInt(str.substr(str.indexOf(",") + 1));
+        ba[y][z] = 0.5;
+    }
+    while (1) {
+        print("DO YOU WANT TO START");
+        js = await input();
+        if (js == "WHERE ARE YOUR SHIPS?") {
+            print("BATTLESHIP\n");
+            for (z = 1; z <= 5; z++)
+                print(" " + fa[z] + " " + ga[z] + "\n");
+            print("CRUISER\n");
+            print(" " + fa[6] + " " + ga[6] + "\n");
+            print(" " + fa[7] + " " + ga[7] + "\n");
+            print(" " + fa[8] + " " + ga[8] + "\n");
+            print("DESTROYER\n");
+            print(" " + fa[9] + " " + ga[9] + "\n");
+            print(" " + fa[10] + " " + ga[10] + "\n");
+            print("DESTROYER\n");
+            print(" " + fa[11] + " " + ga[11] + "\n");
+            print(" " + fa[12] + " " + ga[12] + "\n");
+        } else {
+            break;
+        }
+    }
+    c = 0;
+    print("DO YOU WANT TO SEE MY SHOTS");
+    ks = await input();
+    print("\n");
+    if (js != "YES")
+        first_time = true;
+    else
+        first_time = false;
+    while (1) {
+        if (first_time) {
+            first_time = false;
+        } else {
+            if (js == "YES") {
+                c++;
+                print("\n");
+                print("TURN " + c + "\n");
+            }
+            a = 0;
+            for (w = 0.5; w <= 3; w += 0.5) {
+            loop1:
+                for (x = 1; x <= 10; x++) {
+                    for (y = 1; y <= 10; y++) {
+                        if (ba[x][y] == w) {
+                            a += Math.floor(w + 0.5);
+                            break loop1;
+                        }
+                    }
+                }
+            }
+            for (w = 1; w <= 7; w++) {
+                ca[w] = 0;
+                da[w] = 0;
+                fa[w] = 0;
+                ga[w] = 0;
+            }
+            p3 = 0;
+            for (x = 1; x <= 10; x++) {
+                for (y = 1; y <= 10; y++) {
+                    if (aa[x][y] <= 10)
+                        p3++;
+                }
+            }
+            print("YOU HAVE " + a + " SHOTS.\n");
+            if (p3 < a) {
+                print("YOU HAVE MORE SHOTS THAN THERE ARE BLANK SQUARES.\n");
+                print("YOU HAVE WON.\n");
+                return;
+            }
+            if (a == 0) {
+                print("I HAVE WON.\n");
+                return;
+            }
+            for (w = 1; w <= a; w++) {
+                while (1) {
+                    str = await input();
+                    x = parseInt(str);
+                    y = parseInt(str.substr(str.indexOf(",") + 1));
+                    if (x >= 1 && x <= 10 && y >= 1 && y <= 10) {
+                        if (aa[x][y] > 10) {
+                            print("YOU SHOT THERE BEFORE ON TURN " + (aa[x][y] - 10) + "\n");
+                            continue;
+                        }
+                        break;
+                    }
+                    print("ILLEGAL, ENTER AGAIN.\n");
+                }
+                ca[w] = x;
+                da[w] = y;
+            }
+            for (w = 1; w <= a; w++) {
+                if (aa[ca[w]][da[w]] == 3) {
+                    print("YOU HIT MY BATTLESHIP.\n");
+                } else if (aa[ca[w]][da[w]] == 2) {
+                    print("YOU HIT MY CRUISER.\n");
+                } else if (aa[ca[w]][da[w]] == 1) {
+                    print("YOU HIT MY DESTROYER.\n");
+                } else if (aa[ca[w]][da[w]] == 0.5) {
+                    print("YOU HIT MY DESTROYER.\n");
+                }
+                aa[ca[w]][da[w]] = 10 + c;
+            }
+        }
+        a = 0;
+        if (js != "YES") {
+            c++;
+            print("\n");
+            print("TURN " + c + "\n");
+        }
+        a = 0;
+        for (w = 0.5; w <= 3; w += 0.5) {
+        loop2:
+            for (x = 1; x <= 10; x++) {
+                for (y = 1; y <= 10; y++) {
+                    if (ba[x][y] == w) {
+                        a += Math.floor(w + 0.5);
+                        break loop2;
+                    }
+                }
+            }
+        }
+        p3 = 0;
+        for (x = 1; x <= 10; x++) {
+            for (y = 1; y <= 10; y++) {
+                if (aa[x][y] <= 10)
+                    p3++;
+            }
+        }
+        print("I HAVE " + a + " SHOTS.\n");
+        if (p3 < a) {
+            print("I HAVE MORE SHOTS THAN BLANK SQUARES.\n");
+            print("I HAVE WON.\n");
+            return;
+        }
+        if (a == 0) {
+            print("YOU HAVE WON.\n");
+            return;
+        }
+        for (w = 1; w <= 12; w++) {
+            if (ha[w] > 0)
+                break;
+        }
+        if (w <= 12) {
+            for (r = 1; r <= 10; r++) {
+                ka[r] = [];
+                for (s = 1; s <= 10; s++)
+                    ka[r][s] = 0;
+            }
+            for (u = 1; u <= 12; u++) {
+                if (ea[u] >= 10)
+                    continue;
+                for (r = 1; r <= 10; r++) {
+                    for (s = 1; s <= 10; s++) {
+                        if (ba[r][s] >= 10) {
+                            ka[r][s] = -10000000;
+                        } else {
+                            for (m = sgn(1 - r); m <= sgn(10 - r); m++) {
+                                for (n = sgn(1 - s); n <= sgn(10 - s); n++) {
+                                    if (n + m + n * m != 0 && ba[r + m][s + n] == ea[u])
+                                        ka[r][s] += ea[u] - s * Math.floor(ha[u] + 0.5);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+            for (r = 1; r <= a; r++) {
+                fa[r] = r;
+                ga[r] = r;
+            }
+            for (r = 1; r <= 10; r++) {
+                for (s = 1; s <= 10; s++) {
+                    q9 = 1;
+                    for (m = 1; m <= a; m++) {
+                        if (ka[fa[m]][ga[m]] < ka[fa[q9]][ga[q9]])
+                            q9 = m;
+                    }
+                    if ((r > a || r != s) && ka[r][s] >= ka[fa[q9]][ga[q9]]) {
+                        for (m = 1; m <= a; m++) {
+                            if (fa[m] != r) {
+                                fa[q9] = r;
+                                ga[q9] = s;
+                                break;
+                            }
+                            if (ga[m] == s)
+                                break;
+                        }
+                    }
+                }
+            }
+        } else {
+            // RANDOM
+            w = 0;
+            r3 = 0;
+            generate_random();
+            r2 = 0;
+            while (1) {
+                r3++;
+                if (r3 > 100) {
+                    generate_random();
+                    r2 = 0;
+                    r3 = 1;
+                }
+                if (x > 10) {
+                    x = 10 - Math.floor(Math.random() * 2.5);
+                } else if (x <= 0) {
+                    x = 1 + Math.floor(Math.random() * 2.5);
+                }
+                if (y > 10) {
+                    y = 10 - Math.floor(Math.random() * 2.5);
+                } else if (y <= 0) {
+                    y = 1 + Math.floor(Math.random() * 2.5);
+                }
+                while (1) {
+                    valid = true;
+                    if (x < 1 || x > 10 || y < 1 || y > 10 || ba[x][y] > 10) {
+                        valid = false;
+                    } else {
+                        for (q9 = 1; q9 <= w; q9++) {
+                            if (fa[q9] == x && ga[q9] == y) {
+                                valid = false;
+                                break;
+                            }
+                        }
+                        if (q9 > w)
+                            w++;
+                    }
+                    if (valid) {
+                        fa[w] = x;
+                        ga[w] = y;
+                        if (w == a) {
+                            finish = true;
+                            break;
+                        }
+                    }
+                    if (r2 == 6) {
+                        r2 = 0;
+                        finish = false;
+                        break;
+                    }
+                    x1 = [1,-1, 1,1,0,-1][r2];
+                    y1 = [1, 1,-3,1,2, 1][r2];
+                    r2++;
+                    x += x1;
+                    y += y1;
+                }
+                if (finish)
+                    break;
+            }
+        }
+        if (ks == "YES") {
+            for (z5 = 1; z5 <= a; z5++)
+                print(" " + fa[z5] + " " + ga[z5] + "\n");
+        }
+        for (w = 1; w <= a; w++) {
+            hit = false;
+            if (ba[fa[w]][ga[w]] == 3) {
+                print("I HIT YOUR BATTLESHIP.\n");
+                hit = true;
+            } else if (ba[fa[w]][ga[w]] == 2) {
+                print("I HIT YOUR CRUISER.\n");
+                hit = true;
+            } else if (ba[fa[w]][ga[w]] == 1) {
+                print("I HIT YOUR DESTROYER.\n");
+                hit = true;
+            } else if (ba[fa[w]][ga[w]] == 0.5) {
+                print("I HIT YOUR DESTROYER.\n");
+                hit = true;
+            }
+            if (hit) {
+                for (q = 1; q <= 12; q++) {
+                    if (ea[q] != -1)
+                        continue;
+                    ea[q] = 10 + c;
+                    ha[q] = ba[fa[w]][ga[w]];
+                    m3 = 0;
+                    for (m2 = 1; m2 <= 12; m2++) {
+                        if (ha[m2] == ha[q])
+                            m3++;
+                    }
+                    if (m3 == Math.floor(ha[q] + 0.5) + 1 + Math.floor(Math.floor(ha[q] + 0.5) / 3)) {
+                        for (m2 = 1; m2 <= 12; m2++) {
+                            if (ha[m2] == ha[q]) {
+                                ea[m2] = -1;
+                                ha[m2] = -1;
+                            }
+                        }
+                    }
+                    break;
+                }
+                if (q > 12) {
+                    print("PROGRAM ABORT:\n");
+                    for (q = 1; q <= 12; q++) {
+                        print("ea[" + q + "] = " + ea[q] + "\n");
+                        print("ha[" + q + "] = " + ha[q] + "\n");
+                    }
+                    return;
+                }
+            }
+            ba[fa[w]][ga[w]] = 10 + c;
+        }
+    }
+}
+
+main();