⇒ 動作確認はこちら
JavaScriptでカードゲーム スピードをつくる。前回はHTML部分とカード関連のクラスを作成しましたが、今回はメインの部分を作成します。
Contents
グローバル変数
まずグローバル変数を定義します。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51  | 
						// カードの幅と高さ const CardWidth = 70; const CardHeight = 100; // コンピュータが次のカードを出すまでの時間(ms) let interval = 0; // 各プレイヤーの山札を表示するための要素 let elementCardsDeckPlayer1 = null; let elementCardsDeckPlayer2 = null; // 各プレイヤーの場のカードを表示するための要素 let elementsCardsPutIntoPlay1 = []; let elementsCardsPutIntoPlay2 = []; // 各プレイヤーの台札を表示するための要素 let elementCardsLedgerPlayer1 = null; let elementCardsLedgerPlayer2 = null; // ゲームの状態を文字で表示するための要素 let elementGameInfoText = null; let elementCardsInfoText = null; // スタートボタン let elementGameStart = null; // 各プレイヤーがもつすべてのカードとなるCardオブジェクトの配列 let allCards1 = []; let allCards2 = []; // 各プレイヤーの山札となるCardオブジェクトの配列 let cardsDeckPlayer1 = []; let cardsDeckPlayer2 = []; // 各プレイヤーが場に出したカードとなるCardオブジェクト(最大4)の配列 let cardsPutIntoPlay1 = [null,null,null,null]; let cardsPutIntoPlay2 = [null,null,null,null]; // 各プレイヤーの台札となるCardオブジェクトの配列 let cardsLedgerPlayer1 = []; let cardsLedgerPlayer2 = []; // ゲームは終了したか? let isGameSet = true; // 移動中のカード let movingCards = []; // タイマーのイベントを処理するか無視するか? let isIgnoreTimer1 = true; let timerId;  | 
					
初期化の処理
ページが読み込まれたら初期化の処理をおこないます。各要素を取得してグローバル変数に格納します。そのあとカードを生成してallCards1とallCards2に格納します。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66  | 
						function Init(){     elementCardsDeckPlayer1 = document.getElementById('cardsDeckPlayer1');     elementCardsDeckPlayer1.style.marginLeft = '430px';     elementCardsDeckPlayer1.style.marginTop = '250px';     elementCardsDeckPlayer2 = document.getElementById('cardsDeckPlayer2');     elementCardsDeckPlayer2.style.marginLeft = '70px';     elementCardsDeckPlayer2.style.marginTop = '10px';     let element;     element = document.getElementById('cardsPutIntoPlay1-0');     element.style.marginLeft = '70px';     element.style.marginTop = '250px';     elementsCardsPutIntoPlay1.push(element);     element = document.getElementById('cardsPutIntoPlay1-1');     element.style.marginLeft = '160px';     element.style.marginTop = '250px';     elementsCardsPutIntoPlay1.push(element);     element = document.getElementById('cardsPutIntoPlay1-2');     element.style.marginLeft = '250px';     element.style.marginTop = '250px';     elementsCardsPutIntoPlay1.push(element);     element = document.getElementById('cardsPutIntoPlay1-3');     element.style.marginLeft = '340px';     element.style.marginTop = '250px';     elementsCardsPutIntoPlay1.push(element);     element = document.getElementById('cardsPutIntoPlay2-0');     element.style.marginLeft = '160px';     element.style.marginTop = '10px';     elementsCardsPutIntoPlay2.push(element);     element = document.getElementById('cardsPutIntoPlay2-1');     element.style.marginLeft = '250px';     element.style.marginTop = '10px';     elementsCardsPutIntoPlay2.push(element);     element = document.getElementById('cardsPutIntoPlay2-2');     element.style.marginLeft = '340px';     element.style.marginTop = '10px';     elementsCardsPutIntoPlay2.push(element);     element = document.getElementById('cardsPutIntoPlay2-3');     element.style.marginLeft = '430px';     element.style.marginTop = '10px';     elementsCardsPutIntoPlay2.push(element);     elementCardsLedgerPlayer1 = document.getElementById("cardsLedgerPlayer1");     elementCardsLedgerPlayer1.style.marginLeft = '300px';     elementCardsLedgerPlayer1.style.marginTop = '130px';     elementCardsLedgerPlayer2 = document.getElementById("cardsLedgerPlayer2");     elementCardsLedgerPlayer2.style.marginLeft = '200px';     elementCardsLedgerPlayer2.style.marginTop = '130px';     elementGameInfoText = document.getElementById('game-info');     elementCardsInfoText = document.getElementById('cards-info');     elementGameInfoText.style.display = 'none'     elementCardsInfoText.style.display = 'none'     elementGameStart = document.getElementById('button-start'); }  | 
					
カードを初期化する処理を示します。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13  | 
						function InitCards(){     allCards1 = [];     allCards2 = [];     for(let number=1; number<=13; number++)         allCards1.push(new Card(Suit.Spade, number, CardWidth, CardHeight));     for(let number=1; number<=13; number++)         allCards1.push(new Card(Suit.Club, number, CardWidth, CardHeight));     for(let number=1; number<=13; number++)         allCards2.push(new Card(Suit.Heart, number, CardWidth, CardHeight));     for(let number=1; number<=13; number++)         allCards2.push(new Card(Suit.Diamond, number, CardWidth, CardHeight)); }  | 
					
タイマーの設定
タイマーは二つ用意します。一定の間隔でコンピュータがカードを出すためのタイマーとカードがテーブルの上を移動する処理をおこなうためのタイマーです。
SetInterval関数はタイマーの間隔を再設定します。ゲームセットになっていない状態でタイマーに反応する状態であればコンピュータがカードを出す処理をおこないます。
| 
					 1 2 3 4 5 6 7 8 9 10  | 
						let timerId; function SetInterval(interval){     // いったんタイマーを止めてsetInterval関数を実行しなおす     clearInterval(timerId);     timerId = setInterval(()=>{         if(!isIgnoreTimer1 && !isGameSet){             PutCompCard();         }     }, interval); }  | 
					
カードを移動させる処理をするためにタイマーを設定します。このタイマーは止めずにそのまま使います。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14  | 
						setInterval(()=>{     // 移動中のカードがあるなら移動処理をおこない表示させる     movingCards.forEach(card => {         card.Move();     });     ShowCard();     // 移動を終了したカードは配列の中から取り除く     if(!isGameSet){         movingCards = movingCards.filter(card => {             return !card.Dead;         });     } }, 50);  | 
					
ゲーム開始の処理
ゲームスタートボタンがクリックされたらカードをシャッフルして配りゲームを開始します。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47  | 
						function GameStart() {     // コンピュータがカードを出すまでの時間の設定を取得する     let str = document.getElementById("speed").value;     interval = Number(str);     SetInterval(interval);     // ゲームを開始するということは「ゲームは終了していない状態」に以降する     isGameSet = false;     elementGameInfoText.innerHTML = '';     // 前のゲームのデータをクリアする     cardsDeckPlayer1 = [];     cardsDeckPlayer2 = [];     // 「場」にカードは存在しない状態に(「場」にはカードが4枚存在する Length == 4)     for (let i = 0; i < cardsPutIntoPlay1.length; i++)         cardsPutIntoPlay1[i] = null;     for(let i = 0; i < cardsPutIntoPlay2.length; i++)         cardsPutIntoPlay2[i] = null;     // 「台札」にカードは存在しない状態に     cardsLedgerPlayer1 = [];     cardsLedgerPlayer2 = [];     // カードを生成してシャッフルする     ShuffleCards();     // 各プレイヤーの「場」にカードをセットする     // 山札から4枚カードを移動(したがって山札からカードが4枚取り除かれる)     for (let i = 0; i < cardsPutIntoPlay1.length; i++)         cardsPutIntoPlay1[i] = cardsDeckPlayer1[i];     cardsDeckPlayer1.splice(0, 4);     for (let i = 0; i < cardsPutIntoPlay2.length; i++)         cardsPutIntoPlay2[i] = cardsDeckPlayer2[i];     cardsDeckPlayer2.splice(0, 4);     isIgnoreTimer1 = false;     ShowCard();     ShowSpeedTextIfNeed();     elementGameInfoText.style.display = 'block';     elementCardsInfoText.style.display = 'block';     SetCardsCountText(); }  | 
					
カードをシャッフルする処理
カードをシャッフルする処理をおこないます。
| 
					 1 2 3 4 5 6 7 8 9 10  | 
						function ShuffleCards(){     for(let i=0; i<allCards1.length; i++){         let r = Math.floor(Math.random() * cardsDeckPlayer1.length);         cardsDeckPlayer1.splice(r, 0, allCards1[i]);     }     for(let i=0; i<allCards2.length; i++){         let r = Math.floor(Math.random() * cardsDeckPlayer2.length);         cardsDeckPlayer2.splice(r, 0, allCards2[i]);     } }  | 
					
ゲーム中の処理
カードを表示させる処理を示します。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123  | 
						function ShowCard(){     // 山札があるなら裏向きで表示させる。ないならなにも表示させない。     if(cardsDeckPlayer1.length > 0){         let img = cardsDeckPlayer1[0].GetBackImageTagText();         elementCardsDeckPlayer1.innerHTML = img;     }     else         elementCardsDeckPlayer1.innerHTML = '';     if(cardsDeckPlayer2.length > 0){         let img = cardsDeckPlayer2[0].GetBackImageTagText();         elementCardsDeckPlayer2.innerHTML = img;     }     else         elementCardsDeckPlayer2.innerHTML = '';     // 場にカードがあるなら表示させる。存在しない部分にはなにも表示させない。     for(let i=0; i<cardsPutIntoPlay1.length; i++) {         if(cardsPutIntoPlay1[i] != null)             elementsCardsPutIntoPlay1[i].innerHTML = cardsPutIntoPlay1[i].GetImageTagText();         else             elementsCardsPutIntoPlay1[i].innerHTML = '';     }     for(let i=0; i<cardsPutIntoPlay2.length; i++) {         if(cardsPutIntoPlay2[i] != null)             elementsCardsPutIntoPlay2[i].innerHTML = cardsPutIntoPlay2[i].GetImageTagText();         else             elementsCardsPutIntoPlay2[i].innerHTML = '';     }     // 台札があるなら表示させる。存在しない部分にはなにも表示させない。     // また出されたカードは場から台札が表示される位置に向けて移動するが、     // 台札が表示される位置に到達していない場合はそれよりも前に出されているカードを表示する     if(cardsLedgerPlayer1.length > 0){         let ret = false;         let topCard = GetLedgerCardsTop1();         // もしもmovingCardsのなかに台札のカードが存在するならカードは台札が表示される位置に到達していない         for(let i=0; i<movingCards.length; i++){             if(movingCards[i].Number == topCard.Number && movingCards[i].Suit == topCard.Suit){                 ret = true;                 break;             }         }         // 最後に出されたカードが台札が表示される位置に到達しているならそのまま表示させる         // そうでないならひとつ前に出されたカードを表示させる         if(!ret)             elementCardsLedgerPlayer1.innerHTML = topCard.GetImageTagText();         else{             if(GetLedgerCardsSecondTop1() != null)                 elementCardsLedgerPlayer1.innerHTML = GetLedgerCardsSecondTop1().GetImageTagText();             else                 elementCardsLedgerPlayer1.innerHTML = '';         }     }     else         elementCardsLedgerPlayer1.innerHTML = '';     if(cardsLedgerPlayer2.length > 0){         let ret = false;         let topCard = GetLedgerCardsTop2();         for(let i=0; i<movingCards.length; i++){             if(movingCards[i].Number == topCard.Number && movingCards[i].Suit == topCard.Suit){                 ret = true                 break;             }         }         if(!ret)             elementCardsLedgerPlayer2.innerHTML = topCard.GetImageTagText();         else{             if(GetLedgerCardsSecondTop2() != null)                 elementCardsLedgerPlayer2.innerHTML = GetLedgerCardsSecondTop2().GetImageTagText();             else                 elementCardsLedgerPlayer2.innerHTML = '';         }     }     else         elementCardsLedgerPlayer2.innerHTML = '';     // この関数はカードが出されたときに実行される     // そのためこの処理がおこなわれた段階で勝負がついているかもしれない     // ゲームの決着がついたかどうかのチェックをする     // CheckGameSet関数は引き分けであれば0,プレイヤー勝利のときは1、コンピュータ勝利のときは2を返す     // 戻り値が-1なら決着はしていない     // ゲームの決着がついたら効果音を鳴らす。     // この関数が前回実行されたときゲーム継続中であったときだけ鳴らすようにして     // 関数が実行されるたびに連続して鳴らないようにする     let isGameSetBack = isGameSet;     let ret = CheckGameSet();     // ゲームの決着がついている場合はその結果を表示する     if(ret >= 0)         elementGameInfoText.style.backgroundColor = '#000000';     SetCardsCountText();     if(ret == 0){         elementGameInfoText.innerHTML = ' 引き分け       ';         if(!isGameSetBack){             let music = new Audio('./win.mp3');             music.play();         }     }     else if(ret == 1){         elementGameInfoText.innerHTML = ' あなたの勝ちです   ';         if(!isGameSetBack){             let music = new Audio('./win.mp3');             music.play();         }     }     else if(ret == 2){         elementGameInfoText.innerHTML = ' あなたの負けです   ';         if(!isGameSetBack){             let music = new Audio('./lose.mp3');             music.play();         }     }     else {         ShowSpeedTextIfNeed();     } }  | 
					
台札のオブジェクトを取得する
GetLedgerCardsTop1関数、GetLedgerCardsSecondTop1関数、GetLedgerCardsTop2関数、GetLedgerCardsSecondTop2関数、これらの関数は各プレイヤーの台札の一番上または二番目のCardオブジェクトを返します。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35  | 
						function GetLedgerCardsTop1(){     if(cardsLedgerPlayer1.length > 0){         let index = cardsLedgerPlayer1.length - 1;         return cardsLedgerPlayer1[index];     }     else         return null; } function GetLedgerCardsSecondTop1(){     if(cardsLedgerPlayer1.length > 1){         let index = cardsLedgerPlayer1.length - 2;         return cardsLedgerPlayer1[index];     }     else         return null; } function GetLedgerCardsTop2(){     if(cardsLedgerPlayer2.length > 0){         let index = cardsLedgerPlayer2.length - 1;         return cardsLedgerPlayer2[index];     }     else         return null; } function GetLedgerCardsSecondTop2(){     if(cardsLedgerPlayer2.length > 1){         let index = cardsLedgerPlayer2.length - 2;         return cardsLedgerPlayer2[index];     }     else         return null; }  | 
					
ゲームの決着がついているか?
CheckGameSet関数はゲームの決着がついているかを調べます。CheckWin関数は引数がtrueならプレイヤー、falseであればコンピュータが勝利したかを調べます。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  | 
						function CheckGameSet(){     if(CheckWin(true) && CheckWin(false)){         isGameSet = true;         return 0;     }     else if(CheckWin(true)){         isGameSet = true;         return 1;     }     else if(CheckWin(false)){         isGameSet = true;         return 2;     }     return -1; }  | 
					
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18  | 
						function CheckWin(isPlayer1){     let cardsDeckPlayer = cardsDeckPlayer1;     if(!isPlayer1)         cardsDeckPlayer = cardsDeckPlayer2;     if(cardsDeckPlayer.length > 0)         return false;     let cardsPutIntoPlay = cardsPutIntoPlay1;     if(!isPlayer1)         cardsPutIntoPlay = cardsPutIntoPlay2;     for(let i=0; i< cardsPutIntoPlay.length; i++){         if(cardsPutIntoPlay[i] != null)             return false;     }     return true; }  | 
					
残り枚数の表示
SetCardsCountText関数は各プレイヤーの残りのカードの枚数を調べて表示させるための関数です。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13  | 
						function SetCardsCountText(){     let player1 = cardsDeckPlayer1.length;     for(let i = 0; i<cardsPutIntoPlay1.length; i++){         if(cardsPutIntoPlay1[i] != null)             player1++;     }     let player2 = cardsDeckPlayer2.length;     for(let i = 0; i<cardsPutIntoPlay2.length; i++){         if(cardsPutIntoPlay2[i] != null)             player2++;     }     elementCardsInfoText.innerHTML = ` あなた ${player1} 枚  コンピュータ ${player2} 枚  `; }  | 
					
双方がカードが出せない場合の処理
ShowSpeedTextIfNeed関数はお互いにカードを出せない状態のときに「スピード!」のかけ声とともにカードを出す状態の文字列を表示するためのものですが、それ以外にもゲームのなかでプレイヤーがやるべきことを指示する文字列を表示させるための処理もおこなっています。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37  | 
						function ShowSpeedTextIfNeed(){     let backupIsIgnoreTimer1 = isIgnoreTimer1;     // 両者ともにカードを出せない状態なのか調べる     if(!isGameSet && !CanPlayerPutCard(true) && !CanPlayerPutCard(false) && !CanPutIntoPlay(true) && !CanPutIntoPlay(false)){         // 両者ともにカードを出せないのでタイマーは無視する         isIgnoreTimer1 = true;         elementGameInfoText.style.backgroundColor = '#f00';         elementGameInfoText.style.color = '#fff';         if(cardsDeckPlayer1.length > 0)             elementGameInfoText.innerHTML = 'SPEED!! 山札をクリックしてください。            ';         else             elementGameInfoText.innerHTML = 'SPEED!! 場に出されているカードのどれかをクリックしてください。';         // 両者ともにカードを出せない場合は効果音を鳴らす         // ただし効果音を鳴らすのは前回はそうでなかった場合だけ         if(!backupIsIgnoreTimer1){             let music = new Audio('./speed.mp3');             music.play();         }     }     else{         // どちらか一方がカードを出せる状態であればカードを出すようにメッセージを表示する         elementGameInfoText.style.backgroundColor = 'green';         elementGameInfoText.style.color = '#fff';         let putIntoPlayLength = cardsPutIntoPlay1.filter(card => card != null).length;         if(putIntoPlayLength > 0 && cardsDeckPlayer1.length > 0)             elementGameInfoText.innerHTML = '場に出されているカードで出せるカードか山札をクリックしてください。';         else if(cardsDeckPlayer1.length > 0)             elementGameInfoText.innerHTML = '場に出されているカードで出せるカードをクリックしてください。';         else if(cardsDeckPlayer1.length > 0)             elementGameInfoText.innerHTML = '山札をクリックしてください。';         else             elementGameInfoText.innerHTML = '';     } }  | 
					
場にあるカードは出せるか?
CanPlayerPutCard関数は場にあるカードを出せるかどうかを調べます。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23  | 
						function CanPlayerPutCard(isPlayer1){     let cardsPutIntoPlay = cardsPutIntoPlay1;     if(!isPlayer1)         cardsPutIntoPlay = cardsPutIntoPlay2;     for(let i=0; i<cardsPutIntoPlay.length; i++){         if(cardsPutIntoPlay[i] == null)             continue;         let number = cardsPutIntoPlay[i].Number;         if(GetLedgerCardsTop1() != null){             let num = GetLedgerCardsTop1().Number;             if(Math.abs(number - num)  == 1 || Math.abs(number - num)  == 12)                 return true;         }         if(GetLedgerCardsTop2() != null){             let num = GetLedgerCardsTop2().Number;             if(Math.abs(number - num)  == 1 || Math.abs(number - num)  == 12)                 return true;         }     }     return false; }  | 
					
山札のカードを場に移動できるか?
CanPutIntoPlay関数は山札のカードを場に移動できるかどうかを調べます。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18  | 
						function CanPutIntoPlay(isPlayer1){     // 山札にカードが存在しないなら「できない」のでfalseを返す     if(isPlayer1 && cardsDeckPlayer1.length == 0)         return false;     if(!isPlayer1 && cardsDeckPlayer2.length == 0)         return false;     let cardsPutIntoPlay = cardsPutIntoPlay1;     if(!isPlayer1)         cardsPutIntoPlay = cardsPutIntoPlay2;     // 山札にカードが存在し、場に空きがあるなら移動可能なのでtrueを返す     for(let i=0; i<cardsPutIntoPlay.length; i++){         if(cardsPutIntoPlay[i] == null)             return true;     }     return false; }  | 
					
カードはどこに出せるか?
GetLedgerAblePutCard関数は引数として渡されたカードを出せる台札を返します。ない場合はnullを返します。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  | 
						function GetLedgerAblePutCard(card){     let number = card.Number;     if(GetLedgerCardsTop1() != null){         let num = GetLedgerCardsTop1().Number;         if(Math.abs(number - num)  == 1 || Math.abs(number - num)  == 12)             return cardsLedgerPlayer1;     }     if(GetLedgerCardsTop2() != null){         let num = GetLedgerCardsTop2().Number;         if(Math.abs(number - num)  == 1 || Math.abs(number - num)  == 12)             return cardsLedgerPlayer2;     }     return null; }  | 
					
CallSpeed関数は両者が同時に「スピード!」のかけ声とともにカードを出す処理をおこないます。引数はそのさいにプレイヤーが出すカードです。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76  | 
						function CallSpeed(card){     let startX;     let startY;     let endX;     let endY;     let index;     // カードが移動する演出をするためにカードの移動終了座標を取得する     endX = elementCardsLedgerPlayer1.style.marginLeft.replace('px', '');     endY = elementCardsLedgerPlayer1.style.marginTop.replace('px', '');     if(cardsDeckPlayer1.length > 0){         cardsLedgerPlayer1.push(card);         cardsDeckPlayer1.splice(0, 1);         // カードが山札から出される場合         // カードが移動する演出をするためにカードの移動開始座標を取得する         startX = elementCardsDeckPlayer1.style.marginLeft.replace('px', '');         startY = elementCardsDeckPlayer1.style.marginTop.replace('px', '');     }     else{         // カードが場から出される場合         // カードが移動する演出をするためにカードの移動開始座標を取得する         for(let i=0; i<cardsPutIntoPlay1.length; i++){             let intoPlayCard = cardsPutIntoPlay1[i];             if(intoPlayCard != card)                 continue;             cardsLedgerPlayer1.push(card);             cardsPutIntoPlay1[i] = null;             index = i;             break;         }         startX = elementsCardsPutIntoPlay1[index].style.marginLeft.replace('px', '');         startY = elementsCardsPutIntoPlay1[index].style.marginTop.replace('px', '');     }     // 配列movingCardsに移動させるカードを格納する     movingCards.push(new MovingCard(card.Suit, card.Number, Number(startX), Number(startY), Number(endX), Number(endY), card.GetImageTagText(), document.getElementById('table')));     endX = elementCardsLedgerPlayer2.style.marginLeft.replace('px', '');     endY = elementCardsLedgerPlayer2.style.marginTop.replace('px', '');     // コンピュータが出すカードについても同様に処理をする     let compCard;     if(cardsDeckPlayer2.length > 0){         compCard = cardsDeckPlayer2[0];         cardsLedgerPlayer2.push(compCard);         cardsDeckPlayer2.splice(0, 1);         startX = elementCardsDeckPlayer2.style.marginLeft.replace('px', '');         startY = elementCardsDeckPlayer2.style.marginTop.replace('px', '');     }     else{         for(let i=0; i<cardsPutIntoPlay2.length; i++){             compCard = cardsPutIntoPlay2[i];             if(compCard == null)                 continue;             cardsLedgerPlayer2.push(compCard);             cardsPutIntoPlay2[i] = null;             index = i;             break;         }         startX = elementsCardsPutIntoPlay1[index].style.marginLeft.replace('px', '');         startY = elementsCardsPutIntoPlay1[index].style.marginTop.replace('px', '');     }     movingCards.push(new MovingCard(compCard.Suit, compCard.Number, Number(startX), Number(startY), Number(endX), Number(endY), compCard.GetImageTagText(), document.getElementById('table')));     // タイマーイベントに反応できるようにする     isIgnoreTimer1 = false;     ShowCard();     let music = new Audio('./2.mp3');     music.play(); }  | 
					
カードをクリックしたときの処理
カードをクリックしたときの処理をおこないます。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51  | 
						document.onmousedown = function(e){     // すでにゲームセットの状態であればなにもしない     if(isGameSet)         return;     // カードがクリックされる場合、どれなのかを調べる     // クリックされるのはimg要素なのでどれかを特定するためにその親要素を調べる     let parentElement = e.target.parentElement;     if(parentElement == null)         return;     // idがわかればクリックされたカードを特定できる     let id = parentElement.getAttribute('id');     // 山札のカードであれば場に移動する     // ただし山札のカードが存在しない、場に空きがない場合はなにもしない     if(id == 'cardsDeckPlayer1'){         if(cardsDeckPlayer1.length > 0){             for(let i=0; i<cardsPutIntoPlay1.length; i++){                 if(cardsPutIntoPlay1[i] == null){                     cardsPutIntoPlay1[i] = cardsDeckPlayer1[0];                     cardsDeckPlayer1.splice(0, 1);                     // カードを移動できるなら効果音を鳴らす                     let music = new Audio('./1.mp3');                     music.play();                     return;                 }             }             // 「スピード!」のかけ声とともにカードを出す場合も山札のカードがクリックされるので             // 対応できるようにしておく             if(!isGameSet && !CanPlayerPutCard(true) && !CanPlayerPutCard(false) && !CanPutIntoPlay(true) && !CanPutIntoPlay(false)){                 CallSpeed(cardsDeckPlayer1[0]);                 cardsDeckPlayer1.splice(0, 1);             }         }     }     // 場のカードが出せるなら出す     else if(id == 'cardsPutIntoPlay1-0'){         PutCardOnClick(0);     }     else if(id == 'cardsPutIntoPlay1-1'){         PutCardOnClick(1);     }     else if(id == 'cardsPutIntoPlay1-2'){         PutCardOnClick(2);     }     else if(id == 'cardsPutIntoPlay1-3'){         PutCardOnClick(3);     } }  | 
					
PutCardOnClick関数は場のカードを出せるか調べて出せるなら出す処理をおこないます。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36  | 
						function PutCardOnClick(i){     // 場にカードが存在し、そのカードが出せるときだけ処理をおこなう     if(cardsPutIntoPlay1[i] != null && GetLedgerAblePutCard(cardsPutIntoPlay1[i]) != null){         let card = cardsPutIntoPlay1[i];         let ledger = GetLedgerAblePutCard(card);         ledger.push(card);         let elementLedger;         if(ledger == cardsLedgerPlayer1)             elementLedger = elementCardsLedgerPlayer1;         else             elementLedger = elementCardsLedgerPlayer2;         // カードが移動する演出をするために移動開始の座標と終了の座標を取得する         let fromX = elementsCardsPutIntoPlay1[i].style.marginLeft.replace('px', '');         let fromY = elementsCardsPutIntoPlay1[i].style.marginTop.replace('px', '');         let toX = elementLedger.style.marginLeft.replace('px', '');         let toY = elementLedger.style.marginTop.replace('px', '');         // 場からカードを出せば場のカードはなくなる         cardsPutIntoPlay1[i] = null;         // 配列 movingCardsにMovingCardオブジェクトを格納する         movingCards.push(new MovingCard(card.Suit, card.Number, Number(fromX), Number(fromY), Number(toX), Number(toY), card.ImageTagString, document.getElementById('table')));         let music = new Audio('./2.mp3');         music.play();     }     else if(!isGameSet && !CanPlayerPutCard(true) && !CanPlayerPutCard(false) && !CanPutIntoPlay(true) && !CanPutIntoPlay(false) && cardsDeckPlayer1.length == 0) {         // 「スピード!」のかけ声とともにカードを出す場合、場のカードがクリックされる場合がある         // そのため対応できるようにしておく         let card = cardsPutIntoPlay1[i];         CallSpeed(card);     } }  | 
					
コンピュータがカードを出す処理
コンピュータがカードを出す処理を示します。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33  | 
						function PutCompCard(){     // 場のカードで出せるカードがあるか調べる     for(let i = 0; i < cardsPutIntoPlay2.length; i++){         if(cardsPutIntoPlay2[i] != null) {             let card = cardsPutIntoPlay2[i];             let ledger = GetLedgerAblePutCard(card);             if(ledger != null){                 let elementLedger;                 if(ledger == cardsLedgerPlayer1)                     elementLedger = elementCardsLedgerPlayer1;                 else                     elementLedger = elementCardsLedgerPlayer2;                 let fromX = elementsCardsPutIntoPlay2[i].style.marginLeft.replace('px', '');                 let fromY = elementsCardsPutIntoPlay2[i].style.marginTop.replace('px', '');                 let toX = elementLedger.style.marginLeft.replace('px', '');                 let toY = elementLedger.style.marginTop.replace('px', '');                 movingCards.push(new MovingCard(card.Suit, card.Number, Number(fromX), Number(fromY), Number(toX), Number(toY), card.ImageTagString, document.getElementById('table')));                 ledger.push(card);                 cardsPutIntoPlay2[i] = null;                 setTimeout(()=>{                     PutCompToIntoPlay();                 }, 500);                 return;             }         }     }     // 場のカードで出せるカードがあるかない場合、山札から場にカードを移動できるなら移動させる     PutCompToIntoPlay(); }  | 
					
山札から場にカードを移動できるなら移動させる処理を示します。
| 
					 1 2 3 4 5 6 7 8 9 10  | 
						function PutCompToIntoPlay(){     if(cardsDeckPlayer2.length > 0){         for(let i = 0; i < cardsPutIntoPlay2.length; i++){             if(cardsPutIntoPlay2[i] == null){                 cardsPutIntoPlay2[i] = cardsDeckPlayer2[0];                 cardsDeckPlayer2.splice(0, 1);             }         }     } }  | 
					
