diff --git a/10 Blackjack/javascript/blackjack.html b/10 Blackjack/javascript/blackjack.html
new file mode 100644
index 00000000..eb18ca9e
--- /dev/null
+++ b/10 Blackjack/javascript/blackjack.html
@@ -0,0 +1,9 @@
+
+
+BLACKJACK
+
+
+
+
+
+
diff --git a/10 Blackjack/javascript/blackjack.js b/10 Blackjack/javascript/blackjack.js
new file mode 100644
index 00000000..16f5a343
--- /dev/null
+++ b/10 Blackjack/javascript/blackjack.js
@@ -0,0 +1,549 @@
+// BLACKJACK
+//
+// 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 da = [];
+
+var pa = [];
+var qa = [];
+var ca = [];
+var ta = [];
+var sa = [];
+var ba = [];
+var za = [];
+var ra = [];
+
+var ds = "N A 2 3 4 5 6 7N 8 9 10 J Q K";
+var is = "H,S,D,/,"
+
+var q;
+var aa;
+var ab;
+var ac;
+var h;
+var h1;
+
+function af(q) {
+ return q >= 22 ? q - 11 : q;
+}
+
+function reshuffle()
+{
+ print("RESHUFFLING\n");
+ for (; d >= 1; d--)
+ ca[--c] = da[d];
+ for (c1 = 52; c1 >= c; c1--) {
+ c2 = Math.floor(Math.random() * (c1 - c + 1)) + c;
+ c3 = ca[c2];
+ ca[c2] = ca[c1];
+ ca[c1] = c3;
+ }
+}
+
+// Subroutine to get a card.
+function get_card()
+{
+ if (c >= 51)
+ reshuffle();
+ return ca[c++];
+}
+
+// Card printing subroutine
+function card_print(x)
+{
+ print(ds.substr(3 * x - 3, 3) + " ");
+}
+
+// Alternate card printing subroutine
+function alt_card_print(x)
+{
+ print(" " + ds.substr(3 * x - 2, 2) + " ");
+}
+
+// Subroutine to add card 'which' to total 'q'
+function add_card(which)
+{
+ x1 = which;
+ if (x1 > 10)
+ x1 = 10;
+ q1 = q + x1;
+ if (q < 11) {
+ if (which <= 1) {
+ q += 11;
+ return;
+ }
+ if (q1 >= 11)
+ q = q1 + 11;
+ else
+ q = q1;
+ return;
+ }
+ if (q <= 21 && q1 > 21)
+ q = q1 + 1;
+ else
+ q = q1;
+ if (q >= 33)
+ q = -1;
+}
+
+// Subroutine to evaluate hand 'which'. Total is put into
+// qa[which]. Totals have the following meaning:
+// 2-10...hard 2-10
+// 11-21...soft 11-21
+// 22-32...hard 11-21
+// 33+....busted
+function evaluate_hand(which)
+{
+ q = 0;
+ for (q2 = 1; q2 <= ra[which]; q2++) {
+ add_card(pa[i][q2]);
+ }
+ qa[which] = q;
+}
+
+// Subroutine to add a card to row i
+function add_card_to_row(i, x) {
+ ra[i]++;
+ pa[i][ra[i]] = x;
+ q = qa[i];
+ add_card(x);
+ qa[i] = q;
+ if (q < 0) {
+ print("...BUSTED\n");
+ discard_row(i);
+ }
+}
+
+// Subroutine to discard row i
+function discard_row(i) {
+ while (ra[i]) {
+ d++;
+ da[d] = pa[i][ra[i]];
+ ra[i]--;
+ }
+}
+
+// Prints total of hand i
+function print_total(i) {
+ print("\n");
+ aa = qa[i];
+ total_aa();
+ print("TOTAL IS " + aa + "\n");
+}
+
+function total_aa()
+{
+ if (aa >= 22)
+ aa -= 11;
+}
+
+function total_ab()
+{
+ if (ab >= 22)
+ ab -= 11;
+}
+
+function total_ac()
+{
+ if (ac >= 22)
+ ac -= 11;
+}
+
+function process_input(str)
+{
+ str = str.substr(0, 1);
+ for (h = 1; h <= h1; h += 2) {
+ if (str == is.substr(h - 1, 1))
+ break;
+ }
+ if (h <= h1) {
+ h = (h + 1) / 2;
+ return 0;
+ }
+ print("TYPE " + is.substr(0, h1 - 1) + " OR " + is.substr(h1 - 1, 2) + " PLEASE");
+ return 1;
+}
+
+// Main program
+async function main()
+{
+ print(tab(31) + "BLACK JACK\n");
+ print(tab(15) + "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY\n");
+ print("\n");
+ print("\n");
+ print("\n");
+ // --pa[i][j] IS THE JTH CARD IN HAND I, qa[i] IS TOTAL OF HAND I
+ // --C IS THE DECK BEING DEALT FROM, D IS THE DISCARD PILE,
+ // --ta[i] IS THE TOTAL FOR PLAYER I, sa[i] IS THE TOTAL THIS HAND FOR
+ // --PLAYER I, ba[i] IS TH BET FOR HAND I
+ // --ra[i] IS THE LENGTH OF pa[I,*]
+
+ // --Program starts here
+ // --Initialize
+ for (i = 1; i <= 15; i++)
+ pa[i] = [];
+ for (i = 1; i <= 13; i++)
+ for (j = 4 * i - 3; j <= 4 * i; j++)
+ da[j] = i;
+ d = 52;
+ c = 53;
+ print("DO YOU WANT INSTRUCTIONS");
+ str = await input();
+ if (str.toUpperCase().substr(0, 1) != "N") {
+ print("THIS IS THE GAME OF 21. AS MANY AS 7 PLAYERS MAY PLAY THE\n");
+ print("GAME. ON EACH DEAL, BETS WILL BE ASKED FOR, AND THE\n");
+ print("PLAYERS' BETS SHOULD BE TYPED IN. THE CARDS WILL THEN BE\n");
+ print("DEALT, AND EACH PLAYER IN TURN PLAYS HIS HAND. THE\n");
+ print("FIRST RESPONSE SHOULD BE EITHER 'D', INDICATING THAT THE\n");
+ print("PLAYER IS DOUBLING DOWN, 'S', INDICATING THAT HE IS\n");
+ print("STANDING, 'H', INDICATING HE WANTS ANOTHER CARD, OR '/',\n");
+ print("INDICATING THAT HE WANTS TO SPLIT HIS CARDS. AFTER THE\n");
+ print("INITIAL RESPONSE, ALL FURTHER RESPONSES SHOULD BE 'S' OR\n");
+ print("'H', UNLESS THE CARDS WERE SPLIT, IN WHICH CASE DOUBLING\n");
+ print("DOWN IS AGAIN PERMITTED. IN ORDER TO COLLECT FOR\n");
+ print("BLACKJACK, THE INITIAL RESPONSE SHOULD BE 'S'.\n");
+ }
+ while (1) {
+ print("NUMBER OF PLAYERS");
+ n = parseInt(await input());
+ print("\n");
+ if (n < 1 || n > 7)
+ continue;
+ else
+ break;
+ }
+ for (i = 1; i <= 8; i++)
+ ta[i] = 0;
+ d1 = n + 1;
+ while (1) {
+ if (2 * d1 + c >= 52) {
+ reshuffle();
+ }
+ if (c == 2)
+ c--;
+ for (i = 1; i <= n; i++)
+ za[i] = 0;
+ for (i = 1; i <= 15; i++)
+ ba[i] = 0;
+ for (i = 1; i <= 15; i++)
+ qa[i] = 0;
+ for (i = 1; i <= 7; i++)
+ sa[i] = 0;
+ for (i = 1; i <= 15; i++)
+ ra[i] = 0;
+ print("BETS:\n");
+ for (i = 1; i <= n; i++) {
+ do {
+ print("#" + i + " ");
+ za[i] = parseFloat(await input());
+ } while (za[i] <= 0 || za[i] > 500) ;
+ }
+ for (i = 1; i <= n; i++)
+ ba[i] = za[i];
+ print("PLAYER");
+ for (i = 1; i <= n; i++) {
+ print(" " + i + " ");
+ }
+ print("DEALER\n");
+ for (j = 1; j <= 2; j++) {
+ print(tab(5));
+ for (i = 1; i <= d1; i++) {
+ pa[i][j] = get_card();
+ if (j == 1 || i <= n)
+ alt_card_print(pa[i][j]);
+ }
+ print("\n");
+ }
+ for (i = 1; i <= d1; i++)
+ ra[i] = 2;
+ // --Test for insurance
+ if (pa[d1][1] <= 1) {
+ print("ANY INSURANCE");
+ str = await input();
+ if (str.substr(0, 1) == "Y") {
+ print("INSURANCE BETS\n");
+ for (i = 1; i <= n; i++) {
+ do {
+ print("#" + i + " ");
+ za[i] = parseFloat(await input());
+ } while (za[i] < 0 || za[i] > ba[i] / 2) ;
+ }
+ for (i = 1; i <= n; i++)
+ sa[i] = za[i] * ((pa[d1][2] >= 10 ? 3 : 0) - 1);
+ }
+ }
+ // --Test for dealer blackjack
+ l1 = 1;
+ l2 = 1;
+ if (pa[d1][1] == 1 && pa[d1][2] > 9) {
+ l1 = 0;
+ l2 = 0;
+ }
+ if (pa[d1][2] == 1 && pa[d1][1] > 9) {
+ l1 = 0;
+ l2 = 0;
+ }
+ if (l1 == 0 && l2 == 0) {
+ print("\n");
+ print("DEALER HAS A" + ds.substr(3 * pa[d1][2] - 3, 3) + " IN THE HOLE FOR BLACKJACK\n");
+ for (i = 1; i <= d1; i++)
+ evaluate_hand(i);
+ } else {
+ // --No dealer blackjack
+ if (pa[d1][1] <= 1 || pa[d1][1] >= 10) {
+ print("\n");
+ print("NO DEALER BLACKJACK.\n");
+ }
+ // --Now play the hands
+ for (i = 1; i <= n; i++) {
+ print("PLAYER " + i + " ");
+ h1 = 7;
+ do {
+ str = await input();
+ } while (process_input(str)) ;
+ if (h == 1) { // Player wants to be hit
+ evaluate_hand(i);
+ h1 = 3;
+ x = get_card();
+ print("RECEIVED A");
+ card_print(x);
+ add_card_to_row(i, x);
+ if (q > 0)
+ print_total(i);
+ } else if (h == 2) { // Player wants to stand
+ evaluate_hand(i);
+ if (qa[i] == 21) {
+ print("BLACKJACK\n");
+ sa[i] = sa[i] + 1.5 * ba[i];
+ ba[i] = 0;
+ discard_row(i);
+ } else {
+ print_total(i);
+ }
+ } else if (h == 3) { // Player wants to double down
+ evaluate_hand(i);
+ h1 = 3;
+ h = 1;
+ while (1) {
+ if (h == 1) { // Hit
+ x = get_card();
+ print("RECEIVED A");
+ card_print(x);
+ add_card_to_row(i, x);
+ if (q < 0)
+ break;
+ print("HIT");
+ } else if (h == 2) { // Stand
+ print_total(i);
+ break;
+ }
+ do {
+ str = await input();
+ } while (process_input(str)) ;
+ h1 = 3;
+ }
+ } else if (h == 4) { // Player wants to split
+ l1 = pa[i][1];
+ if (l1 > 10)
+ l1 = 10;
+ l2 = pa[i][2];
+ if (l2 > 10)
+ l2 = 10;
+ if (l1 != l2) {
+ print("SPLITTING NOT ALLOWED.\n");
+ i--;
+ continue;
+ }
+ // --Play out split
+ i1 = i + d1;
+ ra[i1] = 2;
+ pa[i1][1] = pa[i1][2];
+ ba[i + d1] = ba[i];
+ x = get_card();
+ print("FIRST HAND RECEIVES A");
+ card_print(x);
+ pa[i][2] = x;
+ evaluate_hand(i);
+ print("\n");
+ x = get_card();
+ print("SECOND HAND RECEIVES A");
+ i = i1;
+ card_print(x);
+ pa[i][2] = x;
+ evaluate_hand(i);
+ print("\n");
+ i = i1 - d1;
+ if (pa[i][1] != 1) {
+ // --Now play the two hands
+ do {
+
+ print("HAND " + (i > d1 ? 2 : 1) + " ");
+ h1 = 5;
+ while (1) {
+ do {
+ str = await input();
+ } while (process_input(str)) ;
+ h1 = 3;
+ if (h == 1) { // Hit
+ x = get_card();
+ print("RECEIVED A");
+ card_print(x);
+ add_card_to_row(i, x);
+ if (q < 0)
+ break;
+ print("HIT");
+ } else if (h == 2) { // Stand
+ print_total(i);
+ break;
+ } else { // Double
+ x = get_card();
+ ba[i] *= 2;
+ print("RECEIVED A");
+ card_print(x);
+ add_card_to_row(i, x);
+ if (q > 0)
+ print_total(i);
+ break;
+ }
+ }
+ i += d1;
+ } while (i == i1) ;
+ i = i1 - d1;
+ }
+ }
+ }
+ // --Test for playing dealer's hand
+ evaluate_hand(i);
+ for (i = 1; i <= n; i++) {
+ if (ra[i] > 0 || ra[i + d1] > 0)
+ break;
+ }
+ if (i > n) {
+ print("DEALER HAD A");
+ x = pa[d1][2];
+ card_print(x);
+ print(" CONCEALED.\n");
+ } else {
+ print("DEALER HAS A" + ds.substr(3 * pa[d1][2] - 3, 3) + " CONCEALED ");
+ i = d1;
+ aa = qa[i];
+ total_aa();
+ print("FOR A TOTAL OF " + aa + "\n");
+ if (aa <= 16) {
+ print("DRAWS");
+ do {
+
+ x = get_card();
+ alt_card_print(x);
+ add_card_to_row(i, x);
+ aa = q;
+ total_aa();
+ } while (q > 0 && aa < 17) ;
+ if (q < 0) {
+ qa[i] = q + 0.5;
+ } else {
+ qa[i] = q;
+ }
+ if (q >= 0) {
+ aa = q;
+ total_aa();
+ print("---TOTAL IS " + aa + "\n");
+ }
+ }
+ print("\n");
+ }
+ }
+ // --TALLY THE RESULT
+ str = "LOSES PUSHES WINS "
+ print("\n");
+ for (i = 1; i <= n; i++) {
+ aa = qa[i]
+ total_aa();
+ ab = qa[i + d1];
+ total_ab();
+ ac = qa[d1];
+ total_ac();
+ signaaac = aa - ac;
+ if (signaaac) {
+ if (signaaac < 0)
+ signaaac = -1;
+ else
+ signaaac = 1;
+ }
+ signabac = ab - ac;
+ if (signabac) {
+ if (signabac < 0)
+ signabac = -1;
+ else
+ signabac = 1;
+ }
+ sa[i] = sa[i] + ba[i] * signaaac + ba[i + d1] * signabac;
+ ba[i + d1] = 0;
+ print("PLAYER " + i + " ");
+ signsai = sa[i];
+ if (signsai) {
+ if (signsai < 0)
+ signsai = -1;
+ else
+ signsai = 1;
+ }
+ print(str.substr(signsai * 6 + 6, 6) + " ");
+ if (sa[i] == 0)
+ print(" ");
+ else
+ print(" " + Math.abs(sa[i]) + " ");
+ ta[i] = ta[i] + sa[i];
+ print("TOTAL= " + ta[i] + "\n");
+ discard_row(i);
+ ta[d1] = ta[d1] - sa[i];
+ i += d1;
+ discard_row(i);
+ i -= d1;
+ }
+ print("DEALER'S TOTAL= " + ta[d1] + "\n");
+ print("\n");
+ discard_row(i);
+ }
+}
+
+main();