SHIROのIchigoJam日記

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

かんたん暗号作成

IchigoJam Advent Calendar 2020」で換字式暗号のネタがあったので、私も簡単なプログラムを作ってみました。
短いプログラムなので、教室でやってみても面白いと思います。

暗号化プログラム

f:id:shiro0922:20201219223904p:plain

  1. 元の文字列をA~Zとスペースで入力します。「”」(ダブルクォーテーション)で囲って入力してください。
  2. 暗号キーの数字を何か決めて入力します。
  3. 暗号化された文字列が表示されます。
10 CLS:?"*** アンゴウカ ***":?
20 FOR I=0 TO 25
30 [I]=I
40 NEXT
50 ?"*モトノモジレツ(A-Z)?"
60 INPUT "",Z
70 INPUT "*キーナンバー?",S
80 SRND S
90 FOR I=1 TO 100
100 A=RND(26):B=RND(26)
110 C=[A]:[A]=[B]:[B]=C
120 NEXT
130 ?:?"*アンゴウ"
140 FOR I=0 TO LEN(Z)-1
150 C=PEEK(Z+I):E=C
160 IF E>64 && E<91 E=[C-65]+65
170 ?CHR$(E);
180 NEXT:?

復号化プログラム

f:id:shiro0922:20201219224212p:plain

  1. 暗号の文字列をA~Zとスペースで入力します。「”」(ダブルクォーテーション)で囲って入力してください。
  2. 暗号キーの数字を入力します。
  3. 元の文字列が表示されます。
10 CLS:?"*** フクゴウカ ***":?
20 FOR I=0 TO 25
30 [I]=I
40 NEXT
50 ?"*アンゴウ(A-Z)?"
60 INPUT "",Z
70 INPUT "*キーナンバー?",S
80 SRND S
90 FOR I=1 TO 100
100 A=RND(26):B=RND(26)
110 C=[A]:[A]=[B]:[B]=C
120 NEXT
130 FOR I=0 TO 25
140 [30+[I]]=I
150 NEXT
160 ?:?"*モトノモジレツ"
170 FOR I=0 TO LEN(Z)-1
180 C=PEEK(Z+I):D=C
190 IF D>64 && D<91 D=[C-35]+65
200 ?CHR$(D);
210 NEXT:?

プログラムの説明

換字式(かんじしき)暗号は、例えば「A」~「Z」のアルファベット26文字だったら、それらを別のアルファベットに変換する暗号です。
f:id:shiro0922:20201219230518p:plain
※文字を変換する換字表の一例。ここでの「S」のように、たまたま同じ文字に変換されることもあります。
このプログラムでは「A」~「Z」は暗号化されますが、それ以外の文字は変換されずにそのまま出力されます。ですので元の文字列にはアルファベット以外の数字や記号が入っても構いません。

ここでは「暗号キー」(キーナンバー)と言っている数字ですが、要はSRND命令のシード(種)の数字を設定しています(80行)。この数字が同じなら、その後にRND関数で出てくる乱数は必ず同じになり、作られる換字表も同じになります。
換字表の作り方は、最初に20~40行でA~Zの26文字(0~25の数字)が順番に並んだ表を配列変数[0]~[25]に作り、90~120行で「乱数で2個の配列変数を取り出してその値を交換する」を100回くり返して、ランダムな換字表にしています。
(復号化プログラムでは逆引きの換字表が必要なので、さらに130~150行で[30]~[55]に逆引きの換字表を作っています)
それ以降は2つともほぼ同じプログラムで、換字表を元に1文字ずつ変換しています。

フルカラーLEDマトリックスで連打ゲーム

★この記事は「IchigoJam Advent Calendar 2020」にエントリーしています。

フルカラーLED・WS2812Bの5×5=25個マトリックスを入手したので、先日やったmicro:bit v2と同じように連打ゲームを作ってみました。
動画はこちら。

f:id:shiro0922:20201216221012j:plain

LEDマトリックスamazonで入手しました。

裏面に単芯線(0.65mm)をはんだ付けして、IchigoJamのソケットにつなぎます。
f:id:shiro0922:20201216204310j:plain

WS2812B IchigoJam
VCC VCC
GND GND
IN LED

プログラム

10 @ARUN:'*Renda25
20 CLV:VIDEO 0:W=30
30 WS.LED 25
40 LET [80],#3F,#7E,#1F,#00,#B7,#76,#BF,#56,#9F,#1C
50 LET [90],#BD,#5E,#BD,#7E,#1F,#1E,#BF,#7E,#BF,#5E
60 FOR N=3 TO 1 STEP -1
70 GSB @PRTN
80 BEEP
90 WAIT 58
100 NEXT
110 [0]=0
120 COPY #801,#800,149
130 WS.LED 25
140 FOR L=0 TO 24
150 [L*3+L/10]=W
160 NEXT
170 WS.LED 25
180 CLT
190 FOR L=0 TO 24
200 IF !BTN() CONT
210 IF BTN() CONT
220 BEEP
230 [L*3+L/10]=0
240 WS.LED 25
250 NEXT
260 BEEP 10,30
270 WAIT 30
280 T=TICK()
290 N=(T/60)%10
300 [12]=W
310 GSB @PRTN
320 WAIT 60
330 N=T%60/6
340 [12]=0
350 GSB @PRTN
360 IF BTN() RUN ELSE CONT
370 @PRTN
380 D=[80+N*2]:E=[81+N*2]
390 FOR B=0 TO 7
400 [30+B*3]=D%2*W
410 [54+B*3]=E%2*W
420 D=D/2:E=E/2
430 NEXT
440 WS.LED 25
450 RTN

フルカラーLEDが25個あるので、配列変数[0]~[74]はその点灯用。せっかくフルカラーなので、25個のドットもRGBで表示してみました(140~160行)。
配列変数[80]~[99]は、40~50行で数字フォントデータ(5行3列=15ビット→2バイト、「0」~「9」で10文字分)を設定しています。
数字表示は表示サブルーチン(370~450行)で、フォントデータ配列を1ビットずつ読み出しながら表示用配列に値を設定して、WS.LEDコマンドで表示しています。小数点は別に処理しています(300行、340行)

その後

emerge+さんのアクリルパネルが手持ちにあったので、IchigoJamをTに変えて配線を固定して、電池も付けて携帯できるようにしてみました。

通信対戦・後出しジャンケン

★この記事は「IchigoJam Advent Calendar 2020」にエントリーしています。

IchigoJam×2台をつないで、通信対戦するゲームです。
今回はIchigoDyhook+IchigoDakeを2セット用意して、ケーブルでつないで対戦してみます。
(TX-RX、RX-TX、GND-GNDと3本のケーブルでつなぎます)
f:id:shiro0922:20201212171817j:plain

遊び方

  • 2台の片方で先手用、もう片方で後手用のプログラムを実行します。先手側は「ジブンノバン」、後手側は「アイテノバン」と表示されます。

f:id:shiro0922:20201212171843j:plain
f:id:shiro0922:20201212171901j:plain

  • 先手側は、自分が出す手を「グー・チョキ・バー」の3つから選んで、数字キーの1~3のどれかを押します。

f:id:shiro0922:20201212171946j:plain

  • 後手側には、先手側の手が送られて来ます。その手を見て、それに勝つ手を3秒以内に入力してください。入力できれば「カッタ!」と表示されて自分の番になります。

f:id:shiro0922:20201212171953j:plain

  • 3秒以内に入力できなかったり、勝てない手を入力してしまったりすると、ゲームオーバーです。

f:id:shiro0922:20201212172434j:plain

  • 攻守交替して、今度は後手側が自分の手を入力して、先手側へ送信します。どちらかがゲームオーバーになるまで続けます。
    片方がゲームオーバーになっても、もう片方はプログラムが止まらないので、ESCキーでプログラムを止めてください。
    またプレイしたい時は、両方で「RUN」でプログラムを実行します。

プログラム

先手用(プログラム1)

10 '*JANKEN-1
20 UART 0:CLS
30 LET [1],"グー","チョキ","パー"
40 @LOOP
50 ?:?"---ジブン ノ バン---"
60 ?"1グー 2チョキ 3パー =?";
70 @INM
80 M=INKEY():IF !M CONT
90 M=M-48
100 IF M<1 OR M>3 GOTO @INM
110 ?STR$([M])
120 UART 9:?M:UART 0
130 ?:?"---アイテ ノ バン---"
140 @INA
150 A=INKEY():IF !A CONT
160 A=A-48
170 ?"アイテ=";STR$([A])
180 ?"1グー 2チョキ 3パー =?";
190 CLK:CLT
200 @INK
210 K=INKEY()
220 IF TICK()>180 GOTO @GOVER
230 IF !K GOTO @INK
240 K=K-48
250 IF K<1 OR K>3 GOTO @INK
260 ?STR$([K])
270 IF A=1 A=4
280 IF A-K!=1 GOTO @GOVER
290 BEEP
300 ?"カッタ!"
310 GOTO @LOOP
320 @GOVER
330 BEEP 30,30
340 ?:?:?"***ゲームオーバー***"

後手用(プログラム2)

10 '*JANKEN-2
20 UART 0:CLS
30 LET [1],"グー","チョキ","パー"
40 @LOOP
50 ?:?"---アイテ ノ バン---"
60 @INA
70 A=INKEY():IF !A CONT
80 A=A-48
90 ?"アイテ=";STR$([A])
100 ?"1グー 2チョキ 3パー =?";
110 CLK:CLT
120 @INK
130 K=INKEY()
140 IF TICK()>180 GOTO @GOVER
150 IF !K GOTO @INK
160 K=K-48
170 IF K<1 OR K>3 GOTO @INK
180 ?STR$([K])
190 IF A=1 A=4
200 IF A-K!=1 GOTO @GOVER
210 BEEP
220 ?"カッタ!"
230 ?:?"---ジブン ノ バン---"
240 ?"1グー 2チョキ 3パー =?";
250 @INM
260 M=INKEY():IF !M CONT
270 M=M-48
280 IF M<1 OR M>3 GOTO @INM
290 ?STR$([M])
300 UART 9:?M:UART 0
310 GOTO @LOOP
320 @GOVER
330 BEEP 30,30
340 ?:?:?"***ゲームオーバー***"

先手用と後手用は、手の入力や送受信の順番が違うだけで、ほぼ同じプログラムです。

中学校では2021年度から新学習指導要領が施行されて、技術科のプログラミング単元で、これまでの「計測と制御のプログラミング」に加えて「ネットワークを介した双方向通信のプログラミング」をやることになっています。
それを受けて、数年前からIchigoJamを使った双方向通信のプログラミングを、中学校での出張授業で試しています。
その教材の1つとして「ラス1ババ抜きゲーム」を以前に作ったのですが、
www.ichigojaman.jp
実際に授業でやってみた所、中学生のウケが今一つでした。(と言うより、最後まで入力できた子が少なかった)
もうちょっとわかりやすいルールの通信対戦ゲームが欲しいと思って、ジャンケンを題材にしたプログラムを作ってみました。
いずれ中学生向けに試してみたいと思います。