見出し画像

【JavaScript】スロットゲームをプログラミングで作成(当たり演出①)

今回は、以前JavaScriptで作成したゲームに当たり演出を追加しました。

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>スロットゲーム</title>
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="stylesheet" media="screen" href="style.css">
  </head>
  <body>
    <div class="slot">
      <div id="slot-frame">
        <ul class="reels">
          <li class="reel" data-val="franky"><img src="img/franky.png"></li>
          <li class="reel" data-val="luffy"><img src="img/luffy.png"></li>  <!-- index 7 -->
          <li class="reel" data-val="nami"><img src="img/nami.png"></li>   <!-- index 6 -->
          <li class="reel" data-val="zoro"><img src="img/zoro.png"></li>   <!-- index 5 -->
          <li class="reel" data-val="usopp"><img src="img/usopp.png"></li>  <!-- index 4 -->
          <li class="reel" data-val="sanji"><img src="img/sanji.png"></li>  <!-- index 3 -->
          <li class="reel" data-val="robin"><img src="img/robin.png"></li>  <!-- index 2 -->
          <li class="reel" data-val="chopper"><img src="img/chopper.png"></li><!-- index 1 -->
          <li class="reel" data-val="franky"><img src="img/franky.png"></li> <!-- index 0 初期値 -->
          <li class="reel" data-val="luffy"><img src="img/luffy.png"></li>
        </ul>
        <ul class="reels">
          <li class="reel" data-val="sanji"><img src="img/sanji.png"></li>
          <li class="reel" data-val="robin"><img src="img/robin.png"></li>
          <li class="reel" data-val="zoro"><img src="img/zoro.png"></li>
          <li class="reel" data-val="luffy"><img src="img/luffy.png"></li>
          <li class="reel" data-val="nami"><img src="img/nami.png"></li>
          <li class="reel" data-val="usopp"><img src="img/usopp.png"></li>
          <li class="reel" data-val="chopper"><img src="img/chopper.png"></li>
          <li class="reel" data-val="franky"><img src="img/franky.png"></li>
          <li class="reel" data-val="sanji"><img src="img/sanji.png"></li> <!-- index 0 初期値 -->
          <li class="reel" data-val="robin"><img src="img/robin.png"></li>
        </ul>
        <ul class="reels">
          <li class="reel" data-val="robin"><img src="img/robin.png"></li>
          <li class="reel" data-val="sanji"><img src="img/sanji.png"></li>
          <li class="reel" data-val="luffy"><img src="img/luffy.png"></li>
          <li class="reel" data-val="usopp"><img src="img/usopp.png"></li>
          <li class="reel" data-val="chopper"><img src="img/chopper.png"></li>
          <li class="reel" data-val="franky"><img src="img/franky.png"></li>
          <li class="reel" data-val="nami"><img src="img/nami.png"></li>
          <li class="reel" data-val="zoro"><img src="img/zoro.png"></li>
          <li class="reel" data-val="robin"><img src="img/robin.png"></li> <!-- index 0 初期値 -->
          <li class="reel" data-val="sanji"><img src="img/sanji.png"></li>
        </ul>
        </div>
      </div>
    </div>
    <div id="hit">
    </div>
    <div>
      <button type="button" class="stop-btn" data-val="0" disabled="true"></button>
      <button type="button" class="stop-btn" data-val="1" disabled="true"></button>
      <button type="button" class="stop-btn" data-val="2" disabled="true"></button>
    </div>
    <div>
      <button type="button" id="start-btn">ゲームスタート</button>
    </div>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="index.js"></script>
  </body>
</html>
body {
    text-align: center;
    padding: 0;
    margin: 0;
    background-color: antiquewhite;
}
ul {
    list-style: none;
}
.slot {
    width: 90%;
    height: 500px;
    overflow: hidden;
    margin: auto;
    margin-top: 10px;
    border: solid 1px #333;
    background-color: aliceblue;
}
#slot-frame {
    height: 500px;
    position: relative;
    overflow: hidden;
    border: solid 1px #333;
}
.reels {
    width: 31%;
    position: absolute;
}
.reels:nth-child(1) {
    left: 0;
}
.reels:nth-child(2) {
    left: 33%;
}
.reels:nth-child(3) {
    right: 0;
}
.reel {
    height: 270px;
}
.reel img {
    display: block;
    margin: auto;
    height: 270px;
}
.stop-btn {
    display: inline-block;
    padding: 35px 35px;
    margin-top: 10px;
    margin: 10px 70px;
    background-color: rgb(237, 23, 23);
    border-bottom: solid 4px #627295;
    border-radius: 60px;
}
.stop-btn:active {
    -webkit-transform: translateY(4px);
    transform: translateY(4px);
    border-bottom: none;
}
#start-btn {
    display: inline-block;
    padding: 20px 40px;
    background-color: rgb(215, 97, 0);
    color: #FFF;
    border-bottom: solid 4px #627295;
    border-radius: 10px;
    font-size: 30px;
}
#start-btn:active {
    -webkit-transform: translateY(4px);
    transform: translateY(4px);
    border-bottom: none;
}
#hit{
    position: absolute;
    top: 90px;
    width: 100%;
    background-color: rgba(237, 233, 137, 0.7);
}
#hit_message{
    position: absolute;
    top: 100px;
    font-size: 80px;
    color: red;
    font-weight: bold;
}body {
    text-align: center;
    padding: 0;
    margin: 0;
    background-color: antiquewhite;
}
ul {
    list-style: none;
}
.slot {
    width: 90%;
    height: 500px;
    overflow: hidden;
    margin: auto;
    margin-top: 10px;
    border: solid 1px #333;
    background-color: aliceblue;
}
#slot-frame {
    height: 500px;
    position: relative;
    overflow: hidden;
    border: solid 1px #333;
}
.reels {
    width: 31%;
    position: absolute;
}
.reels:nth-child(1) {
    left: 0;
}
.reels:nth-child(2) {
    left: 33%;
}
.reels:nth-child(3) {
    right: 0;
}
.reel {
    height: 270px;
}
.reel img {
    display: block;
    margin: auto;
    height: 270px;
}
.stop-btn {
    display: inline-block;
    padding: 35px 35px;
    margin-top: 10px;
    margin: 10px 70px;
    background-color: rgb(237, 23, 23);
    border-bottom: solid 4px #627295;
    border-radius: 60px;
}
.stop-btn:active {
    -webkit-transform: translateY(4px);
    transform: translateY(4px);
    border-bottom: none;
}
#start-btn {
    display: inline-block;
    padding: 20px 40px;
    background-color: rgb(215, 97, 0);
    color: #FFF;
    border-bottom: solid 4px #627295;
    border-radius: 10px;
    font-size: 30px;
}
#start-btn:active {
    -webkit-transform: translateY(4px);
    transform: translateY(4px);
    border-bottom: none;
}
#hit{
    position: absolute;
    top: 90px;
    width: 100%;
    background-color: rgba(237, 233, 137, 0.7);
}
#hit_message{
    position: absolute;
    top: 100px;
    font-size: 80px;
    color: red;
    font-weight: bold;
}
let sec = 500;          //スロットのリール回転速度(実行毎秒数)
let stopReelFlag = [];  //スロットのリール停止フラグ
let reelCounts = [];    //どの画像をどの位置にさせるか
let slotFrameHeight;    //フレームの大きさ
let slotReelsHeight;    //リール(画像)全体の大きさ
let slotReelItemHeight; //リール(画像)1個の大きさ
let slotReelStartHeight;//画像の初期値
let slot_pattern = [];
let hit_img;
let hit = document.getElementById("hit");
let slot_frame = document.getElementById("slot-frame"); 
let reel = document.getElementsByClassName("reel");
let reels = document.getElementsByClassName("reels");
let start_btn = document.getElementById("start-btn");
let stop_btn = document.getElementsByClassName("stop-btn");
let Slot = {
  init: function() {
    stopReelFlag[0] = stopReelFlag[1] = stopReelFlag[2] = false;
    reelCounts[0] = reelCounts[1] = reelCounts[2] = 0;
  },
  start: function () {
    Slot.init();
    for (let index = 0; index < 3; index++) {
      Slot.animation(index);
    }
  },
  stop: function (i) {
    stopReelFlag[i] = true;
    if (stopReelFlag[0] && !stopReelFlag[1] && !stopReelFlag[2]){
      slot_pattern.push(reels[0].children[8 - reelCounts[0]].getAttribute('data-val'));
    } else if (stopReelFlag[0] && stopReelFlag[1] && !stopReelFlag[2]) {
      slot_pattern.push(reels[1].children[8 - reelCounts[1]].getAttribute('data-val'));
    } else if (stopReelFlag[0] && stopReelFlag[1] && stopReelFlag[2]) {
      slot_pattern.push(reels[2].children[8 - reelCounts[2]].getAttribute('data-val'));
    }
    if (stopReelFlag[0] && stopReelFlag[1] && stopReelFlag[2]) {
      start_btn.removeAttribute("disabled");
      if(slot_pattern.every(value => value === slot_pattern[0])){
        hit_img = slot_pattern[0];
        Slot.hit();
      };
      slot_pattern = [];
    }
  },
  hit: function(){
    let hit_message;
    if (hit_img == "chopper"){
      hit_message = "タ、タヌキじゃねーよっ";
    } 
    hit_img = document.querySelectorAll(`[data-val="${hit_img}"]`);
    hit_img = hit_img[1].innerHTML;
    setTimeout(()=>{
      hit.innerHTML = hit_img;
      hit.innerHTML += `<span id='hit_message'>${hit_message}</span>`;
    }, 1000);
    setTimeout(() => {
      hit.innerHTML = "";
    }, 5000);
  },
  resetLocationInfo: function () {
    slotFrameHeight = slot_frame.offsetHeight;
    slotReelsHeight = reels[0].offsetHeight;
    slotReelItemHeight = reel[0].offsetHeight;
    slotReelStartHeight = -slotReelsHeight;
    slotReelStartHeight = slotReelStartHeight + slotFrameHeight
                             - (slotFrameHeight / 2) + slotReelItemHeight * 3 / 2;
    for (let i = 0; i < reels.length; i++){
      reels[i].style.top = String(slotReelStartHeight) + "px";
    }
  },
  animation: function (index) {
    if (reelCounts[index] >= 8) {
      reelCounts[index] = 0;
    }
    $('.reels').eq(index).animate({
      'top': slotReelStartHeight + (reelCounts[index] * slotReelItemHeight)
    }, {
      duration: sec,
      easing: 'linear',
      complete: function () {
        if (stopReelFlag[index]) {
          return;
        }
        reelCounts[index]++;
        Slot.animation(index);
      }
    });
  },
};
window.onload = function () {
  Slot.init();
  Slot.resetLocationInfo();
  start_btn.addEventListener("click", function(e){
    e.target.setAttribute("disabled", true)
    Slot.start();
    for(let i = 0; i < stop_btn.length; i++){
      stop_btn[i].removeAttribute("disabled");
    }
  });
  for(let i = 0; i < stop_btn.length ; i++ ){
    stop_btn[i].addEventListener("click", function (e) {
      Slot.stop(e.target.getAttribute('data-val'));
    })
  }
};

この記事が気に入ったらサポートをしてみませんか?