Node.jsのスロットマシン プロジェクト分析
プロジェクト構造
純粋なJavascriptとNode JSで書かれたゲーム。 作者 a7ul
スロットマシンプロジェクトは、いくつかの主要なディレクトリとファイルに整理されています:
slot-machine-master/
├── .eslintrc
├── .gitignore
├── Procfile
├── README.md
├── index.js
├── package.json
├── yarn.lock
├── app/
│ ├── index.html
│ ├── main.js
│ ├── style.css
│ └── assets/
│ ├── Symbol_0.png
│ ├── Symbol_1.png
│ ├── Symbol_2.png
│ ├── Symbol_3.png
│ ├── Symbol_4.png
│ ├── Symbol_5.png
│ └── button.png
└── server/
├── handlers.js
├── helpers.js
└── router.js
主要なファイルとディレクトリ
1. 設定ファイル
- .eslintrc: プロジェクトの ESLint 設定が含まれており、コードの品質と一貫性を確保します。
- .gitignore: Gitによって無視されるべきファイルとディレクトリを指定し、リポジトリにコミットされるのを防ぎます。
- Procfile: Herokuによってプロセスタイプと実行されるコマンドを宣言するために使用されます。
2. プロジェクトメタデータ
- package.json: プロジェクトに関するメタデータが含まれており、依存関係、スクリプト、およびその他の設定が含まれています。
- yarn.lock: 依存関係の正確なバージョンがインストールされることを保証します。
3. メインアプリケーションファイル
- index.js: Node.js アプリケーションのエントリーポイントです。
- README.md: プロジェクトの概要、インストール手順、使用方法の詳細を提供します。
4. フロントエンドアプリケーション
- app/index.html: フロントエンドのメインHTMLファイルです。
- app/main.js: フロントエンドロジックの主要なJavaScriptファイルです。
- app/style.css: フロントエンドのスタイルシートです。
- app/assets/: アプリケーションで使用される画像が含まれています。例えば、スロットマシンのシンボルやボタンの画像です。
5. バックエンドロジック
- server/handlers.js: 様々なルートのハンドラ関数が含まれています。
- server/helpers.js: ハンドラによって使用されるヘルパー関数が含まれています。
- server/router.js: バックエンドのルーティングロジックを定義します。
ファイルの詳細分析
index.js
const http = require('http');
const router = require('./server/router');
const PORT = process.env.PORT || 3000;
const server = http.createServer(router);
server.listen(PORT, () => console.log(`Server running at Port :${PORT}/`)); //eslint-disable-line no-console
このファイルはNode.jsアプリケーションのエントリーポイントです。通常、サーバーの設定やミドルウェア、ルートの設定を行います。
package.json このファイルには、プロジェクトに関する重要な情報が含まれています。例えば、プロジェクト名、バージョン、依存関係などです。必要なnpmパッケージやスクリプトのリストが含まれています。
README.md READMEファイルは、プロジェクトの設定と実行方法に関する包括的なガイドを提供します。通常、インストール手順、プロジェクトの説明、使用例などが含まれています。
app/index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Slot Machine</title>
<link rel="stylesheet" href="./style.css">
</head>
<body>
<div class="container">
<div id="win-message">Press Button to Play</div>
<div class="image-container">
<img id="first-image" class="result-image" src="./assets/Symbol_1.png"/>
<img id="second-image" class="result-image" src="./assets/Symbol_1.png"/>
<img id="third-image" class="result-image" src="./assets/Symbol_1.png"/>
</div>
<div class="retry-button-container">
<div id="message">Hidden Message</div>
<img id="retry-button" src="./assets/button.png"/>
</div>
</div>
<script src="./main.js"></script>
</body>
</html>
これはフロントエンドアプリケーションのメインHTMLファイルです。スロットマシンのインターフェイスの構造(最高のオンラインカジノプロバイダーに値する)、CSSとJavaScriptファイルへのリンクが含まれています。
app/main.js
(function() {
const ASSET_PATH = './assets'; // アセットフォルダへのパス
// サーバーから結果を取得する関数
const fetchResult = () => {
const responsePromise = window.fetch('/result', {method: 'get'})
.then((rawResponse) => rawResponse.json()); // レスポンスをJSONとして解析
return responsePromise;
};
// 新しい結果を取得して再試行する関数
const retryNewResult = () => {
setMessage(null); // 既存のメッセージをクリア
fetchResult().then((response) => {
const {result, bonus} = response; // レスポンスを分解
setResultOnUI(result); // 結果をUIに設定
setWinMessage(result); // 結果に基づいて勝利メッセージを表示
checkBonus(bonus); // ボーナスを確認して処理
}).catch((err)=>{
setMessage(err.message); // 取得に失敗した場合はエラーメッセージを表示
});
};
// 結果に基づいて勝利メッセージを設定する関数
const setWinMessage = (result) => {
const [first, second, third] = result; // 結果の配列を分解
const winMessageDiv = document.getElementById('win-message');
if(first === second && second === third){
winMessageDiv.innerHTML = 'Big Win'; // 3つのシンボルが一致
} else if(first === second || second === third || first === third){
winMessageDiv.innerHTML = 'Small Win'; // 2つのシンボルが一致
} else {
winMessageDiv.innerHTML = 'No Win'; // シンボルが一致しない
}
};
// 結果をUIに設定する関数
const setResultOnUI = (result = []) => {
const [first, second, third] = result; // 結果の配列を分解
const firstImage = document.getElementById('first-image');
const secondImage = document.getElementById('second-image');
const thirdImage = document.getElementById('third-image');
firstImage.src = `${ASSET_PATH}/Symbol_${first}.png`; // 1つ目の画像のソースを設定
secondImage.src = `${ASSET_PATH}/Symbol_${second}.png`; // 2つ目の画像のソースを設定
thirdImage.src = `${ASSET_PATH}/Symbol_${third}.png`; // 3つ目の画像のソースを設定
};
// ボーナスを確認して処理する関数
const checkBonus = (bonus) => {
const retryBtn = document.getElementById('retry-button');
if(!bonus){
retryBtn.style['pointer-events']='auto'; // リトライボタンを有効にする
retryBtn.style.opacity = 1;
return;
}
setMessage('You have a bonus !!'); // ボーナスメッセージを表示
retryBtn.style['pointer-events']='none'; // リトライボタンを無効にする
retryBtn.style.opacity = 0.3;
setTimeout(retryNewResult, 500); // 一定時間後に自動的に再試行
};
// UIにメッセージを設定する関数
const setMessage = (message) => {
const messageDiv = document.getElementById('message');
if(message){
messageDiv.innerHTML = message; // メッセージを表示
messageDiv.style.opacity = 1;
}else{
messageDiv.style.opacity = 0; // メッセージを非表示にする
}
};
// リトライボタンに新しい結果を取得するためのイベントリスナーを追加
document.getElementById('retry-button').addEventListener('click', retryNewResult);
})();
このJavaScriptファイルは、スロットマシンゲームのクライアント側ロジックを含んでいます。ユーザーの操作、アニメーション、およびゲームのメカニクスを処理します。
app/style.css このCSSファイルは、スロットマシンインターフェースのスタイルを定義し、レイアウト、色、フォントを含みます。
server/handlers.js このファイルには、HTTPリクエストを処理する関数が含まれています。これらの関数はrouter.jsで定義されたルートによって呼び出されます。
server/helpers.js サーバーサイドのコード全体で使用されるヘルパー関数がここに定義されています。これらは様々なタスクのユーティリティ関数を含みます。
server/router.js ルーティングロジックを定義し、URLパスをhandlers.jsのハンドラ関数にマッピングします。
結論
スロットマシンプロジェクトは、フロントエンドとバックエンドのコードが明確に分離されている、よく構成されたプロジェクトです。 .eslintrcやpackage.jsonなどの設定ファイルの使用により、コードの品質を維持し、依存関係を効果的に管理できます。ディレクトリ構造は論理的で、プロジェクトのナビゲートが容易です。
参考文献:
[1] - https://github.com/a7ul/slot-machine [2] - x-casino.org