mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-22 07:10:42 -08:00
364 lines
9.4 KiB
JavaScript
364 lines
9.4 KiB
JavaScript
// MASTERMIND
|
|
//
|
|
// 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 p9;
|
|
var c9;
|
|
var b;
|
|
var w;
|
|
var f;
|
|
var m;
|
|
|
|
var qa;
|
|
var sa;
|
|
var ss;
|
|
var as;
|
|
var gs;
|
|
var hs;
|
|
|
|
function initialize_qa()
|
|
{
|
|
for (s = 1; s <= p9; s++)
|
|
qa[s] = 0;
|
|
}
|
|
|
|
function increment_qa()
|
|
{
|
|
if (qa[1] <= 0) {
|
|
// If zero, this is our firt increment: make all ones
|
|
for (s = 1; s <= p9; s++)
|
|
qa[s] = 1;
|
|
} else {
|
|
q = 1;
|
|
while (1) {
|
|
qa[q] = qa[q] + 1;
|
|
if (qa[q] <= c9)
|
|
return;
|
|
qa[q] = 1;
|
|
q++;
|
|
}
|
|
}
|
|
}
|
|
|
|
function convert_qa()
|
|
{
|
|
for (s = 1; s <= p9; s++) {
|
|
as[s] = ls.substr(qa[s] - 1, 1);
|
|
}
|
|
}
|
|
|
|
function get_number()
|
|
{
|
|
b = 0;
|
|
w = 0;
|
|
f = 0;
|
|
for (s = 1; s <= p9; s++) {
|
|
if (gs[s] == as[s]) {
|
|
b++;
|
|
gs[s] = String.fromCharCode(f);
|
|
as[s] = String.fromCharCode(f + 1);
|
|
f += 2;
|
|
} else {
|
|
for (t = 1; t <= p9; t++) {
|
|
if (gs[s] == as[t] && gs[t] != as[t]) {
|
|
w++;
|
|
as[t] = String.fromCharCode(f);
|
|
gs[s] = String.fromCharCode(f + 1);
|
|
f += 2;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function convert_qa_hs()
|
|
{
|
|
for (s = 1; s <= p9; s++) {
|
|
hs[s] = ls.substr(qa[s] - 1, 1);
|
|
}
|
|
}
|
|
|
|
function copy_hs()
|
|
{
|
|
for (s = 1; s <= p9; s++) {
|
|
gs[s] = hs[s];
|
|
}
|
|
}
|
|
|
|
function board_printout()
|
|
{
|
|
print("\n");
|
|
print("BOARD\n");
|
|
print("MOVE GUESS BLACK WHITE\n");
|
|
for (z = 1; z <= m - 1; z++) {
|
|
str = " " + z + " ";
|
|
while (str.length < 9)
|
|
str += " ";
|
|
str += ss[z];
|
|
while (str.length < 25)
|
|
str += " ";
|
|
str += sa[z][1];
|
|
while (str.length < 35)
|
|
str += " ";
|
|
str += sa[z][2];
|
|
print(str + "\n");
|
|
}
|
|
print("\n");
|
|
}
|
|
|
|
function quit()
|
|
{
|
|
print("QUITTER! MY COMBINATION WAS: ");
|
|
convert_qa();
|
|
for (x = 1; x <= p9; x++) {
|
|
print(as[x]);
|
|
}
|
|
print("\n");
|
|
print("GOOD BYE\n");
|
|
}
|
|
|
|
function show_score()
|
|
{
|
|
print("SCORE:\n");
|
|
show_points();
|
|
}
|
|
|
|
function show_points()
|
|
{
|
|
print(" COMPUTER " + c + "\n");
|
|
print(" HUMAN " + h + "\n");
|
|
print("\n");
|
|
}
|
|
|
|
var color = ["BLACK", "WHITE", "RED", "GREEN",
|
|
"ORANGE", "YELLOW", "PURPLE", "TAN"];
|
|
|
|
// Main program
|
|
async function main()
|
|
{
|
|
print(tab(30) + "MASTERMIND\n");
|
|
print(tab(15) + "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY\n");
|
|
print("\n");
|
|
print("\n");
|
|
print("\n");
|
|
//
|
|
// MASTERMIND II
|
|
// STEVE NORTH
|
|
// CREATIVE COMPUTING
|
|
// PO BOX 789-M MORRISTOWN NEW JERSEY 07960
|
|
//
|
|
//
|
|
while (1) {
|
|
print("NUMBER OF COLORS");
|
|
c9 = parseInt(await input());
|
|
if (c9 <= 8)
|
|
break;
|
|
print("NO MORE THAN 8, PLEASE!\n");
|
|
}
|
|
print("NUMBER OF POSITIONS");
|
|
p9 = parseInt(await input());
|
|
print("NUMBER OF ROUNDS");
|
|
r9 = parseInt(await input());
|
|
p = Math.pow(c9, p9);
|
|
print("TOTAL POSSIBILITIES = " + p + "\n");
|
|
h = 0;
|
|
c = 0;
|
|
qa = [];
|
|
sa = [];
|
|
ss = [];
|
|
as = [];
|
|
gs = [];
|
|
ia = [];
|
|
hs = [];
|
|
ls = "BWRGOYPT";
|
|
print("\n");
|
|
print("\n");
|
|
print("COLOR LETTER\n");
|
|
print("===== ======\n");
|
|
for (x = 1; x <= c9; x++) {
|
|
str = color[x - 1];
|
|
while (str.length < 13)
|
|
str += " ";
|
|
str += ls.substr(x - 1, 1);
|
|
print(str + "\n");
|
|
}
|
|
print("\n");
|
|
for (r = 1; r <= r9; r++) {
|
|
print("\n");
|
|
print("ROUND NUMBER " + r + " ----\n");
|
|
print("\n");
|
|
print("GUESS MY COMBINATION.\n");
|
|
print("\n");
|
|
// Get a combination
|
|
a = Math.floor(p * Math.random() + 1);
|
|
initialize_qa();
|
|
for (x = 1; x <= a; x++) {
|
|
increment_qa();
|
|
}
|
|
for (m = 1; m <= 10; m++) {
|
|
while (1) {
|
|
print("MOVE # " + m + " GUESS ");
|
|
str = await input();
|
|
if (str == "BOARD") {
|
|
board_printout();
|
|
} else if (str == "QUIT") {
|
|
quit();
|
|
return;
|
|
} else if (str.length != p9) {
|
|
print("BAD NUMBER OF POSITIONS.\n");
|
|
} else {
|
|
// Unpack str into gs(1-p9)
|
|
for (x = 1; x <= p9; x++) {
|
|
y = ls.indexOf(str.substr(x - 1, 1));
|
|
if (y < 0) {
|
|
print("'" + str.substr(x - 1, 1) + "' IS UNRECOGNIZED.\n");
|
|
break;
|
|
}
|
|
gs[x] = str.substr(x - 1, 1);
|
|
}
|
|
if (x > p9)
|
|
break;
|
|
}
|
|
}
|
|
// Now we convert qa(1-p9) into as(1-p9) [ACTUAL GUESS]
|
|
convert_qa();
|
|
// And get number of blacks and white
|
|
get_number();
|
|
if (b == p9) {
|
|
print("YOU GUESSED IT IN " + m + " MOVES!\n");
|
|
break;
|
|
}
|
|
//tell human results
|
|
print("YOU HAVE " + b + " BLACKS AND " + w + " WHITES.")
|
|
// Save all this stuff for board printout later
|
|
ss[m] = str;
|
|
sa[m] = [];
|
|
sa[m][1] = b;
|
|
sa[m][2] = w;
|
|
}
|
|
if (m > 10) {
|
|
print("YOU RAN OUT OF MOVES! THAT'S ALL YOU GET!\n");
|
|
}
|
|
h += m;
|
|
show_score();
|
|
|
|
//
|
|
// Now computer guesses
|
|
//
|
|
for (x = 1; x <= p; x++)
|
|
ia[x] = 1;
|
|
print("NOW I GUESS. THINK OF A COMBINATION.\n");
|
|
print("HIT RETURN WHEN READY:");
|
|
str = await input();
|
|
for (m = 1; m <= 10; m++) {
|
|
initialize_qa();
|
|
// Find a guess
|
|
g = Math.floor(p * Math.random() + 1);
|
|
if (ia[g] != 1) {
|
|
for (x = g; x <= p; x++) {
|
|
if (ia[x] == 1)
|
|
break;
|
|
}
|
|
if (x > p) {
|
|
for (x = 1; x <= g; x++) {
|
|
if (ia[x] == 1)
|
|
break;
|
|
}
|
|
if (x > g) {
|
|
print("YOU HAVE GIVEN ME INCONSISTENT INFORMATION.\n");
|
|
print("TRY AGAIN, AND THIS TIME PLEASE BE MORE CAREFUL.\n");
|
|
for (x = 1; x <= p; x++)
|
|
ia[x] = 1;
|
|
print("NOW I GUESS. THINK OF A COMBINATION.\n");
|
|
print("HIT RETURN WHEN READY:");
|
|
str = await input();
|
|
m = 0;
|
|
continue;
|
|
}
|
|
}
|
|
g = x;
|
|
}
|
|
// Now we convert guess #g into gs
|
|
for (x = 1; x <= g; x++) {
|
|
increment_qa();
|
|
}
|
|
convert_qa_hs();
|
|
print("MY GUESS IS: ");
|
|
for (x = 1; x <= p9; x++) {
|
|
print(hs[x]);
|
|
}
|
|
print(" BLACKS, WHITES ");
|
|
str = await input();
|
|
b1 = parseInt(str);
|
|
w1 = parseInt(str.substr(str.indexOf(",") + 1));
|
|
if (b1 == p9) {
|
|
print("I GOT IT IN " + m + " MOVES!\n");
|
|
break;
|
|
}
|
|
initialize_qa();
|
|
for (x = 1; x <= p; x++) {
|
|
increment_qa();
|
|
if (ia[x] != 0) {
|
|
copy_hs();
|
|
convert_qa();
|
|
get_number();
|
|
if (b1 > b || w1 > w)
|
|
ia[x] = 0;
|
|
}
|
|
}
|
|
}
|
|
if (m > 10) {
|
|
print("I USED UP ALL MY MOVES!\n");
|
|
print("I GUESS MY CPU I JUST HAVING AN OFF DAY.\n");
|
|
}
|
|
c += m;
|
|
show_score();
|
|
}
|
|
print("GAME OVER\n");
|
|
print("FINAL SCORE:\n");
|
|
show_points();
|
|
}
|
|
|
|
main();
|