SHIROのIchigoJam日記

マイコン「IchigoJam」(イチゴジャム)の電子工作とプログラミングをメインに

潜水艦ゲーム・通信対戦

先日公開した「潜水艦ゲーム」の通信対戦バージョンです。
IchigoJam×2台で通信して遊びます。

f:id:shiro0922:20200414180734j:plain

f:id:shiro0922:20200414180757j:plain

写真ではMixJuiceを載せたIchigoJam×2台でプレイしています。
こちらにあるように、片方のIchigoJamをサーバー、もう片方をクライアントとして、TCPプロトコルで通信できるようにしておいてください。

なおMixJuiceが無い場合は、2台のIchigoJamのTXD・RXD端子を有線でクロス接続しても遊べます。

IchigoJam IchigoJam
TXD RXD
RXD TXD
GND GND

遊び方

  • 5×5の海域内で、自分の潜水艦「S」を操作して、海中に潜む相手の潜水艦を撃破します。相手の潜水艦は見えません。
  • 海域マップの下に、ソナーで探知した相手潜水艦との距離(縦座標の差+横座標の差)が表示されます。この数字を頼りに行動してください。
  • サーバー機が先手、クライアント機が後手です。上下左右のカーソルキーで潜水艦を移動してください。2個同時押しで斜め移動もできます。
  • スペースキーを押しながらカーソルキーを押すと、その方向の隣りの海域に攻撃します。(魚雷か爆雷だと思ってください)
  • 相手の潜水艦に攻撃が当たった場合、または自分から相手の潜水艦に当たった場合(体当たり攻撃)は、あなたの勝ちです。
  • 反対に、相手の潜水艦から攻撃を当てられた場合、または相手の潜水艦から体当たりされた場合は、あなたの負けです。

プログラム

サーバー機

1 'SUBMARIN-S
2 CLV:VIDEO 3:UART 0,0
3 X=0:Y=0:[X+Y*5]=1
4 A=4:B=4:[A+B*5]=2
5 GSB 46
6 LC 0,8:?"COMMAND?"
7 WAIT 6:T=BTN(32)
8 U=X-BTN(28)*(X>0)+BTN(29)*(X<4)
9 V=Y-BTN(30)*(Y>0)+BTN(31)*(Y<4)
10 IF U=X AND V=Y GOTO 7
11 Z=X+Y*5:W=U+V*5
12 IF T GSB 43 ELSE GSB 34
13 UART 9,0
14 ?CHR$(32+W+T*32)
15 UART 0,0
16 IF [W]&3+T=3 GOTO 30
17 WAIT 100
18 GSB 46
19 CLK:UART 0,1
20 K=INKEY():IF !K CONT
21 UART 0,0:C=INKEY()
22 K=K-32
23 T=K/32:W=K-T*32
24 V=W/5:U=W%5
25 Z=A+B*5
26 IF T GSB 43 ELSE GSB 38
27 IF [W]&3+T*2=3 GOTO 32
28 WAIT 100
29 GOTO 5
30 LC 0,9:?"YOU WIN!"
31 CLK:END
32 LC 0,9:?"YOU LOSE"
33 CLK:END
34 [Z]=[Z]&#FFFE
35 X=U:Y=V:[W]=[W]|1
36 GSB 46
37 RTN
38 LC 0,8:?"ENEMY MOVE..."
39 [Z]=[Z]&#FFFD
40 A=U:B=V:[W]=[W]|2:GSB 53
41 IF [W]=3 GSB 43
42 RTN
43 LC U,V:?CHR$(244)
44 BEEP 30,10:WAIT 30
45 RTN
46 CLS:C=0
47 FOR I=0 TO 4
48 FOR J=0 TO 4
49 IF [C]&1 ?"S"; ELSE ?".";
50 C=C+1
51 NEXT:?
52 NEXT
53 D=ABS(X-A)+ABS(Y-B)
54 LC 0,6:?D
55 RTN

クライアント機

1 'SUBMARIN-C
2 CLV:VIDEO 3:UART 0,0
3 X=4:Y=4:[X+Y*5]=1
4 A=0:B=0:[A+B*5]=2
5 GSB 46
6 CLK:UART 0,1
7 K=INKEY():IF !K CONT
8 UART 0,0:C=INKEY()
9 K=K-32
10 T=K/32:W=K-T*32
11 V=W/5:U=W%5
12 Z=A+B*5
13 IF T GSB 43 ELSE GSB 38
14 IF [W]&3+T*2=3 GOTO 32
15 WAIT 100
16 GSB 46
17 LC 0,8:?"COMMAND?":CLK
18 WAIT 6:T=BTN(32)
19 U=X-BTN(28)*(X>0)+BTN(29)*(X<4)
20 V=Y-BTN(30)*(Y>0)+BTN(31)*(Y<4)
21 IF U=X AND V=Y GOTO 18
22 Z=X+Y*5:W=U+V*5
23 IF T GSB 43 ELSE GSB 34
24 UART 9,0
25 ?CHR$(32+W+T*32)
26 UART 0,0
27 IF [W]&3+T=3 GOTO 30
28 WAIT 100
29 GOTO 5
30 LC 0,9:?"YOU WIN!"
31 CLK:END
32 LC 0,9:?"YOU LOSE"
33 CLK:END
34 [Z]=[Z]&#FFFE
35 X=U:Y=V:[W]=[W]|1
36 GSB 46
37 RTN
38 LC 0,8:?"ENEMY MOVE..."
39 [Z]=[Z]&#FFFD
40 A=U:B=V:[W]=[W]|2:GSB 53
41 IF [W]=3 GSB 43
42 RTN
43 LC U,V:?CHR$(244)
44 BEEP 30,10:WAIT 30
45 RTN
46 CLS:C=0
47 FOR I=0 TO 4
48 FOR J=0 TO 4
49 IF [C]&1 ?"S"; ELSE ?".";
50 C=C+1
51 NEXT:?
52 NEXT
53 D=ABS(X-A)+ABS(Y-B)
54 LC 0,6:?D
55 RTN