アイコン

佐藤さとる

ColorCodeBOT

2022年06月12日

thumbnail

概要

友)カラーコード好きなんだよね。よくネッ友とカラーコード当てゲームしてる
私)めんどくさくない?BOTにしたら...? 私がつくろう !!


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

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

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

ポイント

データの保存

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

画像生成できない!

canvas を使いたかったが原因不明のエラーにより使えなかった
→ sharp でpng画像を生成するようにした
(256×256×256枚の画像生成せずに済んでよかった...)

画像データが圧迫する

サーバのglitchには容量制限があるため画像データが邪魔
→ データベースに生成記録を保存しておき、一定時間で削除されるようになっている
(ゲーム記録も一定時間で削除されます)

技術スタック

  • Node.js 17.10
  • discord.js 12.5.3
  • glitch

ゲームモード

  1. training
    回答したら次の問題がきます
    "fin" を入力すると終了します

  2. oneshot
    一人一つカラーコードを入力し、誤差が小さい人が勝ちです
    "check" を入力すると結果が表示されます

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

  4. 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ディレクトリ全てのファイルを読み込んでいます

1[server.js:10] 2 3let src = {}; 4fs.readdir('./src/.', (err, files) => { 5 files.forEach(file => { 6 base = path.basename(file, path.extname(file)); 7 src[base] = require('./src/' + file) 8 }); 9});

カラー画像生成

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

1[generatecc.js] 2 3for (let i = 0; i < 3; i++) { 4 rgb10[i] = Math.floor(Math.random() * 256); 5 rgb16[i] = rgb10[i].toString(16); 6}

カラーコード化

1[generatecc.js] 2 3let colorcode = '' 4for (let i = 0; i < rgb16.length; i++) { 5 colorcode += zeroPadding(rgb16[i], 2); 6}

画像を生成

1[generatecc.js] 2 3const path = `images/${colorcode}.png`; 4if (!fs.existsSync(path)) { 5 sharp({ 6 create: { 7 width: 100, 8 height: 100, 9 channels: 3, 10 background: { r: rgb10[0], g: rgb10[1], b: rgb10[2] } 11 } 12 }).toFile(`images/${colorcode}.png`); 13}

GitHub リポジトリ

SatooRu65536/ThatsColorCode