タロットカード占い企画(後編)

デモンストレーション

デモページへ

JavaScriptでは、あらかじめ0~21番が割り当てられたカードをシャッフルし、
山札として用意します。

カードのシャッフルにはフィッシャー–イェーツ方式というアレゴリズムを用います。

フィッシャー–イェーツ方式


    const arr = [0,1,2,3,4,5,6,7,8,9,10,
    11,12,13,14,15,16,17,18,19,20,21
    ]
    
    for (let i = arr.length - 1; i > 0; i--) {
        const j = Math.floor(Math.random() * (i + 1));
        const temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

このプログラムでは、
21⇔21以下のランダムな数字、
20⇔20以下のランダムな数字、
19⇔19以下のランダムな数字…
という風に、置き換えた数を後半の配列に繰り上げていきます。

① 21と3を置換(仮)

1,2,21,4,5,6…20,3

② 20と6を置換(仮)

1,2,21,4,5,20…6,3

この時点で、シャッフルした配列のどの部分を選んでも、
完全にランダムな数字が得られます。
「適当に選ぶ」でカードをランダム選択する時も応用出来ます。

この理論は難しいですが、汎用性がありますので、
特定の集合を並び替えたり、適当なものを選択したりする場合、
なるべくこの原理を応用しましょう。

プログラム機能

途中、占星術的な要素を追加したく思い、結果をセーブし、
経過時間を表すプログラムを考えましたが、最終的には、
占った日時と結果を呼び出す機能にしました。
結果は暗号化されず、テキストファイルでダウンロード(任意)されます。

インポートとエクスポートは全く違うプログラムコード(メソッド)を使う為、
都度、ChatGPTに質問しました。

結果をエクスポート


    const text = "Hello, world!";
    // 文字列でも配列でもオブジェクトでも
    const blob = new Blob([text], { type: "text/plain" });
    
    const link = document.createElement("a");
    link.href = URL.createObjectURL(blob);
    link.download = "hello.txt";
    
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
    
    URL.revokeObjectURL(link.href);    

blobとは「バイナリ・ラージ・オブジェクト」の略で、
様々な種類のファイルをバイナリ(二進数)に変換します。

blobはダウンロード(インポート)の為に用いますが、ファイルサーバーと違うのは、
ブラウザ(chromeなど)依存の機能である事です。
ファイルサーバーとは違い、JavaScript依存の機能でもある為、
ログイン・パスワードなどのセキュリティは担保されません。
(JavaScriptは、基本的に外から見る事が出来る為。)


    const canvas = document.getElementById("myCanvas");
    
    canvas.toBlob(function(blob) {
        const link = document.createElement("a");
        link.href = URL.createObjectURL(blob);
        link.download = "image.png";
        link.click();
        URL.revokeObjectURL(link.href);
    });

blobは文字列やデータのみならず、
canvasという要素に描画した絵をpngファイルとして保存出来ます。

JSON形式でエクスポート


    const data = { name: "Alice", age: 25 };
    const blob = new Blob([JSON.stringify(data, null, 2)], { type: "application/json" });
    
    const link = document.createElement("a");
    link.href = URL.createObjectURL(blob);
    link.download = "data.json";
    link.click();
    URL.revokeObjectURL(link.href);

今回は構造体(オブジェクト{}の中に配列[]があり、
また配列[]の中にオブジェクトがある)をインポート(アップロード)する必要がある為、
dataに入る構造体をJSONに変換する必要があります。

JSONとは、JavaScriptのオブジェクトの表記法を基にしたデータ形式で、
テキストベースのデータ交換用フォーマットです。

JSONはApps ScriptでExcelに入力したデータJavaScriptの構造体JSONに変換し、
構造体としてタロットサイト側のJavaScriptに組み入れる際にも使います。

結果をインポート


    const file_input = document.getElementById("file-input");
    
    if(file_input){
        const result = tarot.querySelector(".result-2");
        
        file_input.addEventListener("change", (event) => {
            const reader = new FileReader();
            reader.readAsText(event.target.files[0]);
            // FileReader()にテキスト形式として読み込む
            
            reader.onload = (event) => {
                const json_data = JSON.parse(event.target.result);
                // JSONに変換し、後略
            };
        });
    }

JavaScriptは「高級言語」とされていますが、インポートは手動的です。
ファイルを読み込む為にFileReader()というクラスが使用されますが、
読み込んだファイルを、一旦文字列形式(string)に変換し、
最終的にJSON.parse()メソッドで元の構造体に戻します。

ただし、これでも構造体であれば何でも良いという意味になってしまう為、
設計した構造体の形であるかどうか、例外処理(エラーキャッチ)するという作業が必要です。

これにて、エクスポート&インポートの処理が完成するのです。

みらいワークの施設利用者
チュンチュン

「WordPress」でのHTML・CSS・JavaScriptに関する情報を、
提供させて頂く予定です。
使用プラグインは「Simple Custom CSS and JS」で、
JavaScriptの表示位置は必ず「要素内」です。
ただし、使用環境により異なる事をご了承ください。

サイト制作
「みらいワーク」利用者ノート
タイトルとURLをコピーしました