2016年10月

  • タイトル
    ソリティアゴルフ (電子工作マガジン2016年SPRING号掲載)

  • 内容
    ソリティアゴルフというトランプゲームです。
    山札に場札を重ねていき、全ての場札を山札に重ねるゲームです。

  • solitairegolf

  • 遊び方
    表向きに置かれた山札よりも数字が1つ大きいか小さいカードを重ねていきます。
    重ねられるのは各列の最下段にあるカードのみです。
    Jは11、Qは12、Kは13と表示されます。
    AとKは繋がっています。(例:K-A-2や、2-A-Kのように繋げられる)
    重ねられるカードがなくなったら山札から1枚引いて表向きに置き、再び場札のカードを重ねていきます。
    場のカードと山札がすべて無くなったらゲームクリアです。
    場にカードが残った状態で山札が無くなってしまったら失敗です。
    ゲームが終了すると、かかった時間が表示されます。

  • 操作方法
    カード列上部にある[0]~[6]の数字を入力すると、その列の最下段のカードが山札に重ねられます。
    [-1]を入力すると、新たに山札から1枚めくられ表向きに置かれます。
    残りのカードが0枚以下になるとゲーム終了です。

  • プログラムのしくみ

  • 各行の処理
    1行コメント(ファイル名)
    2行カードをランダムに配列に収める
    3~4行場札を並べて表示
    5行山札表示
    6行ゲーム終了判定
    7行移動するカードを入力
    8行列の最下段サーチ
    9行場札±1のカードか判定
    10行場札から山札にカード移動
    11~13行カードの枠線描画
    14行入力待ちに戻る
    20行山札の枠線描画
    21行カードのマーク、数字、枠線描画

    変数表
    Iループ用
    J各種計算用一時変数
    Xカードのインデックス
    Y山札のインデックス
    T山札の数
    C選んだ場札の列
    B選んだ場札の数
    K選んだ場札のインデックス
    X動かした場札のインデックス
    Nカードの数字
    R描画したカードの数字
    Uカード描画X座標
    Vカード描画Y座標
    Pカード下部描画X座標
    Qカード下部描画Y座標

    [0]~[51]の配列に、ランダムに0~51の数字(カード)が収まります。
    カードは、0~12がスペード、13~25がハート、26~38がクラブ、39~51がダイヤになります。
    配列に入っている数を13で割った商がマークになり、余りが数字となります。

  • プログラムの具体的な入力方法
    プログラムリスト中の「□」はスペース1個です。(例:「□□□」はスペース3個)
    カードの枠線は「左ALT+SHIFT+キー」で入力します。
    ━ 左ALT+SHIFT+H
    ┃ 左ALT+SHIFT+I
    ┏ 左ALT+SHIFT+O(オー)
    ┓ 左ALT+SHIFT+P
    ┗ 左ALT+SHIFT+Q
    ┛ 左ALT+SHIFT+R

  • プログラムの改造
    ルールによってはAとKが繋がらないルールもあり、その場合は難易度が上がります。
    AとKを繋がらないルールにするには、9行めのIF文の判別式を下記のように変更します。
    ABS(N-T)%11<>1 → ABS(N-T)<>1

ソリティアゴルフ
1 'ソリティアゴルフ
2 CLV:CLT:Y=35:FORI=0TO51:J=RND(52):IF[J]I=I-1ELSE[J]=I:CLS:?I
3 NEXT:CLS:FORI=0TO34:U=I/5*4:V=(6-(I%5))*2-2:X=[I]:GOSUB21:IFI<7LCI*4+1,0:?"[";I;"]":LCI*4,12:?"┃":LCI*4,13:?"┗━━━":IFI<5LC28,I*2+3:?"┃"
4 NEXT:LC28,12:?"┃":LC28,13:?"┛":LC0,16:?"[-1]":[52]=[51]
5 LC8,18:?CHR$(12),"ノコリ ";51-Y;"マイ":X=[Y]:U=0:V=18:GOSUB20:?"□":T=R
6 IFY=52LC10,22:?"TIME=";TICK()/60;"sec":LC10,20:IFZ=35?"Congratulations!":ENDELSE?"GAME OVER.":END
7 LC4,19:?"┃":LC10,20:?CHR$(24);:INPUT"CARD=",C:IFC<0Y=Y+1:GOTO5
8 FORI=0TO4:K=(C%7)*5+I:B=[K]:IFB>=0:I=5:N=B%13+1ELSEN=T
9 NEXT:LC10,22:?CHR$(24);:IFABS(N-T)%11<>1?"ウゴカセマセン":GOTO7
10 U=0:V=18:X=B:GOSUB20:T=N:[Y]=[K]:[K]=-1:Z=Z+1:?"□":P=K/5*4:Q=(6-(K%5))*2:LCP,Q-2:?"┃□□□":LCP,Q-1:?"┗━━━":LCP,Q:?"┃□□□":LCP,Q+1:?"┃□□□"
11 IFC>0IF[K-5]>=0GOTO13
12 LCP,Q:?"□":LCP,Q+1:?"□"
13 IFC=6OR[K+5]<0LCP+4,Q-2:?"┃":LCP+4,Q:?"□":LCP+4,Q+1:?"□"
14 GOTO6
20 LCU+4,V+1:?"┃":LCU,V+2:?"┃□□□┃":LCU,V+3:?"┗━━━┛"
21 R=X%13+1:LCU,V:?"┏━━━┓":LCU,V+1:?"┃";CHR$(X/13+228);R;:RETURN

MixJuiceでのダウンロードURLは下記になります。
ソリティアゴルフ http://tagiyasoft.blog.jp/solitaire_golf.bin

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

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

  • タイトル
    人工無脳おいちょかぶ (電子工作マガジン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の場合は、メニューの[ファイル]-[ファイル送信]で当該ファイルを送信します)

↑このページのトップヘ