Star Trek text Game 宇宙戦艦ヤマト編


Star Trek text Game のバリエーションとして、
宇宙戦艦ヤマトに舞台を移してみます。

エンタープライズ号(E)をヤマト(Y)に、クリンゴン(K)をガミラス(G)にい置き換えるのは、
誰でも思いつく安易な発想ですね。

ミッションの変更
敵艦を破壊するのではなく、
イスカンダル星に行って、コスモクリーナーを持ち帰ります。

デスラー総統
強力な敵役として、忘れてはいけない。
ヤマトよ攻撃力や防護力を強めに設定して、
直に戦闘すると、ヤマトがボロボロになる。
また、コスモクリーナーの受け取りを邪魔する。

オープニング
「さらば地球よ。。。」とテーマそングを流して、
士気を高めたいが、権利団体からクレームがきそう。

佐渡 酒造モード
キャラクラーに応じた小ネタがあるといいな。
戦闘中に酒をに見始めてしまい。コマンドが実行されないことがあるとか。


Text Game Androidへの移植


Text Game を Androidに移植しています。
まだ未完成ですが、簡単な遊びは出来るようになったので, Githubにソースコードを公開しました。
フィードバックお待ちします。

スクリーンショット
長距離センサー
20170404_star_trek_android_long_renge_sensor

短距離センサー
20170404_star_trek_android_short_renge_sensor

光子魚雷でクリンゴン艦を破壊する。
20170404_star_trek_android_torpedoe

ゲームの仕様やルールは、作りながら考えています。
オリジナル版の雰囲気を活かしつつ、プレイヤー−の操作がシンプルで、プログラム開発が容易になるようにしたいと思っています。

なお、基本的なルールを下記にまとめました。
Star Trek Text Game シナリオとルール


star trek text game


20170310_star_trek_text_game

star trek text gameは、1970年代に流行ったコンピュータゲームです。
私は、大学の研究室にあったミニコンで遊びました。
SFテレビドラマ「宇宙大作戦」をモチーフにしたもの。
エンタープライズ号に乗ってクリンゴン戦艦を撃破するという単純なシナリオです。
エンタープライズは「E」クリンゴンは「K」という文字で表現され
効果音もない簡素なものですが、妙にはまりました。

ASR43型というテレタイプを入出力機器に使ってました。
出力はロール紙に印字する方式です。ゲームのやりすぎで、ロール紙を使い切ったこともありました。
20170310_asr43

今でに根強い人気があるようで、ネットに色々情報が出ています。

ゲームの詳細
スタートレック (マイコンゲーム) – Wikipedia

BASIC版

STTR1

このゲームのオリジナルとされる1972年の MIKE MAYFIELD作のようです。

スタートレックのソースを読む

C#版
Star Trek 1971 Text Game

C#版は、BASIC版を移植したもの
C#にしたのは、goto文が使えるかららしい。

C版
lassic Super Star Trek Game

unix Windows MacOSX でビルドできるようです。

Android版
プレイしている動画

apk download


Star Trek text Game シナリオとルール


wikipediaの記述をベースに、BASIC版のソースコードを読解した内容を加味しています。

シナリオ
TVシリーズの Star TREK モチーフにしています。
プレイヤーは、エンター−プライズ号を操縦して、クリンゴン艦を撃破します。
制限時間内に全てのクリンゴン艦を撃破すると、プレイヤーの勝利です。

ルール
ゲーム盤の構成
宇宙全体が8x8の大区画 クォドラント Quadrant に分かれています。
宇宙全体にクリンゴン艦 klingon が点在しています。
1つのクォドラントは8x8の小区画 セクターに分かれています。
1つのセクターには、エンター−プライズ号かクリンゴン艦か宇宙基地か星があります。

エンタープライズ号の装備
(1)ワープエンジン Warp Engine
クォドラント間やクォドラント内を移動します。
方向と距離を指定します。
BASIC版では、距離が1以上ならクォドラント間、1以下ならクォドラント内、となっています。
少し、わかりにくいですね。
クォドラント間とクォドラント内の移動が、分かれているバリエーションもあります。
(2)インパルスエンジンimpulse Engine
クォクォドラント内を移動します。
方向と距離を指定します。
(3)長距離センサ Long renge Sensor
クォ周囲のドランの状況を表示します。
(3)短距離センサ Short renge Sensor
クォドラン内の状況を表示します。
)光子魚雷 Photon Torpedo
クリンゴン艦を攻撃します。
コースを指定します。
クリンゴン艦か、宇宙基地か、星に命中するまで、直進します。
クリンゴン艦に命中すると、リンゴン艦を破壊します。
宇宙基地に命中すると、宇宙基地を破壊し補給が受けれれなくなり、痛手です。
 おめでとう CONGRATULATIONS と皮肉が表示されます
星に命中すると、宇宙基地を破壊し、ゲームの勝敗には影響がないので、無駄弾です。
くそー SILLY と毒づきます。
いずれかにも当たらず、区画外に出ると、外れです。
(5)フェーザ Phaser
エネルギービームを発射して、クリンゴン艦を攻撃します。
)光子魚雷と異なり、クォドラン内にいる複数のクリンゴン艦を同時に攻撃がします。
発射するエネルギー量を指定します。
エンタープライズ号からクリンゴンまでの距離に応じて、
ビームのエネルギーは減衰します。
運が良ければ、すべてのクリンゴン艦が一斉に破壊されるが、遠くにいるクリンゴン艦は破壊されないこともある。
(6)シールド Shield
クリンゴン艦からの攻撃を防御します。
シールドに回すエネルギーを指定します。
周囲にクリンゴン艦がいて、シールドが200以下になると、
SHIELDS DANGEROUSLY LOW と警告が表示されます。
(6)シールド Shield
クリンゴン艦からの攻撃を防御します。
シールドに回すエネルギーを指定します。
周囲にクリンゴン艦がいて、シールドが200以下になると、
SHIELDS DANGEROUSLY LOW と警告が表示されます。

(6)故障報告 Damage Report
機器の故障状況と復旧状況を示します。
(7)コンピュータComputer
以下の機能が使えます。
(7−1)銀河系地図 CUMULATIVE GALACTIC RECORD 
これまでに長距離センサで探査した範囲の状況をまとめてみることができます。
最新の情報ではなく、距離センサで探査した時の情報を蓄積したものです。

(7−2)状況レポート Status Report
残りのクリンゴン数、残りの年数、銀河系内の基地数、各計器の故障状況の確認ができます。
状況は4通りです。
(1) GREEN
正常
(2)
RED
周りにクリンゴン艦がいて、戦闘状態
(3)YELLOW
クリンゴン艦がいないが、
エネルギーが300以下になっている。
(4)DOCKED
宇宙基地にドックインしている。

(7−8)魚雷弾道計算 PHOTON TORPEDO DATA
現在いるクォドラン内のクリンゴンの座標と魚雷のコースを示します。
つまり、短距離センサが使用できなくとも、クリンゴンを攻撃できます。
(9)エネルギー Enegy
ワープエンジンやシールドに使用します。
光子魚雷との間で相互に補充するものもある。
(0)コース設定 Course
1から8までの数字で指定します。
1が右で、反時計回りで周8右下まで 
(1)右
(2)右上
(3)上
(4)左上
(5)左
(6)左下
(7)下
(8)右下
0から360までの角度を指定するものもあります。
私が大学時代に遊んだのもこの方式でした。
45度より小さいから30度かなといい加減に指定しては、無駄弾を撃ってました。

装備の故障と回復
ゲームの進行に応じて、
装備はランダム故障したり回復したりする。

宇宙基地
宇宙基地にドック入りすると、
エネルギーと光子魚雷が補給します。
故障した装備が修理します。
また、宇宙基地には強力なシールドがあり、攻撃されても、ダメージを受けません。

ゲ−ムの開始
初期設定として、下記の値を設定します。
エネルギー量=3000
シールド=200
光子魚雷の数=10
残り日数=30 + クリンゴン艦の総数
各クォドラントに最大⒌個のクリンゴン艦と最大1つの宇宙基地を配置します。
BASIC版では、乱数により、クリンゴン艦を20%の確率で1隻、5%の確率で2隻、2%の確率で3隻、配置します。
下記の指令を表示します。
BASIC版では、3桁の数でひとつのクォドラントの状態をす表します。
3桁の数字は、1桁目がクリンゴンの数、2桁目が基地の数、3桁目が星の数を表します。たとえば 「205」であれば、クリンゴンが2、基地なし、星5個、となります。
3桁の数字を8x8の配列に設定して宇宙全体の状態を表します。

初期設定が終わると、下記を表示します。
PRIYOU MUST DESTROY っx KLINGONS IN xx STARDATES WITH xx STARBASES

ゲ−ムの終了
クリンゴン艦をすべて破壊すると、プレイヤーの勝ちです。
残り日数がなくなるか、エンター−プライズ号が破壊されると、プレイヤーの負けです。
エネルギーが無くなると、ゲームは終了します。
ASIC版では、自動的に再スタートします。
その時は、クリンゴンから攻撃を受け、
最終的には、エンター−プライズ号が破壊され、プレイヤーの負けです。

ゲームの進行
レイヤーがコマンドを選択すると、状況が変化します。
コマンドは
1長距離センサー
2短距離センサー
3 光子魚雷
4フェイザー砲
5シールド
6故障報告
7コンピュータライブラリイ
8 インパルスエンジン
9 ワープエンジン

1 長距離センサー LONG RANGE SENSOR SCAN
、エンター−プライズ号がいるクォドラントを中心に隣接する上下左右斜め9つのクォドラントは探査済となり、三桁の数字、例えば”513″などと表示する。
1桁目はクリンゴン艦の数、2桁目は宇宙基地の数、
3桁目はは星の数を示す。
それ以外のクォドラントは未探索となり、***と表示する。
、エンター−プライズ号がいるクォドラントを中心に隣する9つの
クォドラントの情報が3桁の数字(例えば”513″など)で表示されます。
それ以外のクォドラントは未探索となり、***と表示する。
コンピュータが故障してなければ、クォドラントの情報を銀河系マップにコピーします。

2 短距離センサー SHORT RANGE SENSOR SCAN
セクォドラント内の配置を8x8のマス目に一文字で表示する
E エンタープライズ号
K クリンゴン艦
B 宇宙基地
* 星

あわせて、下記のような状況方法を表示する。
STARDATE 2340
CONDITION RED
QUADRANT 3,7
SECTOR 5,4
ENERGY 3000
PHOTON TORPEDOES 10
SHIELDS 0

光子魚雷 FIRE PHOTON TORPEDOES
コースを入力すると、その方向に飛び、破壊する。
リンゴン艦か、宇宙基地か、星に当たるか、範囲外に出るまで、光子魚雷は直進する。
故障しているか、弾切れの場合は撃てない。
魚雷を発射すると、クリンゴンからの攻撃があります。

コース(方向)の設定
1−8までの8方向を指定する
なお、BASIC版では、9方向が選択できるようだが、残り1方向がよくワカらんskった

1 上
2 右上
3 右
4 右下
5 下
6 左下
7 左
8 左上

コースに応じて、X(横)方向Y(上下)方向の増分が設定される。
例えば、上なら、Xは−1、Yは0となる。
バリエーションとして、角度を入力するものもある。
私が大学時代に遊んだのもこの方式でした。
45度より小さいから30度かなといい加減に指定しては、無駄弾を撃ってました。

4フェイザー砲 FIRE PHASERS
発射するエネルギー量を入力する。
光子魚雷と異なり、すべての方向にエネルギービームを発射し、
セクォドラント内にいる全てのクリンゴン艦にエネルギービームが当たる。
乱数によりランダムに破壊する。
全てのクリンゴン艦を一度の攻撃で破壊することもできる。
BASIC版では、クリンゴン艦にシールドが設置されており、エネルギービームが当たると、シールドのエネルギー量が減少して、ぜロになると、破壊する、というようなコードの断片があった。
また、ビームのエネルギーは、エンタープライズ号とクリンゴン艦の距離に応じて減衰する。

まず、先にクリンゴンからの攻撃があります。
コンピュータが故障中は精度が低下し、ビームのエネルギーが減少します。

8 インパルスエンジン IMPULSE ENGINE
クォドラント内を移動する。
コースと移動距離を入力する。
コースは光子魚雷と同様に方向を選択する。
じ。簡易板では1マスだけ移動する。
移動経路にクリンゴン艦、宇宙基地、星があると、衝突し、
その手前で停止します。
クリンゴン艦と衝突すると、エンターピライズ号とクリンゴン艦の双方にダメージが生じる。
宇宙基地と衝突すると、ドックインしたとみなされ、補給を受ける。
星と衝突しても、何も起きない。
範囲外になると。隣接するクォドラントに移動する。

9 ワープエンジン WARP ENGINE
クォドラント間を移動する。
コースと移動距離 を入力する。
コースは光子魚雷と同様に方向を選択する。
なお、簡易板として、移動距離は入力せずぬ、1マスだけ移動する。
範囲外になると、予定外のクォドラントにランダムに移動する。

ワープする前に、クリンゴンがいた場合はクリンゴンから攻撃される。
また、、20%の確率で計器の故障と修復を行う。

バリエーションとして、ワープエンジンとインパルスエンジンが一体になっているものもある。
BASIC版では、移動距離を0から8までの数字で指定する。
1より大きいと、クォドラント間を移動し、1より小さいと、クォドラント内を移動する。
1以上は、クォドラント間の移動となる。
移動距離に応じて、残り日数が減少し、エネルギーを消費する。
1以下の小数は、1つのクォドラント内の移動となる。
範囲外になるとどこかのクォドラントにランダムに移動する。
予定外のクォドラントに到着
なお、簡易板として移動距離は入力せずぬ、常に1マスだけ移動する。

クリンゴン艦からの攻撃
クォドラント内にクリンゴン艦がいると、戦闘エリアとなり、すべてのクリンゴン艦から攻撃してくる。
武器はエネルギービーム
BASIC版では、1隻につき最大 20ユニット
9撃されると、下記のように表示される。
xx UNIT HIT ON ENTERPRISE AT SECTOR xx,xx
エンタープライズ号のシールドで防御され、シールドのエネルギーは減少する。
シールドのエネルギーが無くなると、エンタープライズ号は破壊され、ゲーム終了となる。

ゲームの難易度
BASIC版では、プレイヤーに有利な設定になっています。
例えば、残り日数はワープしないと減少しないので、
残り日数が無くなって負けることがない。
ゲームの進行に応じて、少ずつ減少すべきかな。

参考
スタートレックのソースを読む


BC 2016 Autumn


16年11月19日に柏の葉キャンパスで開催されたABC 2016 Autumn に横浜支部として展示しました。

協力頂いた Goji さん Criticabug さん、ありがとうございます。
20161119_abc_yokohama

展示1
さくらIoTを経由して収集した温度・湿度などの測定値をカシオのAndroid watchに表示するもの
ソースコードは、GitHubで公開しています。
20161119_abc_yokohama_fab_sensor

さくらIoTの通信モジュールと温度・湿度などのセンサー

20160901_sakura_iot_case_front

droid phone とAndroid watch
20161119_abc_fab_sensor_android-_phone%ef%bc%bfwatch

Android watchの表示部
20161119_abc_fab_sensor_android-watch

展示2
ABC当日に開催されたAndroid Wear アプリコンテストに展示しました。
アプリは、上記のさくらIoTで作ったもの。
20161119_abc_app_contest

展示3
賑やかしでSumobot展示しました。
20161119_abc_sumobot


GPS・QZSS ロボットカーコンテスト 2016


10月23日に 東京海洋大学 で開催された GPS・QZSS ロボットカーコンテスト 2016 を見学しました。

会場は、明治丸の隣の芝のあるグランドです。
会場に着くと 明治丸 がお出迎えしてくれます。
20161022_gis_photo1 20161023_gps_meijimaru

コンテストの内容は、GPS測位による自動運転です。
競技は2種類あり、ダブルパイロンレースと アプリコンテストです。

ダブルパイロンレース
2箇所に置かれたパイロン(位置座標)を8の字に回ります。
14チームが参加しました。
結果は、大きく2つの傾向に分かれました。
なんとか1周できるか・できないかと、何周も安定して周回できるです。
GPS測位はもっと簡単なのかと思いしたが、自分とパイロンの相対位置をうまく判定できない感じです。
GPS測位だけだと点の情報なので、車体がどっち向きになっているかで、操縦の仕方が変わります。
その辺を、コンパスやジャイロを組合せて判定するのですが、これが難しいみたいでした。
20161023_gps_car_1 20161023_gps_car_2 20161023_gps_car_3
20161023_gps_car_4 20161023_gps_car_5

多くの機種は、コントローラとしてマイコンに自作のプログラムを搭載したものを使用していましたが、1つだけドローン用のコントローラ APM 2.6 を使用したものがありました。
これは、コントローラ自身に位置を覚える機能があり、位置を何点か指定すると、自動で周回するそうです。
20161023_gps_aps_1

アプリコンテスト
今回初めての企画です。
車体は、主催者側が用意したものを使います。
参加者は、車体をBluetooth経由で制御するアンドロイド・スマホのアプリを作成します。
7x7のマス目(位置座標)が用意され、当日指定された場所を巡回します。
参加は2チームでした。
結果は、散々なものでした。
1チームは車体が全く動かず、1チームは走り回るだけで目標には到達できなかった。
その理由は、通信の間隔は1秒毎と遅いためです。
通信の間隔に対して、車体の走行速度が速いため、指示が届いた時点では違う場所に居るらしい。
来年もやるそうなので、ぜひ成功するチームが出て欲しいですね。
20161023_gps_app_1 20161023_gps_app_2

最後にお土産として、茄子を頂きました。
20161023_gps_eggplant
当日の様子は、YouTube で公開されています。
3時間あるので、心して見てください。w
なお、最初の25分くらいまで、画面が映らず、音声だけです。


さくら IoT – 温湿度センサー HDC1000


さくら IoT と 温湿度センサー HDC1000 で温湿度を観測する

ハンズオン資料
さくらインターネットから、ハンズオンの資料が公開されています。
http://www.slideshare.net/sakura_pr/ss-64599802

センサーとして HDC1000 を、WebSocket クライアントとして node-red を使っています。
HDC1000 は、秋月電子で販売されています。
HDC1000使用 温湿度センサーモジュール

いくつか気になったことがあります。
(1) HDC1000 の +V を Arduino の 3.3V に接続している。
Arduino は 5V 動作なので、HDC1000 も 5V にすべきでしょう。
(2) node-red のインストールを、すべて root ユーザーで行っている。
yum 以外は、一般ユーザで設定できますね。
(3) node-red での動作確認が WebSocket を受信するところまでです。
これは、時間の関係かもしれないが、もうちょっとやりたいですよね。
WebSocket の受信だけなら、WEBブラウザーでも出来るし。
拙作の javascript 版

今回やったこと
HDC1000 のデータを node-red で受信するところまでは、資料と同じです。
その先として、グラフ表示をしてみました。

環境は、CentOS ではなく、MAC で構築しました。
インストールは、下記を参考にしてください。
brew で node をインストールする
MAC に Node-RED をインストールする
Node-RED でグラフ表示をする

センサ側
HDC1000 を通信モジュールに接続する
20161013_sakura_hdc1000

node-red の処理
WebSocket の受信から、http 出力にする flow がわからなかったので。
いったん、WebSocket で受信したデータをファイルに保存しました。
ファイルを読み出して、http 出力に結びつけました。

Flow
Flow は Github で公開しました。
20161013_sakura_flow

parser
WebSocket で受信したデータを cvs 形式にする
コード parser.js

text
一番新しいデータが、上になるように、逆順に並び替える
コード text.js

temperature、humidity、count
最新の100個のデータを、グラフ形式に変換する
コード temperature.js

結果
20161013_sakura_temperature


Node-RED でグラフ表示をする


Node-RED のグラフ機能として、
Google Chart のノードが提供されています。

他には、下記のようなサービスと連携することでグラフ表示ができるようです。
dashing
freeboard
pubnub
atlasboard

インストール

$ npm install  -g node-red-contrib-googlechart

確認
線グラフを表示します。
データは、Google Chart のもの を使いました。

flow
20161012_nodered_flow

chart の設定
20161012_nodered_chart_setting

function ノードにて、グラフのデータを用意する

msg.payload = [
{Day:1,  Galaxy:37.8, Avengers:80.8, Transformers:41.8},
{Day:2,  Galaxy:30.9, Avengers:69.5, Transformers:32.4},
{Day:3,  Galaxy:25.4,   Avengers:57, Transformers:25.7},
{Day:4,  Galaxy:11.7, Avengers:18.8, Transformers:10.5},
{Day:5,  Galaxy:11.9, Avengers:17.6, Transformers:10.4},
{Day:6,   Galaxy:8.8, Avengers:13.6,  Transformers:7.7},
{Day:7,   Galaxy:7.6, Avengers:12.3,  Transformers:9.6},
{Day:8,  Galaxy:12.3, Avengers:29.2, Transformers:10.6},
{Day:9,  Galaxy:16.9, Avengers:42.9, Transformers:14.8},
{Day:10, Galaxy:12.8, Avengers:30.9, Transformers:11.6},
{Day:11,  Galaxy:5.3,  Avengers:7.9,  Transformers:4.7},
{Day:12,  Galaxy:6.6,  Avengers:8.4,  Transformers:5.2},
{Day:13,  Galaxy:4.8,  Avengers:6.3,  Transformers:3.6},
{Day:14,  Galaxy:4.2,  Avengers:6.2,  Transformers:3.4}
];
return msg;

結果
20161012_nodered_chart

参考
Node-REDで線グラフ
見えるNode-RED!


MAC に Node-RED をインストールする


Node-RED は、ハードウェアデバイス、API、オンラインサービスなどを接続するためのツールです。
ボックスを接続する形式のグラフィックなツールです。
言語は JavaScript です。

Linux、Mac、Windows 環境で動作します。
IBM Bluemix、Amazon Web Services Microsoft Azure などのクラウド環境でも動作します。
node.js が必要です。

MAC へのインストール
(1) node のインストール
brew で node をインストールする

(2) node-red のインストール

$ npm install -g node-red

動作確認
Creating your first flow を試してみます。

flow
20161011_nodered_flow

結果
unixtime 形式の時刻が文字列に変換される
20161011_nodered_debug_1 20161011_nodered_debug_2