mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-23 07:29:02 -08:00
Ported SALVO to Javascript
This commit is contained in:
9
77 Salvo/javascript/salvo.html
Normal file
9
77 Salvo/javascript/salvo.html
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>SALVO</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<pre id="output" style="font-size: 12pt;"></pre>
|
||||||
|
<script src="salvo.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
504
77 Salvo/javascript/salvo.js
Normal file
504
77 Salvo/javascript/salvo.js
Normal file
@@ -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<A>\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<B>\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<A>\n");
|
||||||
|
print(" " + fa[9] + " " + ga[9] + "\n");
|
||||||
|
print(" " + fa[10] + " " + ga[10] + "\n");
|
||||||
|
print("DESTROYER<B>\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<A>.\n");
|
||||||
|
} else if (aa[ca[w]][da[w]] == 0.5) {
|
||||||
|
print("YOU HIT MY DESTROYER<B>.\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<A>.\n");
|
||||||
|
hit = true;
|
||||||
|
} else if (ba[fa[w]][ga[w]] == 0.5) {
|
||||||
|
print("I HIT YOUR DESTROYER<B>.\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();
|
||||||
Reference in New Issue
Block a user