前提・実現したいこと
ドットインストールのスロットマシンを作ろうのレッスンを参考にしました。
そこからアレンジして、揃った絵柄ごとに取得できるコイン枚数をswitch文で分岐させたいと思っています。
getCash関数を定義して、引数にpanels[0]を渡しています。
そしてswitch文で、panels[0]の画像とimagesの配列にある画像を比較して、一致した画像に応じてコイン枚数を変えようと思っています。
発生している問題・エラーメッセージ
上記の考えで行うと、以下のようなエラーメッセージが出ます。 main.js:74 Uncaught ReferenceError: images is not defined at getCash (main.js:74) at checkResult (main.js:124) at keydownStop (main.js:163) at HTMLDocument.<anonymous> (main.js:185) getCash @ main.js:74 checkResult @ main.js:124 keydownStop @ main.js:163 (anonymous) @ main.js:185 スロットの画像自体は表示されているので、images は定義されていると思うのですが、何がいけないのでしょうか。
該当のソースコード
HTML
1<!DOCTYPE html> 2<html lang="ja"> 3 <head> 4 <meta charset="utf-8"> 5 <title>Slot Machine</title> 6 <link rel="stylesheet" href="css/styles.css"> 7 8 </head> 9 <body> 10 <main></main> 11 <div id="spin">SPIN</div> 12 <div id="div"></div> 13 <script src="js/main.js"></script> 14 </body> 15</html>
CSS
1body{ 2 background:#bdc3c7; 3 font-size:16px; 4 font-weight:bold; 5 font-family:Arial,sans-serif; 6} 7 8main{ 9 width:300px; 10 background:#ecf0f1; 11 padding:20px; 12 border:4px solid #fff; 13 border-radius:12px; 14 margin:16px auto; 15 display:flex; 16 justify-content:space-between; 17} 18 19.panel img{ 20 width:90px; 21 height:110px; 22 margin-bottom:4px; 23 24} 25 26.stop{ 27 cursor:pointer; 28 width:90px; 29 height:32px; 30 background:#ef454a; 31 box-shadow:0 4px 0 #d1483d; 32 border-radius:16px; 33 line-height:32px; 34 text-align:center; 35 font-size:14px; 36 color:#fff; 37 user-select:none; 38 39} 40 41#spin{ 42 cursor:pointer; 43 width:280px; 44 height:36px; 45 background:#3498db; 46 box-shadow:0 4px 0 #2880b9; 47 border-radius:18px; 48 line-height:36px; 49 text-align:center; 50 color:#fff; 51 user-select:none; 52 margin:0 auto; 53 54} 55 56.unmatched{ 57 opacity:0.5; 58} 59 60.inactive{ 61 opacity:0.5; 62} 63 64.coins{ 65 width:280px; 66 height:36px; 67 background:#ecf0f1; 68 border-radius: 4px; 69 border:4px solid #fff; 70 margin:20px auto; 71 text-align:center; 72}
javascript
1'use strict'; 2 3{ 4 class Panel{ 5 constructor(){ 6 const section = document.createElement('section'); 7 section.classList.add('panel'); 8 9 this.img = document.createElement('img'); 10 this.img.src = this.getRandomImage(); 11 12 this.timeoutId = undefined; 13 14 this.stop = document.createElement('div'); 15 this.stop.textContent = 'STOP'; 16 this.stop.classList.add('stop','inactive'); 17 18 section.appendChild(this.img); 19 section.appendChild(this.stop); 20 21 const main = document.querySelector('main'); 22 main.appendChild(section); 23 24 } 25 26 images = [ 27 '../JS slot.html/bell.jpg', //5 28 '../JS slot.html/banana.jpg',//10 29 '../JS slot.html/cherry.jpg',//30 30 '../JS slot.html/grape.jpg', //50 31 '../JS slot.html/bar.jpg', //100 32 '../JS slot.html/piero.jpg', //300 33 '../JS slot.html/seven.jpg', //500 34 ]; 35 36 37 38 getRandomImage(){ 39 return this.images[Math.floor(Math.random() * this.images.length)]; 40 } 41 42 spin(){ 43 this.img.src = this.getRandomImage(); 44 this.timeoutId = setTimeout(()=>{ 45 this.spin(); 46 },1000); 47 48 } 49 50 51 isUnmatched(p1,p2){ 52 return this.img.src !== p1.img.src && this.img.src !== p2.img.src; 53 } 54 55 isMatched(p1,p2){ 56 return this.img.src == p1.img.src && this.img.src == p2.img.src; 57 } 58 59 unmatch(){ 60 this.img.classList.add('unmatched'); 61 } 62 63 activate(){ 64 this.img.classList.remove('unmatched'); 65 this.stop.classList.remove('inactive'); 66 } 67 68 }; 69 70function getCash(p0){ 71 72 switch(p0){ 73 74 case images[0]: 75 cash += 5; 76 coins.textContent = `コイン枚数:${cash}`; 77 break; 78 79 case images[1]: 80 cash += 10; 81 coins.textContent = `コイン枚数:${cash}`; 82 break; 83 84 case images[2]: 85 cash += 30; 86 coins.textContent = `コイン枚数:${cash}`; 87 break; 88 89 case images[3]: 90 cash += 50; 91 coins.textContent = `コイン枚数:${cash}`; 92 break; 93 94 case images[4]: 95 cash += 100; 96 coins.textContent = `コイン枚数:${cash}`; 97 break; 98 99 case images[5]: 100 cash += 300; 101 coins.textContent = `コイン枚数:${cash}`; 102 break; 103 104 case images[6]: 105 cash += 500; 106 coins.textContent = `コイン枚数:${cash}`; 107 break; 108 109 } 110 }; 111 112 function checkResult(){ 113 114 if(panels[0].isUnmatched(panels[1],panels[2])){ 115 panels[0].unmatch(); 116 } 117 if(panels[1].isUnmatched(panels[0],panels[2])){ 118 panels[1].unmatch(); 119 } 120 if(panels[2].isUnmatched(panels[0],panels[1])){ 121 panels[2].unmatch(); 122 } 123 if(panels[0].isMatched(panels[1],panels[2])){ 124 getCash(panels[0]); 125 } 126 }; 127 128 129 let cash = 10; 130 let coins = document.getElementById('div'); 131 coins.textContent = `コイン枚数:${cash}`; 132 coins.classList.add('coins'); 133 134 function haveCash(){ 135 cash--; 136 coins.textContent = `コイン枚数:${cash}`; 137 }; 138 139 function keydownSpin(){ 140 spin.classList.add('inactive'); 141 panels.forEach(panel => { 142 panel.activate(); 143 panel.spin(); 144 }); 145 }; 146 147 let panelsLeft = 3; 148 149 150 function keydownStop(i){ 151 if(i.stop.classList.contains('inactive')){ 152 return; 153 }; 154 i.stop.classList.add('inactive'); 155 clearTimeout(i.timeoutId); 156 157 panelsLeft --; 158 159 if(panelsLeft === 0){ 160 spin.classList.remove('inactive'); 161 panelsLeft = 3; 162 checkResult(panels[0],panels[1],panels[2]); 163 164 }; 165 }; 166 167 const panels = [ 168 new Panel(), 169 new Panel(), 170 new Panel(), 171 ]; 172 173 const spin = document.getElementById('spin'); 174 175document.addEventListener('keydown',(e)=>{ 176 177 switch(e.keyCode){ 178 179 case 100: 180 keydownStop(panels[0]); 181 break; 182 183 case 101: 184 keydownStop(panels[1]); 185 break; 186 187 case 102: 188 keydownStop(panels[2]); 189 break; 190 191 case 96: 192 if(cash == 0 || spin.classList.contains('inactive')){ 193 return; 194 }else{ 195 keydownSpin(); 196 haveCash(); 197 } 198 break; 199 }; 200 201}); 202 203}; 204
試したこと
1)getCash関数をPanelクラス内で定義したら、今度はgetCashが定義されていないことになった。
Uncaught ReferenceError: getCash is not defined
at checkResult (main.js:166)
at keydownStop (main.js:205)
at HTMLDocument.<anonymous> (main.js:223)
checkResult @ main.js:166
keydownStop @ main.js:205
(anonymous) @ main.js:223
2)imagesをPanelクラス外で、新たに定義した。
エラーメッセージは出ないが、コインを取得できなかった(getCash関数が動いてない?)
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答4件
あなたの回答
tips
プレビュー