⌨️

自作キーボードで遊んじゃおう!

2024/12/16に公開

この記事はSimpleForm Advent Calendar 2024 16日目の記事です。
https://qiita.com/advent-calendar/2024/simpleform

自作キーボードでこんなことして遊んでるよーって記事になるので、息抜き程度に見ていただけたら幸いです!

キーボードの紹介

TinyGo Keeb Tour 2024 in Sendai with Sendai.goに参加して自作キーボードを作成しました。
https://sendaigo.connpass.com/event/327533/

こんな感じのキーボードです⇩
自作キーボード

技術

Go 1.23.2
TinyGo 0.33.0

TinyGoは、小型のマイクロコントローラーやWebAssembly(Wasm)ターゲット向けにコンパイルするためのGoのコンパイラーです。
Goとの互換性として、標準ライブラリの一部をサポートし、Goと同じように書くことができます。

どんな感じで遊んでるの?

キーボードで遊べるゲームプログラムを書いて遊べるようにしてます!
メインはゲームとして遊んでいますが、普通のキーボードとしても機能するようにもできます。

モグラ叩きゲーム

https://x.com/Ryu_07_29/status/1865312137519993190

赤色のキーを押して全てのキーの色を白にする速さを競うゲームになってます。
ソースコードはこちらです⇩
https://github.com/ryu-0729/tinygo_game/tree/main/whack_a_mole_game

処理的に難しいことはしていませんが、ランダムに赤色に光らせる位置を決める処理はやや工夫したかもです。
赤に光らせる位置は6個と決めていたので、ランダムに値を取得して6個が決まったら後続の処理に入るみたいな流れになります。
Goでは集合型がないため、golang-setというパッケージを使用しています。
採用した理由としては、集合は重複チェックとかの処理をしなくて良いので楽かなと考えていたのと試しに使ってみるかと思った2点です。

// 全体のキーを赤色にする配列
colors := []uint32{
	RED, RED, RED, RED,
	RED, RED, RED, RED,
	RED, RED, RED, RED,
}

// 集合を作る
whiteColorIdxs := mapset.NewSet[int]()
// 要素が6個になるまでループ
for whiteColorIdxs.Cardinality() < 6 {
	randomNumber := rand.New(rand.NewSource(time.Now().UnixNano()))
	randomIdx := randomNumber.Intn(len(colors))

	whiteColorIdxs.Add(randomIdx)
}

// 全体のキーを赤色にする配列のランダムな位置を白色にする(結果的にランダムに赤色が決まる)
whiteColorIdxSlice := whiteColorIdxs.ToSlice()
for _, val := range whiteColorIdxSlice {
	colors[val] = WHITE
}

ちなみにモグラ叩きゲーム社内最速は「0.957秒」です🎊

目押しゲーム

https://x.com/Ryu_07_29/status/1868228930106519592

レベルごとに速度が変わる赤色の場所を目押しするゲームになっています。(クリアするごとにレベルが上がります⤴️)
ソースコードはこちらです⇩
https://github.com/ryu-0729/tinygo_game/tree/main/meoshi_game

赤色に光らせながら1周させるのがやや大変になっています。。。
というのも今回のキーボードの位置/順番は以下のようになっています。(キーのインデックスみたいに考えていただければと思います)

 0  3  6  9
 1  4  7 10
 2  5  8 11

なので、1周するように光らせるには0 -> 3 -> 6 -> 9 -> 10 -> 11 -> 8 -> 5 -> 2 -> 1 -> 0...とする必要があります。
どう実装しようか悩んだところでしたが、シンプルにキーのインデックスとなる値を配列で持ってループする実装で対応しました。

keyMap := []int{0, 3, 6, 9, 10, 11, 8, 5, 2, 1}
for _, keyValue := range keyMap {
    // 後続の処理...
}

こちらの目押しゲームはアドカレ公開日に合わせて作成したものになるので、社内メンバーにはまだ遊んでいただいていません。
最高レベルのレベル10を達成する方が現れるか楽しみです!
自分はレベル8がクリアできずでした。。。

さいごに

社内メンバーにも遊んでいただき嬉しいフィードバックを貰えていること心から感謝です!
それでは「Merry Christmas ☃️」

GitHubで編集を提案
SimpleForm Tech Blog

Discussion