1. 目的
  2. 素数をグラフ化するとどうなるのか疑問に思ったので、自由研究課題として素数のレーダーグラフを作成した。
    使用ソフト:LibreOffice

  3. 方法
  4. まず素数を用意するために、下記のマクロプログラムを作成した。
    Sub Main
    dim	sheet as object
    dim	cell as object
    sheet = thiscomponent.sheets(1)
    for x = 2 to 10000
    	for i = 2 to sqr(x)
    		if( (x mod i )=0 ) then 
    			i=0
    			exit for
    		endif
    	next
    	if( i<>0) then
    		cell = sheet.getCellByPosition(0,y)
    		cell.value = x
    		y=y+1
    	endif
    next
    End Sub
    上記のプログラムにより、2以上、10000以下の素数を作成した。
    (2,3,5 ... 9949,9967,9973 : データ数1229個)

  5. 結果
  6. 結果を下記に示す。
    比較のため、対数、平方数についても同様のグラフを作成した。
    (こちらはデータ数を100個とした)



  7. 考察
  8. これらの各グラフを比較すると、素数グラフが最も美しい螺旋形グラフとなった。
    螺旋の形状としては、黄金比を用いた黄金螺旋にも似ている。

    今回はデータを10000以下としたが、時間をかければもっと大きな素数まで作成することができる。もっと多くの素数においても、極端に形状が変形することなく螺旋が続くのか興味深い。

  • タイトル
    UFOキャプチャー(電子工作マガジン2018年SUMMER号掲載)

  • 開発環境
    IchigojamBASIC1.2.1

  • 内容
    UFOを操作してキャラクタをキャプチャ(捕獲)するゲームです。
  • UFOcapture
  • 遊び方
    UFOの横方向と縦方法の移動位置を入力するとUFOがキャラクタを捕獲します。
    キャラクタは1度に7個まで捕獲することができます。
    捕獲したキャラクタは画面右の捕獲エリアに並べて保管されます。
    この時、同じキャラクタを3つ以上並べると並んだキャラクタが消え、得点が得られます。
    多数消し、連鎖消しにより高得点が得られます。

  • 操作方法
    「ヨコ:」と表示されたら、UFOの横方向の移動位置(画面上部の数字)を入力しEnterを押します。
    「タテ:」と表示されたら、UFOの縦方法の移動位置(画面左右の数字)を入力しEnterを押します。
    するとUFOが移動してキャラクタを捕獲します。

  • プログラムのしくみ
    変数表
    [0]~[48]キャラクタの配置
    [50]~[56]捕獲したキャラクタ
    I,Jループ用一時変数
    XUFO移動横位置
    YUFO移動縦位置
    C捕獲配列のキャラクタコード
    D捕獲配列の次のキャラクタコード
    R捕獲配列の同一キャラクタ連続数
    Z捕獲している数
    L連鎖フラグ
    A表示キャラクタの増分
    Sスコア

    各行の処理
    1行初期画面表示
    2行UFO移動位置の入力
    3行UFO左移動、捕獲アニメーション、捕獲配列へキャラを転送
    4行捕獲ビーム消去、UFO右移動、捕獲配列のキャラ連続チェック
    5行最上段のキャラチェック、キャラせり上げ、最下段補充
    6行ループ
    7行1段補充&描画
    8行連続キャラ消し、加点
    9行捕獲エリア描画

  • プログラムの具体的な入力方法
    プログラムリスト中の「□」はスペース1個です。(例:「□□□」はスペース3個)
    カードの枠線および、UFOは「左ALT+(SHIFT)+キー」で入力します。
    左ALT+SHIFT+H
    左ALT+SHIFT+I
    左ALT+SHIFT+Q
    左ALT+SHIFT+R
    左ALT+0(ゼロ)
    左ALT+8
    左ALT+1

  • プログラムの改造
    現時点で空きメモリが0バイトなので改造は難しいと思いますが、1行目の枠線表示をしないようにすれば、メモリに空きができるので改造がしやすくなります。
    7行のRND文で表示キャラクタを決めています。キャラクタの種類を増減したい場合は、RND文の"6"を増減してください。別のキャラクタを表示するようにするには"235"を変更してください。
    UFOの移動アニメーション速度を変更したい場合は、WAIT文(5ヶ所)の数値を変更してください。

  • プログラム
    1 cls:clv:fori=0to6:j=i*2:LC0,j+6:?i;"│":lc17,j+6:?"│";i,"□□│□□□│":?"□│":lc17,j+7:?"│□□□□□│□□□│":lcj+3,0:?i:gsb7:next:lc0,19:?"□└---------------┘□□□□□└---┘"
    2 lc20,0:?"SCORE:";s:lc0,20:?chr$(12):input"ヨコ:",x:input"タテ:",y:x=abs(x%7):y=abs(y%7)
    3 fori=10toxstep-1:lci*2+4,2:?"□□□":lci*2+2,2:?"←○→":wait9:next:lcx*2+3,4:?"^":fori=0toy:lcx*2+3,i*2+6:?"^":wait9:next:fori=yto0step-1:c=[i*7+x]:ifc[56-z]=c:[i*7+x]=0:z=z+1
    4 lcx*2+3,i*2+6:?chr$(0):wait9:next:lcx*2+3,4:?chr$(0):fori=xto11:lci*2,2:?"□□□":lci*2+2,2:?"←○→":wait9:next:gsb9:c=[50]:r=0:l=0:fori=1to7:d=[50+i]:ifd=cr=r+(c!=0)elsec=d:gosub8:r=0
    5 next:fori=0to6:i=i+[i]:next:ifi<7fori=0to6:forj=0to6:[i*7+j]=[i*7+j+7]:lcj*2+3,i*2+6:?chr$([i*7+j]):next:next:gsb7
    6 goto2
    7 forj=0to6:[i*7+j]=rnd(6+a)+235:lcj*2+3,i*2+6:?chr$([i*7+j]):next:rtn
    8 ifr<2rtnelse:forj=i-1to0step-1:[50+j]=[49+j-r]*(j-r>0):next:i=0:z=z-r-1:s=s+r*r*5/20*10+l*20:l=1:a=s/100
    9 forj=0to6:lc25,j*2+6:?chr$([50+j]):wait5:next:if![49]rtnelselc25,4:?chr$([49]):lc0,21:?chr$(12);"GAME OVER"
    

    MixJuiceでのダウンロードURLは下記になります。
    UFOcapture http://tagiyasoft.blog.jp/UFOcapture.bin

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

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

  • チェックサムプログラムとは
    「マイコンゲームの本 3」掲載の「チェック・サム プログラム」の項より引用します。

    チェック・サムとは
    ダンプリストを見ながらマシン語を打ち込む場合、打ち込みミスなどから、何度もリストとにらめっこしなくてはなりません。そのたびにリストの最初から最後まで調べるのでは、2回もやれば、よぼど根性のある人でもいやになります。
    そんなとき、プログラム(データ)をいくつかのブロックに分けて、そのブロック無いの数値を全部足した値をリストに付けておけば、そのリストを打ち込んだ人は、ブロックごとの数値を足してリストに付いている数値と比べればどのブロックが違っているか人目でわかります。後はそのブロックについてのみ、調べればよいことになります。

    すなわち、機械語プログラムを手入力する際、入力ミスを見つけやすくするための方法の一つとして、チェックサムという方法が使われていました。

  • 機械語プログラムについて dumplist
    右の写真は、ダンプリスト(機械語プログラムリスト)の例です。
    1970~80年代のマイコン雑誌には、このようなダンプリストが何ページにも渡って掲載され、プログラムによっては、全てを1文字の間違いもなく入力しないと正しく実行されませんでした。
    (実際はデータ部や変数部があるので「1文字も間違いなく」というのは正しい表現ではありませんが)
    まだインターネットはおろかパソコン通信ですら一般的ではなかったため、マイコン雑誌に掲載されたプログラム(主にゲーム)で遊ぶには、プログラムを入力するか、雑誌社の販売するカセットテープを買うしかありませんでした。
    (昨今ではコードの手入力を「写経」と呼ぶそうですが)

    現在はプログラムの投稿雑誌は姿を消し、雑誌のプログラムを手入力することはほとんど無くなりました。

  • BASICマガジンの復活で
    しかし、近年、BASICマガジンが復活したことで、雑誌に機械語リストが載ることが出てきました。
    そこで機械語プログラムの入力補助ツールとして、チェックサムプログラムを作ることにしました。

  • 仕様
    今回作ったチェックサムプログラムはIchigoJam用です。
    現在のIchigoJamの仕様では、機械語プログラムが可能なエリアが、最大で#700~#1001の約2KBになります。
    ですので、横サムのみ表示し、縦サムは省略しました。
    横サムは8バイトのサム(合計値)の下位1バイトを表示します。
    このサム値をソースリストに添付のサム値と照合して入力間違いを探します。

  • プログラムリスト
    プログラムは16進表示とBASE16のキャラクタ表示の2種類です。

    1行プログラムになっていますので、プログラムを入力(環境によっては貼り付け)後にEnterすれば、チェックサムプログラムが実行されます。
    保存しておきたい場合は、行頭に行番号を付けてSAVEしてください。

    チェックサムプログラム(16進表示)
    input"start address ",t:input"end address ",e:fora=ttoestep8:?hex$(a,3);:s=0:forx=0to7:v=peek(a+x):?" ";hex$(v,2);:s=(s+v)&#FF:next:?" :";hex$(s,2):next
    

    チェックサムプログラム(BASE16キャラクタ表示)
    input"start address ",t:input"end address ",e:fora=ttoestep8:?hex$(a,3);:s=0:forx=0to7:v=peek(a+x):?" ";chr$(64+(v>>4)&#F);chr$(64+v&#F);:s=(s+v)&#FF:next:?" :";hex$(s,2):next

  • チェック例
    下記のプログラムをチェックしてみます。
    (以前、BASE16の説明用に作ったプログラムです)

    1. プログラムの公開方法
      プログラムを公開する場合に、下記の様にチェックサムを併記します。

      サンプルプログラム
      10 poke #700,#0b,#22,#12,#02,#df,#32,#50,#18,#20,#30,#03,#78,#f0,#2b,#05,#d0,#20,#38,#03,#78,#f0,#2b,#01,#d0,#20,#30,#03,#70,#01,#3a,#10,#0a
      20 poke #720,#08,#28,#f0,#d1,#52,#18,#01,#20,#00,#23,#13,#54,#01,#30,#21,#28,#fb,#d1,#70,#47
      80 cls:x=15
      90 lc x,15:?chr$(#f0)
      100 k=inkey()
      110 if k!=0 then lcx,15:?" ":x=x+((k-1)%3-1)
      120 lc rnd(33),0:?"*"
      130 a=usr(#700,0)
      140 goto90
      
      チェックサム
      700 : BA
      708 : BB
      710 : BF
      718 : 18
      720 : 7C
      728 : 04
      730 : A1
      (チェックサム作成プログラムは後述します)

    2. プログラムのチェック方法
      プログラムを入力した後、POKE文のみ実行します。
      やり方としては、
      1. POKE文の後ろに"END"を付けて実行する。
        (上記例では「30 END」を追加する)
      2. まず、POKE文のみを入力して実行する。
      などの方法が考えられます。

      次にチェックサムプログラムを実行します。
      (BASE16エンコードされている場合は、BASE16キャラクタ表示版のプログラムを実行します)

      実行結果
      start address #700
      end address #733
      700 0B 22 12 02 DF 32 50 18 :BA
      708 20 30 03 78 F0 2B 05 D0 :BB
      710 20 38 03 78 F0 2B 01 D0 :BF
      718 20 30 03 70 01 3A 10 0A :18
      720 08 28 F0 D1 52 18 01 20 :7C
      728 00 23 13 54 01 30 21 28 :04
      730 FB D1 70 47 D6 10 38 00 :A1
      

      左端の3桁はアドレス、次に8バイトのメモリダンプ、右端がサム値になります。
      右端のサム値と、公開されているサム値を照合します。
      違いがあった場合は、該当する範囲のアドレス内容に違いがありますので、入力したプログラムリストを見直してください。

      ※注意
      最終行のサム値(上記例では#730~#737番地)は正しくない場合があります。
      1行プログラムにした仕様上の問題点ですので御了承ください。

  • 機械語プログラムにチェックサムを付けて公開する方へ
    メモリ内に機械語プログラムがある状態で、下記のプログラムを実行します。

    チェックサム作成プログラム
    input"start address ",t:input"end address ",e:fora=ttoestep8:?hex$
    orx=0to7:v=peek(a+x):s=(s+v)&#FF:next:?" : ";hex$(s,2):next

    実行するとチェックサムが作成されますので、プログラムリストに併記して公開してください。

↑このページのトップヘ