LEGO でボードゲームを作った思い出
大昔(2年前)に頑張って作ったやつの紹介です.
院試の関係で前回更新から随分空いちゃいました.
成果物
先に成果物をお見せします.
C4Game LEGO Mindstorms (C4ゲーム レゴマインドストーム)
6月上旬 ~ 7月中旬 の時間で仕上げた割には
なかなかの自信作になりました
班員がデキる奴ばかりで良かった…
ことの発端
私の学科は毎学期,PBLっていう
プロジェクト学習の授業があります.
2年前期は LEGO Mindstorms で
何かを作りましょう,というものでした.
LEGO Mindstorms とは
LEGO Mindstorms というのは,
簡単に言うと,専用の制御装置を使って
LEGO でプログラミングできちゃうやつです.
上のリンクにある動画では,
ビジュアルプログラミングの例が上がっていましたが,
C言語によるテキストプログラミングも可能で,
さらに,Arduino と 専用の EVShield という拡張を使っても開発ができるという代物です.
Arduino and EVShield Promotion
(別に私は LEGO や Arduino の回し者等ではありませんが)
すごく楽しく開発させてもらいました.
ちーむたなっち
私たちの班は「ちーむたなっち」になってしまいました.(生贄)
何を作るかは自由でしたが
特に面白くてかつ現実的な案も思いつかず
ちょっとベタだけどボードゲームを作ろうということになりました.
最初はオセロを作ろうぜ〜という案が出たのですが
EV3とArduino+EVShield 合わせての入出力ポートはそれぞれ8つずつしかなく,
シリアル通信で連携させても足りないのは明らかでした.
なんとかならんかということで
いろいろ調べてみた結果
C4 (Connect 4) というゲームならいけそうだとわかりました.
C4 とは
C4 (Connect 4) というゲームは
日本語では重力付き四目並べと呼ばれるらしく,
その名の通り,上からコマを落としていって
先に4つ並べた方が勝ちというゲームです.
C4のサンプルゲームが公開されているのでよかったら試しに遊んでみてください↓.
(AIがめちゃくちゃ強いです.)
https://kenrick95.github.io/c4/
これなら入力に使うセンサはレーンの数だけで済むので
使用するポートがかなり節約できます.
(タクトスイッチと抵抗をいい感じに組み合わせたら
電圧値でどのスイッチを押したか特定できなくもなさそうでしたが
泥沼化しそうだったので却下されました)
たなっちとしては
まだまだプログラミング初心者であった私にとっては
シリアル通信はおろか
C言語標準以外のライブラリを利用することすら
今までにない経験でした.(ついでにArduinoも)
外部ライブラリ
EVShield を使うのはウチの班だけでした.
機材は用意するから勝手に進めてくれスタイルでしたので,
私はEVShield の導入方法のところから調べていきました.
EVShield のライブラリ
github.com
(ぎょえ〜〜しかも英語かよ…)とか思いつつ
リファレンスを読みながら頑張ってた記憶があります.
シリアル通信
ユーザーからの入力はタッチセンサを6つ使ったのですが,
そのうち2つはEVShield,あとの4つはEV3に繋いでいて,
シリアル通信でEV3からEVShieldにセンサ情報を送信し,
ゲームの進行はEVShield側で扱っていました.
今となってはもう思い出せませんが
シリアル通信でアホみたいに沼っていました.
最終的には,なんとか1回の Serial.read();
の呼び出しで
4つ分のセンサ情報を取得することに成功しました.
結局のところシリアル通信のノウハウは理解できてないと思います.
AI (もどき) の実装
過去に作ったオセロゲームでAI(もどき)を実装したのを参考に開発しました.
なぜ「もどき」なのかというと,1年生の時に
「こうやったらAIっぽくなるんじゃね?」思って自分なりに書いたやつで,
ちゃんとした理論に乗っかっていないからです.
一応,何手か先を読んで良い感じの手を出すような挙動はしてくれてます.
ただ以前作ったものはメモリを2MBも喰うモンスターでしたので
リソースを節約するようにアレンジし,
なんとかArduino Megaのメモリ(256KB)に収まるようになりました.
シリアル通信とAIもどきが動いている様子を動画に収めていたので
簡単に編集してYoutube にアップしました.
C4 ゲームの各要素の動作テスト(Tests of components of the C4Game)
(なにげに Youtube 初投稿)
天才的なハードウェア
私がソフトウェアをもちゃもちゃしている間に
他のメンバーがハードウェアの部分をゴリゴリ開発してくれていました.
(完成品を見て,私では到底できなかったと思いました…)
特にオレンジのパーツの回転方向で落とすレーンを変えることで
使用する出力ポートを減らすというアイデアは流石でした.
コマを落とすパーツは3Dプリンタで自作していました.
初めは三日月型に成形して,凹んだところにコマをはめるようにしていたのですが
回転時にコマがこぼれたり,他のパーツと挟まったりして
かなり苦労したそうです.
試行錯誤を経て「コマを入れるポケット」を持つ形状を
O氏が考案し,完璧を動作を実現しました.
今でこそあの形状以外ありえないと思えるのですが,
これを初めてみたときは天才かと思いました.
↓コマを落とす機構のところから再生します
結局入出力ポートは
- (入力)タッチセンサ × 6
- (出力)コマを落とす部分 × 3
- (出力)コマの種類を切り替える部分 × 1
しか使っていません.
結果として
教員評価,学生評価の両方で1位をいただきました!!
AI は,完成したものの実機で動作してくれなかったため
導入には至ませんでした.(; ;)
後で調べたところ,new
, delete
演算子が
Arduino でサポートされていないのが原因ぽかったです.
(簡単に対処できただけあって悔しい…)
あとは,勝敗が決まった時のアクションとかも
もう少し凝りたかったですねえ.
ソースコードはこちらです.(くそコード注意です)
github.com
make
も CMake
も知らなかったので
コンパイルするためのスクリプトを乗っけちゃっています.
正直,手直ししたいところだらけですが
記念としてそのままとしています.
(実機がない今となっては動作確認もできませんゆえ…)
余談
最初の時点で,ROSでEV3が動かせると知っていたら
もっと違うものを作っていたかもしれません.
いつか死ぬほど暇になったら再チャレンジしてみようかな(やらない)
あと記事もうちょい短くしたい.