JS tool problem(simple AI) - reduced black jack

JS tool problem 2 about Markov decision process.

by Tinytsunami

HTML

<div id="demo">
  <pre></pre>
  <button>Draw</button>
  <button>Pass</button>
</div>

CSS

body {
  color: #ffffff;
  background: #20262e;
  font-family: monospace, sans-serif;
}

#demo input {
  width: 120px;
  color: #ffffff;
  background: #20262e;
  border: none;
  border-bottom: solid 1px #ffffff;
  outline: none;
}

#demo input {
  margin-right: 5px;
}

#demo button {
  cursor: pointer;
  color: #ffffff;
  background: #20262e;
  border: 1px solid #ffffff;
  outline: none;
}

#demo button:hover {
  color: #20262e;
  background: #ffffff;
}

JavaScript

(function() {
  /* HTML DOM */
  let demo = document.getElementById("demo");
  let message = demo.getElementsByTagName("pre")[0];
  let draw = demo.getElementsByTagName("button")[0];
  let pass = demo.getElementsByTagName("button")[1];

  /* constants */
  let ACTOR = {
    PLAYER: 0,
    COMPUTER: 1
  };
  let turn = ACTOR.PLAYER;

  /* variables */
  let player_card = [];
  let computer_card = [];
  let player_pass = false;
  let computer_pass = false;
  let game_endding = false;

  /* AI */
  let ai = function() {
    /* define variables */
    const pass = 0, draw = 1;                         // A
    let U = Array.from({length: 2}, () =>             // utility, s = (c, f)
            Array.from({length: 16}, () => 0));       // |c| = 16, |f| = 2 
    let Ut = Array.from({length: 2}, () =>            // utility temp.
             Array.from({length: 16}, () => 0));      // size same with |U|   
    let D = Array.from({length: 2}, () =>             // decision table
             Array.from({length: 16}, () => 0));      // size same with |U|  
    let epsilon = 0.01;                               // iterative stop para.
    let gamma = 0.9;                                  // discount factor
    let delta;                                        // iterative diff. for step

    /* reward function */
    let R = function(c) {
      return c > 10 ? 0 : c;
    };

    /* expected value of action
       f = 0: can select "pass" only (exp = [pass_value])
       f = 1: can select "draw" or "pass" (exp = [pass_value, draw_value]) */
    let Exp = function(c, f) {
      let exp = [];
      if (f == 0) {                                   // f = 0: pass only
        exp.push(1.0 * R(c));                         // pass: 100%
      } else if (f == 1) {                            // f = 1: pass or draw
        exp.push(1.0 * R(c));                         // pass: 100%
        let t = 0;                                    // draw: now point + 1~5 (20%)
        for (let d =...