• タイトル
    BattleSpace(通信対戦) (電子工作マガジン2016年SUMMER号掲載)

  • 開発環境
    IchigoJamBASIC1.0.1
    IchigoJamBASIC1.1.1
    IchigoJamBASIC1.2.0

  • 内容
    昭和の時代、大海原を舞台に熾烈な戦いが繰り広げられていた。
    長き年を経た現代、その戦いは宇宙へと舞台を移し、今もなお戦いが続いていたのだ。
    (海戦ゲーム、BattleShipゲームと同じルールです)

  • 準備
    このゲーム通信対戦ゲームですので、IchigoJam(ディスプレイ・キーボード)を2台と通信ケーブルを用意してください。
    通信ケーブルはショートしなければ何でも大丈夫と思いますが、私は短く切った単線のLANケーブル(そのうち使用するのは3本)を使用しました。

    IchigoJamの電源を切った状態で、3本の線を下記の様に接続します。(クロス結線)
    TXD - RXD
    RXD - TXD
    GND - GND

  • 注意
    このプログラムは、毎回通信を行いながらゲームが進行していきます。
    操作を間違えると、エラーが出続ける状態になります。
    (いわゆる「ピンポンゲーム」状態)

    IchigoJam AIchigoJam B
    エラー発生
    エラー表示
    エラー文を送信してしまう
    エラー文を受信
    エラー発生
    エラー表示
    エラー文を送信してしまう
    エラー文を受信
    エラー発生
    エラー表示
    エラー文を送信してしまう
    エラー文を受信
    エラー発生
    エラー表示
    エラー文を送信してしまう
    以下、無限ループ

    よって、まだ通信速度は合わせない状態で、それぞれのIchigoJamにプログラムを読み込んでください。(通信速度が異なっているのがベスト)

    この時、誤操作によりエラーが出続けてしまった場合は、[F1]キー(CLRコマンド)を押し続けてください。
    エラー表示が止まります。


  • 開戦
    ます2台の通信速度を合わせるため、それぞれのIchigoJamの電源を入れた後に下記のコマンドを実行してください。(通信環境によってはデフォルトのBPS115200でもプレイ可能です)

    BPS300

    ゲームの進行はターン(順番)制です。
    後攻の人が「RUN」コマンドでプログラムを実行してください。
    先攻の人は「RUN」と入力しなくても、後攻のIchigoJamより実行コマンドが送信され自動的にゲームが開始します。

    画面上部には10マス×10マスのレーダーが2つ表示されています。
    左側はプレイヤーの宇宙ステーションの位置を表すレーダー(YOU)です。
    右側は敵機の位置を表すレーダー(OPPONENT)ですが、スタート時点ではまだ索敵していないため何も表示されていません。

    /■\
    ■■■
    \■/
    
    宇宙ステーションの数はプレイヤー、対戦相手ともに3機で、ゲーム開始時にランダムに配置されます。
    宇宙ステーションは右記の形状をしています。(「2001年宇宙の旅」の宇宙ステーションをイメージしています)

    プレイヤーのターンの時には「YOU」の前に「→」が表示され、対戦相手のターンの時には「OPPONENT」の前に「→」が表示されます。

  • 操作
    「→YOU」と表示されていたらプレイヤーのターンです。(対戦相手には「→OPPONENT」と表示され、受信待機状態になっています)
    対戦相手がいると思われる座標を入力して攻撃します。

    「Y=」に縦座標、「X=」に横座標を入力してください。
    座標入力は0~9の数値で、Enterキーは不要です。

    攻撃した結果が、座標値の下には文字で、敵機レーダーにはキャラクタで表示されます。

    結果文字
    表示
    レーダー
    表示
    宇宙ステーションの機関部(「■」)に当たった場合HIT!
    宇宙ステーションの外周部(「/」または「\」)に当たった場合DAMAGE
    外れた場合MISS



    プレイヤーの攻撃とその結果の表示が終わると「→OPPONENT」と表示され対戦相手のターンとなります。キーボードには触れずに対戦相手の攻撃を注視していてください。

    対戦相手の攻撃結果もプレイヤーの攻撃結果と同様に文字とキャラクタで表示されます。
    ただしキャラクタは自機のレーダーに表示されます。

    3機の宇宙ステーションの全ての機関部を攻撃して破壊した方の勝ちです。

  • プログラムのしくみ
    PRINT文を実行すると表示された文字がシリアルポートにも出力される機能、およびシリアルポートからの入力をINKEY文で受け取れる機能を利用して、2台のIchigoJam間の通信を行っています。

    そのため、通信以外にPRINT文を使用できないので、画面表示は全てPOKE文を使用しています。
    画面表示にPOKE文を使用するにあたり、メモリ節約のためアスキーコードが99以下のキャラクタを多用しています。

    自ターンのキー入力待ち、敵ターンの受信待ちともにINKEY文を使用しているため、敵ターンの時にキー操作を行ってしまうと、コマンドを受信したものとして処理してしまうため誤動作します。

    各行の処理
    10行
    20行
    30行
    40行
    50行
    60行
    70行~90行
    100行
    110行~140行
    150行
    160行
    900行
    
    コメント(ファイル名)
    対戦相手(先攻側)にプログラム実行コマンドを送信
    IchigoJam1.1.1以後の画面制御コードの出力を抑制
    自機の配置と表示
    初期画面作成
    自ターンの座標入力と通信相手からの攻撃結果待ち
    通信相手からの結果を表示
    敵ターン。通信相手からの攻撃待ち
    敵ターンの攻撃結果の表示と送信
    勝敗の表示
    END
    キー入力待ちサブルーチン
    

    変数表
    I
    S
    J
    X
    Y
    K
    R
    C
    D
    P
    K
    
    ループ用
    先攻・後攻フラグ(先攻=0/後攻=1)
    自機配置用アドレス
    x座標
    y座標
    入力した数字
    受信した数字
    自レーダーに表示する(表示されている)キャラクタコード
    敵レーダーに表示するキャラクタコード
    HITした数
    HITされた数
    

    IchigoJam1.1.1以後は、PRINT文以外にLOCATE文やCLS文等も画面制御コードをシリアルポートに送信するようになっているので、30行のUART1にて画面制御コードの出力を抑制しています。
    これはFaceBookのIchigoJamFanグループで教えていただきました。ありがとうございました。

  • プログラムの改造
    プログラムサイズを小さくすれば、攻撃時のメッセージの種類や文言を変更できると思います。
    (行番号の増分を+1にしたり、IchigoJam1.1.1ならGOSUBの短縮形を使用するなど)

BattleSpace(Ichigojam v1.0,v1.1)
10 'BattleSpace(BPS300)
20 ?"CLV:GOTO30":CLV:S=1
30 IFVER()>11000UART1
40 CLS:FORI=0TO2:X=RND(8)+2:Y=RND(8)+2:J=#900+Y*32+X:IFPEEK(J-32)+PEEK(J-1)+PEEK(J)+PEEK(J+1)+PEEK(J+32)<>0I=I-1:NEXTELSEPOKEJ-33,#9D,1,#9C:POKE(J-1),1,1,1:POKE(J+31),#9C,1,#9D:NEXT
50 FORI=48TO57:POKE#8D1+I,I:POKE#320+I*32,I:POKE#8E1+I,I:POKE#330+I*32,I:NEXT:POKE#A84,89,79,85:POKE#A92,79,80,80,79,78,69,78,84:IFSGOTO100
60 LC0,14:?CHR$(12):POKE#A83,29:POKE#A91,0:POKE#AC0,89,61:GOSUB900:Y=K:LC3,14:?Y:POKE#AE0,88,61:GOSUB900:X=K:LC3,15:?X:GOSUB900:R=K:LC1,17:IFR=1?"HIT!":C=15:P=P+1
70 IFR=2?"DAMAGE":C=144
80 IFR=3?"MISS":C=45
90 POKE#931+Y*32+X,C:WAIT60:IFP=15GOTO150
100 POKE#A83,0:POKE#A91,29:GOSUB900:Y=K:POKE#AD0,89,61,Y+48:GOSUB900:X=K:POKE#AF0,88,61,X+48
110 WAIT90:A=#921+Y*32+X:C=PEEK(A):LC17,17:IFC=1?"1 HIT!":D=15:T=T+1
120 IFC=#9CORC=#9D?"2 DAMAGE":D=144
130 IFC=0?"3 MISS":D=45
140 POKEA,D:IFT<15WAIT90:GOTO60
150 POKE#B60,89,79,85:IFP=2POKE#B64,87,73,78,33ELSEPOKE#B64,76,79,83,69
160 END
900 K=INKEY()-48:IFK<0ORK>9GOTO900ELSERETURN


BattleSpaceト(Ichigojam v1.2) (動作未確認)
10 'BattleSpace(BPS300)
20 ?"CLV:GOTO30":CLV:S=1
30 IFVER()>11000UART1
40 CLS:FORI=0TO2:X=RND(8)+2:Y=RND(8)+2:J=#900+Y*32+X:IFPEEK(J-32)+PEEK(J-1)+PEEK(J)+PEEK(J+1)+PEEK(J+32)<>0I=I-1:NEXTELSEPOKEJ-33,#19,1,#1A:POKE(J-1),1,1,1:POKE(J+31),#1A,1,#19:NEXT
50 FORI=48TO57:POKE#8D1+I,I:POKE#320+I*32,I:POKE#8E1+I,I:POKE#330+I*32,I:NEXT:POKE#A84,89,79,85:POKE#A92,79,80,80,79,78,69,78,84:IFSGOTO100
60 LC0,14:?CHR$(12):POKE#A83,29:POKE#A91,0:POKE#AC0,89,61:GSB900:Y=K:LC3,14:?Y:POKE#AE0,88,61:GSB900:X=K:LC3,15:?X:GSB900:R=K:LC1,17:IFR=1?"HIT!":C=15:P=P+1
70 IFR=2?"DAMAGE":C=144
80 IFR=3?"MISS":C=45
90 POKE#931+Y*32+X,C:WAIT60:IFP=15GOTO150
100 POKE#A83,0:POKE#A91,29:GSB900:Y=K:POKE#AD0,89,61,Y+48:GSB900:X=K:POKE#AF0,88,61,X+48
110 WAIT90:A=#921+Y*32+X:C=PEEK(A):LC17,17:IFC=1?"1 HIT!":D=15:T=T+1
120 IFC=#9CORC=#9DORC=#1AORC=#19?"2 DAMAGE":D=144
130 IFC=0?"3 MISS":D=45
140 POKEA,D:IFT<15WAIT90:GOTO60
150 POKE#B60,89,79,85:IFP=2POKE#B64,87,73,78,33ELSEPOKE#B64,76,79,83,69
160 END
900 K=INKEY()-48:IFK<0ORK>9GOTO900ELSERTN


MixJuiceでのダウンロードURLは下記になります。

BattleSpace(Ichigojam v1.0,v1.1) http://tagiyasoft.blog.jp/battlespace1.bin
BattleSpace(Ichigojam v1.2) http://tagiyasoft.blog.jp/battlespace2.bin(動作未確認)

以下のように入力してD/Lしてください。
NEW
? MJ GET tagiyasoft.blog.jp/battlespace1.bin

ブラウザでD/LしてIchigoJamに転送する場合は、通信ソフトでバイナリ送信をしてください。
(例:TeraTermの場合は、メニューの[ファイル]-[ファイル送信]で当該ファイルを送信します)