• タイトル
    人工無脳おいちょかぶ (電子工作マガジン2016年SPRING号掲載)

  • 開発環境
    IchigoJamBASIC1.1.0

  • 内容
    今から30年くらい前のことですが、ふと「『思考』とは、『過去の経験』に基づき、『判断』すること」ではないだろうか、という仮説を立てました。
    そこで、過去の勝敗経験を勝負に反映させられるようなゲームを作ってみました。
    当時N88BASICで作ったプログラムを、記憶を元にIchigoJam向けに簡素化して移植しました。
    ちなみに、AIと言っても人工知能(artificial intelligence)ではなく、このプログラムにおいては人工無脳(artificial idiot)ですのでお間違いなく。

  • 楽しみ方
    このゲームは勝敗を楽しむのではなく、マイコンの勝敗経験の蓄積と、経験の積み重ねによって少しずつマイコンが強くなっていく過程を温かく見守るゲームです。
    人間とマイコンで勝負を続けて育てるのも良し、友達が育てたデータと対戦してみたり、友達が育てたデータとあなたが育てたデータを足してみるのも良いかと思います。
    大体、50試合ぐらい勝負すると(教育すると)、だんだんとCOM側に「勝ちパターン」が反映してきます。

  • 操作方法
    ルールは「おいちょかぶ」とほぼ同じです。
    1枚もしくは2枚のカードを合計した数が大きい方が勝ちです。ただし、合計数が10を超えた場合は1の位の数字だけで勝負します。
    よって、0が最も弱く、9が最も強い数になります。

    1. まず、それぞれにカードが1枚配られます。
    2. ユーザーは配られた数を見て、もう1枚取るか、そのまま勝負するかを決めてください。
    3. 次にマイコンが、過去の勝敗経験から2枚目のカードを取るか判断します。
    4. プレイヤーとマイコンの数を比較し勝敗が決定します。
    5. マイコンは勝負の結果を記録し、画面下に一覧を出力します。

  • プログラムのしくみ
    50行目のR=RND(20)はマイコンの「気まぐれ」の発生です。
    AIや遺伝的プログラムには「突然変異」を加味しないとデータに偏りが出てしまうので、このプログラムでは1/20の確率で「気まぐれ」を起こすようにしています。
    #FE0(4064)以後の領域は、マイコンの勝敗データの記録エリアで、POKE文により勝敗データを記録しています。
    なお、勝敗記録は1バイト単位になっていますので、255回以上勝つ(または負ける)と、データが0に戻ってしまいます。

  • プログラムの具体的な入力方法
    110行目の「SAVE(保存番号):END」は、ゲーム終了時にプログラムリストと一緒に勝敗記録を保存するための命令です。
    これにより次回LOADした時にプログラムリストと一緒に勝敗記録が読み込まれます。
    上書きされますので、保存先プログラム番号は適宜変更してください。

  • 勝敗データのメンテナンス
    130行目は、勝敗データを表示あるいは手入力するためのプログラム部分です。
    もし何らかの原因で勝敗データが消えてしまった場合や、新たにデータを記憶させたい時(プログラムを改造した時や、友達が育てたデータを使ってみたい時など)に使用してください。
    「GOTO130」とすると、「DATA Read=1/Write=0」と聞いてくるので、勝敗データを表示させたい場合は「1」、勝敗データを手入力する時は「0」と入力してください。
    データの入力順番は「使用メモリ表」の通りです。

  • 改造注意!
    このプログラムは、プログラム領域にデータを保存しているため、改造等でプログラムが大きくなりすぎるとデータを破壊し、あるいはプログラム自身を破壊してしまいます。
    ?FREE()で、残り25バイト程度を上限にしておいた方が無難です。

  • プログラムの改造
    勝敗判定のうち「引き分け」は「勝ち」として記録していますので、これを「負け」として記録するように変更すると、用心深い性格(?)に変わります。
    また50行目のR=RND(20)の数値で「気まぐれ」の発生率を決めていますので、この数値を小さくすると気まぐれな性格になり、この数値を大きくすると慎重な性格になります。

変数表>
T良く使う数字(10)
Iループ用
X,Yプレイヤーのカードの数
Zプレイヤーが勝負する数
Mプレイヤーがもう1枚取るか
C,Dマイコンのカードの数
Eマイコンが勝負する数
W勝負する数でマイコンが勝った回数
L勝負する数でマイコンが負けた回数
K勝負する数でマイコンが勝つ確率
R気まぐれ確率
Uデ-タ表示/入力選択
Sデ-タ手入力用変数
Aデータ収納アドレス(A-1のアドレスは試合回数)

使用メモリ表(合計21バイト)
#FE0-1総試合数
#FE0+10の時に勝った回数
#FE0+99の時に勝った回数
#FE0+100の時に負けた回数
#FE0+199の時に負けた回数

人工無脳おいちょかぶ
10 'aiオイチョカブ
20 CLV:T=10:A=#FE1
30 CLS:X=RND(T):?"YOU",X:Y=0:C=RND(T):?"COM",C:D=0:LC0,5:INPUT"モウ 1マイ トリマスカ?(Yes=1/No=0) ",M:IFMY=RND(T):LCT,0:?Y
40 Z=(X+Y)%T:W=PEEK(A+C):L=PEEK(A+T+C):K=W*100/(W+L+(W+L=0))
50 WAIT60:LC0,8:?C,"ノ ショウリツ=";K;"%":?:WAIT60:R=RND(20):IFK<50?"モウ 1マイ";:IFR>0GOTO70ELSEWAIT60:?" ...ヤメタ":GOTO80
60 ?"イラナイ";:IFR>0GOTO80ELSEWAIT60:?" ...ヤッパリ トル"
70 WAIT60:D=RND(T):LCT,1:?D
80 E=(C+D)%T:POKEA-1,PEEK(A-1)+1:LC0,12:IFE<Z?"COM ノ マケ":I=A+T+E:POKEI,PEEK(I)+1:GOTO100
90 I=A+E:POKEI,PEEK(I)+1:IFE=Z?"ヒキワケ"ELSE?"COM ノ カチ"
100 LC0,16:?"シアイスウ=";PEEK(A-1),"(データアドレス=";HEX$(A-1);")":?"カズ":?"カチ":?"マケ":FORI=0TO9:LC3+I*3,17:?I;:LC3+I*3,18:?PEEK(A+I);:LC3+I*3,19:?PEEK(A+T+I);:NEXT:?:?:INPUT"ツヅケマスカ?(Yes=1/No=0)",S:IFSGOTO30
110 SAVE(保存番号):END
120'メンテナンス
130 CLS:?"メンテナンス モード":A=#FE1:INPUT"DATA Read=1/Write=0:",U:?"データアドレス=";HEX$(A-1):FORI=-1TO19:?I;"=";:IFU?PEEK(A+I):NEXTELSEINPUTS:POKEA+I,S:NEXT
140 END

MixJuiceでのダウンロードURLは下記になります。
人工無脳おいちょかぶ http://tagiyasoft.blog.jp/ai_oicho.bin

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

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