佐藤さとる

佐藤さとる

ColorCodeBOT

2022年06月12日

概要

友)カラーコード好きなんだよね。よくネッ友とカラーコード当てゲームしてる

私)めんどくさくない?BOTにしたら...? *私がつくろう !!*

<br>

カラーコード当てゲーム とは

画像を送ってそのカラーコードを当てるゲーム

f83264.png (354 B)
ffd876.png (353 B)

ポイント

データの保存

ルームごとのゲームモード等を保存するのに sqlite を使用しています

画像生成できない!

canvas を使いたかったが原因不明のエラーにより使えなかった

→ sharp でpng画像を生成するようにした

(256×256×256枚の画像生成せずに済んでよかった...)

画像データが圧迫する

サーバのglitchには容量制限があるため画像データが邪魔

→ データベースに生成記録を保存しておき、一定時間で削除されるようになっている

(ゲーム記録も一定時間で削除されます)

技術スタック

ゲームモード

  1. training

回答したら次の問題がきます

"fin" を入力すると終了します

  1. oneshot

一人一つカラーコードを入力し、誤差が小さい人が勝ちです

"check" を入力すると結果が表示されます

  1. perfect

カラーコードをピッタリ入力した人が勝ちです

  1. perfectH

perfect のハードモードです

ヒントは表示されません

コマンド

コマンド

!tcc [gamemode]

指定したゲームを開始します

!tcc random (num)

ランダムな色を送信します

(num) に 1~5 の数字を指定すると複数送信されます

!tcc help

ヘルプを表示します

#[colorcode]

入力された色を表示します

ゲーム中はカラーコードを指定することができます

ファイル構成

├─ server.js
└─ src
  ├─ finish.js
  ├─ generatecc.js
  ├─ getcc.js
  ├─ help.js
  ├─ oneshot.js
  ├─ perfect.js
  ├─ random.js
  ├─ remove.js
  ├─ training.js
  └─ winner.js

以下の部分でsrcディレクトリ全てのファイルを読み込んでいます

[server.js:10]

let src = {};
fs.readdir('./src/.', (err, files) => {
    files.forEach(file => {
        base = path.basename(file, path.extname(file));
        src[base] = require('./src/' + file)
    });
});

カラー画像生成

0~255(10) と 0~ff(16) のランダムな数値を生成

[generatecc.js]

for (let i = 0; i < 3; i++) {
    rgb10[i] = Math.floor(Math.random() * 256);
    rgb16[i] = rgb10[i].toString(16);
}

カラーコード化

[generatecc.js]

let colorcode = ''
for (let i = 0; i < rgb16.length; i++) {
    colorcode += zeroPadding(rgb16[i], 2);
}

画像を生成

[generatecc.js]

const path = `images/${colorcode}.png`;
if (!fs.existsSync(path)) {
    sharp({
        create: {
            width: 100,
            height: 100,
            channels: 3,
            background: { r: rgb10[0], g: rgb10[1], b: rgb10[2] }
        }
    }).toFile(`images/${colorcode}.png`);
}

GitHub リポジトリ

SatooRu65536/ThatsColorCode