◎判断プログラムを作る
◎第5回のエキスパート・システムをプログラムする。 *自分で作ったチャートをプログラムにしてみる。 *グラフィック画面は使わずに、コマンド画面だけで表示する。 *チャートをプログラムに落とす。(コーディングする。) *チャートのそれぞれの項目が一つのブロックになる。 *ブロックごとの関係を考えて行番号をつける。 *10行のインプット命令でデータを入力する。 *PROMPT "文字列"でインプット内容に註釈をつけることができる。 *IFは判断に用いる重要な命令である。 IF (条件) THEN(ならば)の後ろに命令を書く。 * IF a=1 は a が1ならば、という条件。 * THEN GOTO 20 は20行へ飛べ、という命令。 * ELSE GOTO 50 は、a が1でなければ50行へ飛べという命令。 * 条件ブロックの終わりに END IF を書く。 ◎サンプル 7−1 10 INPUT PROMPT "やりがいのある仕事がしたい。YESは1。NOは0。":a IF a=1 THEN GOTO 20 ELSE GOTO 50 END IF 20 INPUT PROMPT "パソコンを自由に使える。YESは1。NOは0。":a IF a=1 THEN GOTO 30 ELSE GOTO 60 END IF 30 INPUT PROMPT "美的なセンスがある。YESは1。NOは0。":a IF a=1 THEN GOTO 40 ELSE GOTO 70 END IF 40 PRINT "ウェブデザイナーを目指そう。" GOTO 200 50 INPUT PROMPT "収入はできるだけ多い方がよい。YESは1。NOは0。":a IF a=1 THEN GOTO 60 ELSE GOTO 90 END IF 60 INPUT PROMPT "体だけは丈夫である。YESは1。NOは0。":a IF a=1 THEN GOTO 70 ELSE GOTO 100 END IF 70 INPUT PROMPT "結構強引な性格である。YESは1。NOは0。":a IF a=1 THEN GOTO 80 ELSE GOTO 110 END IF 80 PRINT "第一線の営業マンにチャレンジしよう。" GOTO 200 90 PRINT "フリーターで自由に生きよう。" GOTO 200 100 PRINT "各種公務員を目指そう。" GOTO 200 110 PRINT "福祉関係の仕事を目指そう。" 200 END ◎グラスゴー・コーマ・スケール Glasgow Coma Scale *昏睡状態のレベルを数値化する尺度。三つの要素で判断する。 1 開眼 自発的に開眼する 4 呼びかけで開眼する 3 痛み刺激を与えると開眼する 2 開眼しない 1 2 言語反応 見当識の保たれた会話 5 会話に混乱がある 4 混乱した単語のみ 3 理解不能の音声のみ 2 なし 1 3 運動反応 命令に従う 6 合目的な運動をする 5 逃避反応としての運動 4 異常な屈曲反応 3 伸展反応 2 全く動かない 1 それぞれの点数を足して合計点が低いほど重症となる。 *グラフィック画面に表示する *それぞれの点数を足した合計点までコンピュータに計算させる。 *表示行に注意する。 * LET s$=STR$(s)は 数値を文字変数に直す関数。グラフィック画面で表示する。 * "開眼は"&m$&"点,"&"言語反応は"&n$&"点,"&"運動反応は"&o$&"点" の &o$& は、中央の文字変数と前後の文字列を連続して表示させる「足し算」。 *条件を連続して書きたい場合は ELSEIF 条件 THEN を使う。 ◎サンプル 7−2 SET WINDOW 0,500,0,500 CLEAR 10 PLOT TEXT ,AT 50,450 : "*開眼について" PLOT TEXT ,AT 50,400 : "1自発的に開眼する" PLOT TEXT ,AT 50,350 : "2呼びかけで開眼する" PLOT TEXT ,AT 50,300 : "3痛み刺激を与えると開眼する" PLOT TEXT ,AT 50,250 : "4開眼しない" 20 INPUT PROMPT "該当する番号を入力する":a IF a=1 THEN LET m=4 elseif a=2 THEN LET m=3 ELSEIF a=3 THEN LET m=2 ELSEIF a=4 THEN LET m=1 ELSE GOTO 20 END IF CLEAR 30 PLOT TEXT ,AT 50,450 : "*言語反応について" PLOT TEXT ,AT 50,400 : "1見当識の保たれた会話" PLOT TEXT ,AT 50,350 : "2会話に混乱がある" PLOT TEXT ,AT 50,300 : "3混乱した単語のみ" PLOT TEXT ,AT 50,250 : "4理解不能の音声のみ" PLOT TEXT ,AT 50,200 : "5なし" 40 INPUT PROMPT "該当する番号を入力する":a IF a=1 THEN LET n=5 elseif a=2 THEN LET n=4 ELSEIF a=3 THEN LET n=3 ELSEIF a=4 THEN LET n=2 ELSEIF a=5 THEN LET n=1 ELSE GOTO 40 END IF clear 50 PLOT TEXT ,AT 50,450 : "*運動反応について" PLOT TEXT ,AT 50,400 : "1命令に従う" PLOT TEXT ,AT 50,350 : "2合目的な運動をする" PLOT TEXT ,AT 50,300 : "3逃避反応としての運動" PLOT TEXT ,AT 50,250 : "4異常な屈曲反応" PLOT TEXT ,AT 50,200 : "5伸展反応" PLOT TEXT ,AT 50,150 : "6全く動かない" 60 INPUT PROMPT "該当する番号を入力する":a IF a=1 THEN LET o=6 elseif a=2 THEN LET o=5 ELSEIF a=3 THEN LET o=4 ELSEIF a=4 THEN LET o=3 ELSEIF a=5 THEN LET o=2 ELSEIF a=6THEN LET o=1 ELSE GOTO 60 END IF CLEAR LET s=m+n+o LET m$=STR$(m) LET n$=STR$(n) LET o$=STR$(o) LET s$=STR$(s) PLOT TEXT ,AT 50,350 : "開眼は"&m$&"点,"&"言語反応は"&n$&"点,"&"運動反応は"&o$&"点" PLOT TEXT ,AT 50,300 : "合計点は"&s$&"点" PLOT TEXT ,AT 50,250 : "15点は正常 8点以下は重症 3点は深昏睡" 200 END ◎障害物を検知するボール *自律的な動きをするプログラム。 *自律型ロボットの基本原理。 * ASK PIXEL VALUE (250,b+80) a は、進行方向の色を数値化している。 黒い障害物を検知するように a が1の時の行動を決める。 IF a=1 THEN LET r=-1 END IF *上の条件は進行方向に黒い線がある場合、 r (進行方向)を逆転させている。 * IF b<40 THEN LET r=1 は画面下端で進行方向を元に戻している。 *10行を繰り返し実行することでボールを前進させている。 ◎サンプル 7−3 SET WINDOW 0,500,0,500 LET b=0 LET r=1 10 LET b=b+10*r 20 WAIT DELAY 0.02 CLEAR SET LINE WIDTH 30 PLOT LINES: 100,300;400,300 DRAW disk WITH SCALE(30)*SHIFT(250+r,30+b) ASK PIXEL VALUE (250,b+80) a IF a=1 THEN LET r=-1 END IF IF b<40 THEN LET r=1 ELSE GOTO 10 END IF GOTO 10 END ◎障害物を避けるボール *10行で初期化。 *20行でy方向に1ずつ前進させる。 *30行は実行速度。 *40行以降は障害物。黒と緑と青の線。 *50行で円盤を描く。 *60行は円盤前方のピクセルが何色であるかを調べるセンサー。 *70行以下で色による進行方向の切り替えを定義。 緑:左折 青:右折 黒:出発点に戻る 白:直進 ◎サンプル 7−4 SET WINDOW 0,500,0,500 10 LET b=0 LET r=1 20 LET b=b+1*r 30 WAIT DELAY 0.02 CLEAR 40 SET LINE COLOR 1 SET LINE WIDTH 10 PLOT LINES: 100,450;400,450 SET LINE COLOR 2 PLOT LINES: 100,300;300,300 SET LINE COLOR 3 PLOT LINES: 200,150;400,150 50 DRAW disk WITH SCALE(10)*SHIFT(250+c,30+b) 60 ASK PIXEL VALUE (250+c,b+50) a 70 IF a=1 THEN GOTO 10 ELSEIF a=2 THEN LET r=0 LET c=c+10 ELSEIF a=3 THEN let r=0 LET c=c-10 ELSEIF a=0 THEN LET r=1 END IF GOTO 20 END ◎迷路を抜けるボール *副プログラム SUB で迷路の描画を簡略化。 *callで副プログラムを呼び出す。 *外部絵定義でボールの描画を簡略化。
◎サンプル 7−5 GLOAD "blue.bmp" DECLARE EXTERNAL PICTURE ball OPTION ANGLE DEGREES LET a=0 LET b=0 LET c=0 LET r=1 LET s=1 LET m=3 10 LET b=b+10*r 20 LET c=c+10*s 30 IF 330+b+c>900 THEN 40 GOTO 1000 50 END IF 60 WAIT DELAY 0.04 70 CLEAR 80 SUB maze 90 GLOAD "blue.bmp" 100 SET WINDOW 0,500,0,500 110 SET LINE WIDTH 20 120 SET LINE COLOR 1 130 PLOT LINES: 0,0;500,0;500,500;0,500;0,0 140 PLOT LINES: 0,260;400,260 150 PLOT LINES: 50,380;500,380 160 PLOT LINES: 100,140;400,140 PLOT LINES: 350,200;500,200 PLOT LINES: 300,320;500,320 PLOT LINES: 0,440;200,440 SET LINE WIDTH 60 PLOT LINES: 140,260;140,140 170 END SUB 180 CALL maze 190 DRAW ball WITH ROTATE(0)*SCALE(0.4)*SHIFT(250+c,80+b) 200 ASK PIXEL VALUE (250+c,b+110) a 210 IF a=1 THEN 220 RANDOMIZE 230 LET r=-1 240 LET s=-1+int(m*RND) 250 FOR ti=1 TO 2 260 WAIT DELAY 0.04 270 LET b=b+10*r 280 LET c=c+10*s 290 CLEAR 300 CALL maze 310 DRAW ball WITH ROTATE(0)*SCALE(0.4)*SHIFT(250+c,80+b) 320 NEXT ti 330 else 340 LET r=1 350 END IF 360 IF c<-220 THEN 370 LET s=3 380 LET m=4 390 END IF 400 IF c>220 THEN 410 LET s=-3 420 LET m=0 430 END IF 440 GOTO 10 1000 END 500 EXTERNAL PICTURE ball 510 FOR d=1 TO 30 STEP 1 520 SET COLOR MIX(4)1,d/30,d/30 530 SET LINE COLOR 4 540 SET LINE WIDTH 10 550 DRAW circle WITH SCALE(30-d)*SHIFT(d/2,d/2) 560 NEXT d 570 END PICTURE ◎コースを回る円盤 7−6 *青:左 黒:上 緑:右 赤:下 の各方向に進む。 *途中の丸印に出会うと円盤が変化する。 (直径が大きくなる。スピードが速くなる。) SET WINDOW 0,500,0,500 5 LET b=0 LET r=1 10 LET b=b+2*r 20 WAIT DELAY 0.02 CLEAR 30 SET LINE COLOR 1 SET LINE WIDTH 10 PLOT LINES: 250,10;250,50 SET LINE COLOR 2 PLOT LINES: 250,50;50,50 SET LINE COLOR 1 PLOT LINES: 50,50;50,450 SET LINE COLOR 3 PLOT LINES: 50,450;450,450 40 SET AREA COLOR 6 DRAW disk WITH SCALE(20)*SHIFT(250,450) SET LINE COLOR 4 PLOT LINES: 450,450;450,50 50 SET AREA COLOR 8 DRAW disk WITH SCALE(20)*SHIFT(450,250) SET LINE COLOR 2 PLOT LINES: 450,50;250,50 60 SET AREA COLOR 1 DRAW disk WITH SCALE(10)*SHIFT(250+c,30+b) 70 ASK PIXEL VALUE (250+c,b+50) a 80 IF a=1 THEN LET r=1 ELSEIF a=2 THEN LET r=0 LET c=c-3 ELSEIF a=3 THEN let r=0 LET c=c+3 ELSEIF a=4 THEN LET r=-1 90 ELSEIF a=6 THEN FOR t=1 TO 10 SET AREA COLOR 7 DRAW disk WITH SCALE(30)*SHIFT(250+c,30+b) WAIT DELAY 0.02 SET AREA COLOR 1 DRAW disk WITH SCALE(10)*SHIFT(250+c,30+b) next t LET r=0 LET c=c+6 100 ELSEIF a=8 THEN LET r=-30 END IF GOTO 10 END ◎グリッドコース 7−7 SET WINDOW 0,500,0,500 5 LET b=0 LET r=1 10 LET b=b+2*r 20 WAIT DELAY 0.03 CLEAR SET LINE WIDTH 5 SET LINE COLOR 1 PLOT LINES: 250,10;250,50 30 FOR m=0 TO 400 STEP 200 SET LINE COLOR 2 PLOT LINES: 50,50+m;450,50+m NEXT m 40 FOR m=0 TO 200 STEP 200 SET LINE COLOR 3 PLOT LINES: 50,150+m;450,150+m NEXT m 50 FOR n=0 TO 400 STEP 200 SET LINE COLOR 1 PLOT LINES: 50+n,50;50+n,445 NEXT n 60 FOR n=0 TO 200 STEP 200 SET LINE COLOR 4 PLOT LINES: 150+n,60;150+n,450 NEXT n 70 REM SET area COLOR 2 rem DRAW disk WITH SCALE(5)*SHIFT(250,50) rem SET area COLOR 2 rem DRAW disk WITH SCALE(5)*SHIFT(150,50) SET area COLOR 3 DRAW disk WITH SCALE(5)*SHIFT(50,150) SET area COLOR 3 rem DRAW disk WITH SCALE(5)*SHIFT(150,150) rem SET area COLOR 2 rem DRAW disk WITH SCALE(5)*SHIFT(250,450) SET line COLOR 1 PLOT TEXT ,AT 220+c,b+10 :chr$(128000+20) ASK PIXEL VALUE (220+c,b+15) a IF a=1 THEN LET r=1 ELSEIF a=2 THEN LET r=0 LET c=c-3 ELSEIF a=3 THEN let r=0 LET c=c+3 ELSEIF a=4 THEN LET r=-1 END IF GOTO 10 END ◎仮想ハンド *右手の指をキーに乗せて押すと画面の指が動く。 *親指n 人差し指u 中指i 薬指o 小指p *次の二つの命令の組み合わせで、キーを押した時だけ入力される。 入力されるまでプログラムを動かさずに待つ。 LET a$="" 25 CHARACTER INPUT NOWAIT: a$ *このプログラムのy座標は上辺が0、下辺が300なので注意。 *200行以下で指を描いている。 *1010行以下はキーを押していない時の指(円盤)の位置を決めている。 ◎サンプル・プログラム 7−8 20 CLEAR SET WINDOW 0,300,300,0 SET LINE WIDTH 5 LET a$="" 25 CHARACTER INPUT NOWAIT: a$ 30 IF a$ = "n" THEN LET i1 = i1-15 40 IF a$ = "u" THEN LET i2 = i2-13 50 IF a$ = "i" THEN LET i3 = i3-13 60 IF a$ = "o" THEN LET i4 = i4-13 70 IF a$ = "p" THEN LET i5 = i5-13 100 LET i1 = i1+3 110 LET i2 = i2+2 120 LET i3 = i3+2 130 LET i4 = i4+2 140 LET i5 = i5+2 200 DRAW disk WITH SCALE(17)*SHIFT(45+i1,135+i1) PLOT LINES: 45+i1,135+i1;135,233 210 DRAW disk WITH SCALE(15)*SHIFT(135,35+i2*2) PLOT LINES: 135,35+i2*2;135,193 220 DRAW disk WITH SCALE(15)*SHIFT(175,35+i3*2) PLOT LINES: 175,35+i3*2;175,193 230 DRAW disk WITH SCALE(15)*SHIFT(215,35+i4*2) PLOT LINES: 215,35+i4*2;215,193 240 DRAW disk WITH SCALE(13)*SHIFT(255,45+i5*2) PLOT LINES: 255,45+i5*2;255,193 1000 WAIT DELAY 0.1 1010 IF i1 >= 60 THEN LET i1 = 58 1020 if i2 >= 60 then LET i2 = 58 1030 if i3 >= 60 then LET i3 = 58 1040 if i4 >= 60 then LET i4 = 58 1050 if i5 >= 60 then LET i5 = 58 1100 GOTO 20 END ◎シューティング・ゲーム 7−9 *仮想ハンドを改造した。 *40行が敵の戦艦の速度。50行が魚雷の速度。mを押すと発射。 *220行が魚雷の位置。230行が敵戦艦の位置。 *240行で魚雷と戦艦の重なりを検出。 *命中するとsumに加点。左下に合計点を出す。 *1010行で右に消えた敵戦艦がまた左から現れる。 *1030行で魚雷の再装填。 10 SET WINDOW 0,300,300,0 SET LINE WIDTH 5 LET i3=118 LET sum=0 LET x=0 20 clear 30 CHARACTER INPUT NOWAIT: a$ 40 LET x=x+2 50 IF a$ = "m" THEN LET i3 = i3-3 220 DRAW disk WITH SCALE(5)*SHIFT(150,35+i3*2) 230 DRAW disk WITH SCALE(15)*SHIFT(0+x,35) 240 IF x=<155 AND x>=145 AND 35+i3*2>=30 AND 35+i3*2=<40 THEN LET sum=sum+10 END IF SET TEXT HEIGHT 20 PLOT TEXT ,AT 30, 280: "MARK="&STR$(sum) 1000 WAIT DELAY 0.1 1010 IF x>=390 THEN LET x=0 1030 IF i3 >= 120 THEN LET i3 = 118 1040 IF i3=< -120 THEN LET i3= 118 LET a$="" END IF 1100 GOTO 20 2000 END 【科学シミュレーション】 ◎太陽系シミュレーション 7-10 *11月8日・立冬の日を基準に太陽系の内惑星の位置を表示するプログラム。 *内側から水星・金星・地球(月)・火星の位置を示す。 *X軸の正方向(右側)が回転の始点。(春分点=3月に天の赤道と黄道の交差する点) *下部に2020年11月8日からの経過日数を表示。 *プログラム自体は簡単。ただし天文データを正確に入力する必要がある。 *三角関数のcosとsinは最大値が1なので、画面は左右上下が+−1である。 *角度を扱うので 10 OPTION ANGLE DEGREES を先に宣言する。 *太陽と各惑星の距離の比は正しいが天体の大きさは正しくない。 10 OPTION ANGLE DEGREES 30 SET WINDOW -1,1,-1,1 LET t=0 40 LET t=t+(360/365.2422) LET t$=STR$(int(t)) 50 LET r=0.5 LET r1=0.1935 LET r2=0.366 LET r3=0.76 60 SET AREA COLOR 0 PLOT AREA: -1,1; 1,1 ;1,-1;-1,-1;-1,1 PLOT TEXT ,AT 0,-0.9 :"2020/11/08+"&t$ SET COLOR "yellow" DRAW disk WITH SCALE(0.02)*SHIFT(0,0) SET POINT STYLE 7 70 SET COLOR "gray" PLOT POINTS: r1*COS((t*4.147+387)),r1*SIN((t*4.147+387)) SET COLOR "gray" PLOT POINTS: r2*COS((t*1.622+373)),r2*SIN((t*1.622+373)) SET COLOR "red" PLOT POINTS: r3*COS((t*0.531+195)),r3*SIN((t*0.531+195)) 80 SET COLOR "blue" PLOT POINTS: r*COS(t+225),r*SIN(t+225) SET COLOR "black" PLOTPOINTS: r*COS(t+225)+0.04*COS(t*12+312) ,r*SIN(t+225)+0.04*SIN(t*12+312) FOR v=1 TO 300000 NEXT v 90 GOTO 40 190 END ◎グループ運動 7-11 *複雑系の例としてよく取り上げられる魚のグループ運動。 *絶対値 ABS(m)はmが正でも負でも、その符号を除いた数値を示す。 *個体(a2,b2)と他の個体との位置の差を絶対値で表し、40を超えると5に戻す。 *「近づきすぎると離れる」命令は省略してある。付け加えるとリアル度が増す。 SET WINDOW 0,500,0,500 10 LET a2=a2+a LET b2=b2+b LET a4=a4+a3 LET b4=b4+b3 LET c2=c2+c LET d2=d2+d LET c4=c4+c3 LET d4=d4+d3 50 IF ABS(a2-a4)>40 THEN LET a4=a2-5 IF ABS(a2-c2)>40 THEN LET c2=a2-5 IF ABS(a2-c4)>40 THEN LET c4=a2-5 IF ABS(b2-b4)>40 THEN LET b4=b2-5 IF ABS(b2-d2)>40 THEN LET d2=b2-5 IF ABS(b2-d4)>40 THEN LET d4=b2-5 100 WAIT DELAY 0.02 CLEAR RANDOMIZE DRAW disk WITH SCALE(2)*SHIFT(250+a2,250+b2) LET a=INT(10*RND)-1 LET b=INT(6*RND)-1 IF a2>250 THEN LET a2=-250 IF b2>250 THEN LET b2=-250 DRAW disk WITH SCALE(2)*SHIFT(250+a4,250+b4) LET a3=INT(10*RND)-1 LET b3=INT(6*RND)-1 IF a4>250 THEN LET a4=-250 IF b4>250 THEN LET b4=-250 DRAW disk WITH SCALE(2)*SHIFT(250+c2,250+d2) LET c=INT(10*RND)-1 LET d=INT(6*RND)-1 IF c2>250 THEN LET c2=-250 IF d2>250 THEN LET d2=-250 DRAW disk WITH SCALE(2)*SHIFT(250+c4,250+d4) LET c3=INT(10*RND)-1 LET d3=INT(6*RND)-1 IF c4>250 THEN LET c4=-250 IF d4>250 THEN LET d4=-250 500 GOTO 10 1000 end 【言語処理】 ◎俳句を詠む 7−12 *プログラム7−2「グラスゴー・コーマ・スケール」の応用。 *季節と心情を入力すると、それに合わせた俳句を出力する。 *季語は限定的だが、それ以外の要素は自由度が大きくなる。 *作品の質は考慮されていない。 *5・7・5の各節の関連性によって、様々な構成を考えることができる。 *「季語の集合」→「季語と他の節との関連付けの強度」→「関連付けの種類」 などによって高度な創作をすることができる。 *「関連付け」には「類似による関連付け」「比喩による関連付け」「因果関係による 関連付け」「対比による関連付け」などがある。 例:蛙飛び込む→水の音 五月雨→最上川 岩に染み入る→蝉の声 荒海→佐渡 *語群と語群の関連付けを「意味」と呼ぶことができる。関連付けが正しければ 「有意味」、正しくなければ「無意味」と考えられる。 *語と語の関連付けは「文脈」によって変化する。機械翻訳ではこれが重要になる。 SET WINDOW 0,500,0,500 CLEAR 10 PLOT TEXT ,AT 50,450 : "季節は?" PLOT TEXT ,AT 50,400 : "1 春" PLOT TEXT ,AT 50,350 : "2 夏" PLOT TEXT ,AT 50,300 : "3 秋" PLOT TEXT ,AT 50,250 : "4 冬" 20 INPUT PROMPT "該当する番号を入力する":a IF a=1 THEN LET m$="山桜" elseif a=2 THEN LET m$="麦の秋" ELSEIF a=3 THEN LET m$="天高し" ELSEIF a=4 THEN LET m$="息白し" ELSE GOTO 20 END IF CLEAR 30 PLOT TEXT ,AT 50,450 : "心情は?" PLOT TEXT ,AT 50,400 : "1 うれしい" PLOT TEXT ,AT 50,350 : "2 悲しい" PLOT TEXT ,AT 50,300 : "3 寂しい" PLOT TEXT ,AT 50,250 : "4 恋をしている" PLOT TEXT ,AT 50,200 : "5 季節を味わいたい" 40 INPUT PROMPT "該当する番号を入力する":a RANDOMIZE LET a=1+int(a*RND) IF a=1 THEN LET n$="空見上げれば" elseif a=2 THEN LET n$="水の流れに" ELSEIF a=3 THEN LET n$="路傍の石に" ELSEIF a=4 THEN LET n$="呼ばれてみれば" ELSEIF a=5 THEN LET n$="行方も知れず" ELSE GOTO 40 END IF clear 50 RANDOMIZE LET a=1+int(6*RND) IF a=1 THEN LET o$="涙落つ" elseif a=2 THEN LET o$="一人かな" ELSEIF a=3 THEN LET o$="影二つ" ELSEIF a=4 THEN LET o$="風の声" ELSEIF a=5 THEN LET o$="光あり" ELSEIF a=6 THEN LET o$="心あり" END IF 60 PLOT TEXT ,AT 50,350 :m$ PLOT TEXT ,AT 50,300 :n$ PLOT TEXT ,AT 50,250 :o$ 200 END ◎現代詩を詠む 7−13 *PCが普及し始めた頃の有名なプログラム「コンピュータ詩人」の一例。 *プログラムを走らせると毎回異なった詩を作る。 *詩の言葉の関連づけによって、人間が作ったような「意味の曖昧さ」を生み出す。 90 RANDOMIZE 100 GOTO 110 110 LET D=0 120 LET D=D+1 130 GOTO 1300 140 PRINT "星の明かりが静かに消えていく" 150 LET A1=1 160 LET D=D+1 170 PRINT " 夜明け " 180 GOTO 1350 190 PRINT "星明かりに照らされた街路 " 200 LET A2=1 210 LET D=D+1 220 PRINT " 詩を呟きながら歩く " 230 GOTO 1350 240 PRINT "この地上では キャンドルが燃え尽き " 250 LET A3=1 260 LET D=D+1 270 PRINT " 街が目覚める " 280 GOTO 1350 290 PRINT "詩を口ずさみながら " 300 LET A4=1 310 LET D=D+1 320 PRINT " 目の中には死の影 " 330 GOTO 1350 340 PRINT "夜明け " 350 PRINT " 世界 " 360 LET A5=1 370 LET D=D+1 380 PRINT " 狂った夢に向かって進む " 390 GOTO 1350 400 PRINT " 太陽の下 " 410 LET C5=1 420 LET D=D+1 430 GOTO 1350 440 PRINT "鏡の中に 一人の男が見える 彼は " 450 PRINT " 叫ぶ " 460 LET D=D+1 470 LET C5=1 480 PRINT "彼は私 " 490 LET D=D+1 500 PRINT " 私は彼 " 510 GOTO 1350 520 PRINT "夜の帳が下りる " 530 LET A7=1 540 LET D=D+1 550 PRINT " この地上に " 560 GOTO 1350 570 PRINT "キャンドルに火が灯される " 580 LET A8=1 590 LET D=D+1 600 PRINT " 夜の闇 " 610 GOTO 1350 620 PRINT " 人々は眠っている " 630 LET A9=1 640 LET D=D+1 650 GOTO 1350 660 PRINT "眠る彼女の唇は死の色 " 670 LET B1=1 680 LET D=D+1 690 PRINT " しかしその目には歌がある " 700 GOTO 1350 710 PRINT " 時が過ぎ" 720 LET B2=1 730 LET D=D+1 740 PRINT " 星が瞬く " 750 GOTO 1350 760 PRINT "失われるものは何もない " 770 LET B3=1 780 LET D=D+1 790 GOTO 1350 800 PRINT "大切な歌は失われ " 810 LET B4=1 820 LET D=D+1 830 PRINT " 死から生まれるものはない " 840 GOTO 1350 850 PRINT "愛だけがただ一つの救い " 860 LET B5=1 870 LET D=D+1 880 GOTO 1350 890 PRINT "この星を美しく大いなる存在にしてくれる " 900 LET B6=1 910 LET D=D+1 920 PRINT " 何もかもむなしく 悲しみに満ちていても " 930 GOTO 1350 940 PRINT "死が怖い? あなたは " 950 LET B7=1 960 LET D=D+1 970 PRINT " 彼を恐れている " 980 GOTO 1350 990 PRINT "あなたの心は私とすれちがう " 1000 LET B8=1 1010 LET D=D+1 1020 PRINT " 私の言葉はあなたにとどかない " 1030 GOTO 1350 1040 PRINT "彼は去り 私は残る " 1050 LET B9=1 1060 LET D=D+1 1070 PRINT " しかし会うことはない " 1080 GOTO 1350 1090 PRINT " 時はいつもすれちがう " 1100 LET C1=1 1110 LET D=D+1 1120 PRINT " 永遠に " 1130 GOTO 1350 1140 PRINT "宇宙もなくなってしまう " 1150 LET C2=1 1160 LET D=D+1 1170 PRINT "時の流れがなければ " 1180 GOTO 1350 1190 PRINT "終わりはない " 1200 LET C3=1 1210 LET D=D+1 1220 PRINT " ただいつも始まりがあるだけ " 1230 GOTO 1350 1240 PRINT "そしてまた繰り返される " 1250 LET C4=1 1260 PRINT " それだけ " 1270 GOTO 1350 1280 PRINT 1281 LET D=D+1 1290 GOTO 1350 1300 PRINT " RANDOM POETRY IN FOUR PART HARMONY." 1310 PRINT 1320 PRINT 1330 IF Q=INT(Q) THEN 1280 1340 IF D=12 THEN 2330 1350 LET X=RND*24-1 1360 LET X1=INT(X)+1 1361 IF D=4 THEN 1280 1362 IF D=8 THEN 1280 1363 IF D>16 THEN 2330 1370 IF X1=1 THEN 1390 1380 GOTO 1410 1390 IF A1=1 THEN 1410 1400 IF X1=1 THEN 140 1410 IF X1=2 THEN 1430 1420 GOTO 1450 1430 IF A2=1 THEN 1450 1440 IF X1=2 THEN 290 1450 IF X1=3 THEN 1470 1460 GOTO 1490 1470 IF A3=1 THEN 1490 1480 IF X1=3 THEN 190 1490 IF X1=4 THEN 1510 1500 GOTO 1530 1510 IF A4=1 THEN 1530 1520 IF X1=4 THEN 240 1530 IF X1=5 THEN 1550 1540 GOTO 1570 1550 IF A5=1 THEN 1570 1560 IF X1=5 THEN 340 1570 IF X1=6 THEN 1590 1580 GOTO 1610 1590 IF A6=1 THEN 1610 1600 IF X1=6 THEN 400 1610 IF X1=7 THEN 1630 1620 GOTO 1650 1630 IF A7=1 THEN 1650 1640 GOTO 520 1650 IF X1=8 THEN 1670 1660 GOTO 1690 1670 IF A8=1 THEN 1690 1680 GOTO 570 1690 IF X1=9 THEN 1710 1700 GOTO 1730 1710 IF A9=1 THEN 1730 1720 GOTO 620 1730 IF X1=10 THEN 1750 1740 GOTO 1780 1750 GOTO 1760 1760 IF B1=1 THEN 1780 1770 GOTO 660 1780 IF X1=11 THEN 1800 1790 GOTO 1820 1800 IF B2=1 THEN 1820 1810 GOTO 710 1820 IF X1=12 THEN 1840 1830 GOTO 1860 1840 IF B3=1 THEN 1860 1850 GOTO 760 1860 IF X1=13 THEN 1880 1870 GOTO 1900 1880 IF B4=1 THEN 1900 1890 GOTO 800 1900 IF X1=14 THEN 1920 1910 GOTO 1940 1920 IF B5=1 THEN 1840 1930 GOTO 850 1940 IF X1=15 THEN 1960 1950 GOTO 1980 1960 IF B6=1 THEN 1980 1970 GOTO 890 1980 IF X1=16 THEN 2000 1990 GOTO 2020 2000 IF B7=1 THEN 2020 2010 GOTO 940 2020 IF X1=17 THEN 2040 2030 GOTO 2060 2040 IF B8=1 THEN 2060 2050 GOTO 990 2060 IF X1=18 THEN 2080 2070 GOTO 2100 2080 IF B9=1 THEN 2100 2090 GOTO 1040 2100 IF X1=19 THEN 2120 2110 GOTO 2140 2120 IF C1=1 THEN 2140 2130 GOTO 1090 2140 IF X1=20 THEN 2160 2150 GOTO 2180 2160 IF C2=1 THEN 2180 2170 GOTO 1140 2180 IF X1=21 THEN 2200 2190 GOTO 2220 2200 IF C3=1 THEN 2220 2210 GOTO 1190 2220 IF X1=22 THEN 2240 2230 GOTO 2260 2240 IF C4=1 THEN 2260 2250 GOTO 1240 2260 IF X1=23 THEN 2280 2270 GOTO 2300 2280 IF C5=1 THEN 2300 2290 GOTO 440 2300 GOTO 2320 2310 IF X1=24 THEN 1280 2320 GOTO 1350 2330 PRINT 2340 PRINT 2350 PRINT " BY COMPUPOET" 2360 END ◎定言的三段論法のプログラム 7−14 *定言的三段論法については以下の論理学講義のリンクを参照。 http://hirao.art.coocan.jp/logic/ ↑この中の「定言判断」「クラス論理学」「仮言的三段論法」を参照のこと。 *このプログラムでは主語sを人間、述語pを馬、中名辞mを動物にしてある。 そこを入れ替えれば様々な言明が作れる。 *三段論法は三つの集合の論理的関係を表すものなので、三つの言明が事実と 合っているかどうかは別問題である。あくまで「論理的に正しいかどうか」を示している。 *論理学ページの「仮言的三段論法」冒頭のリンクをクリックすると「四つの格」の表がある。 プログラムはこれに従って記述してある。 *コマンド・ウィンドウに三段論法の形式が7桁の数値(変数s)で示される。 それぞれの意味は次の通り。 例1: 1 11 11 11 左から「何格か?」「第一の前提の形式」「第二の前提の形式」「結論の形式」の意味。 形式とは 11:全称肯定(A判断) 12:全称否定(E判断) 21:特称肯定(I判断) 22:特称否定(O判断)を指す。 つまり、例1は「第1格のAAA」を指す。「三段論法覚え詩」のBarbaraである。 *30行以下で四つの格(変数c)の三段論法をランダムに発生させている。全部で256通りある。 *一つ一つの言明について「全て(1)」「ある(2)」(変数a)「である。(1)」「でない。(2)」(変数b)を決定する。 プログラムを節約するため、サブルティーン命令 gosub を使っている。 同じ操作をして元の場所に戻ってくる命令である。 *120行以下が思考ルティーンである。 定言的三段論法の正しい形式は19通りしかないので、それと照合している。 *格と三段論法の形式を1の位から10の6乗までの「一つの自然数」で表現している。 これは変数の節約という意味ももつが、数学で扱う命題を一つの自然数で表現しようとした クルト・ゲーデルのアイデアである。(ゲーデル数) 詳しくは論理学のページ「ゲーデルの不完全性定理」を参照。 SET WINDOW 0,500,0,500 RANDOMIZE 10 LET s$="人間" LET p$="馬" LET m$="動物" CLEAR 20 RANDOMIZE LET c=1+INT(4*RND) LET s=c*10^6 IF c=1 THEN GOTO 30 IF c=2 THEN GOTO 40 IF c=3 THEN GOTO 50 IF c=4 THEN GOTO 60 30 GOSUB 200 LET s=s+a*10^5 LET s=s+b*10^4 PLOT TEXT ,AT 50,450 : a$&m$&"は"&p$&b$ GOSUB 200 LET s=s+a*10^3 LET s=s+b*10^2 PLOT TEXT ,AT 50,400 : a$&s$&"は"&m$&b$ GOSUB 200 LET s=s+a*10 LET s=s+b PLOT TEXT ,AT 50,350 :"∴"&a$&s$&"は"&p$&b$ GOTO 100 40 GOSUB 200 LET s=s+a*10^5 LET s=s+b*10^4 PLOT TEXT ,AT 50,450 : a$&p$&"は"&m$&b$ GOSUB 200 LET s=s+a*10^3 LET s=s+b*10^2 PLOT TEXT ,AT 50,400 : a$&s$&"は"&m$&b$ GOSUB 200 LET s=s+a*10 LET s=s+b PLOT TEXT ,AT 50,350 : "∴"&a$&s$&"は"&p$&b$ GOTO 100 50 GOSUB 200 LET s=s+a*10^5 LET s=s+b*10^4 PLOT TEXT ,AT 50,450 : a$&m$&"は"&p$&b$ GOSUB 200 LET s=s+a*10^3 LET s=s+b*10^2 PLOT TEXT ,AT 50,400 : a$&m$&"は"&s$&b$ GOSUB 200 LET s=s+a*10 LET s=s+b PLOT TEXT ,AT 50,350 : "∴"&a$&s$&"は"&p$&b$ GOTO 100 60 GOSUB 200 LET s=s+a*10^5 LET s=s+b*10^4 PLOT TEXT ,AT 50,450 : a$&p$&"は"&m$&b$ GOSUB 200 LET s=s+a*10^3 LET s=s+b*10^2 PLOT TEXT ,AT 50,400 : a$&m$&"は"&s$&b$ GOSUB 200 LET s=s+a*10 LET s=s+b PLOT TEXT ,AT 50,350 : "∴"&a$&s$&"は"&p$&b$ GOTO 100 100 PLOT TEXT ,AT 50,300 : "この三段論法は正しいか?" PRINT s PLOT TEXT ,AT 50,250 : "1 正しい 2 正しくない" LET Prompt$="答えは?" INPUT PROMPT prompt$:ans 120 IF s=1111111 THEN GOTO 150 IF s=1121112 THEN GOTO 150 IF s=1112121 THEN GOTO 150 IF s=1122122 THEN GOTO 150 IF s=2121112 THEN GOTO 150 IF s=2111212 THEN GOTO 150 IF s=2122122 THEN GOTO 150 IF s=2112222 THEN GOTO 150 IF s=3111121 THEN GOTO 150 IF s=3211121 THEN GOTO 150 IF s=3112121 THEN GOTO 150 IF s=3121122 THEN GOTO 150 IF s=3221122 THEN GOTO 150 IF s=3122122 THEN GOTO 150 IF s=4111121 THEN GOTO 150 IF s=4111212 THEN GOTO 150 IF s=4211121 THEN GOTO 150 IF s=4121122 THEN GOTO 150 IF s=4122122 THEN GOTO 150 GOTO 160 150 IF ans=1 THEN GOTO 170 160 IF ans=2 THEN GOTO 170 GOTO 180 170 PLOT TEXT ,AT 50,200 : "正解です!" GOTO 1000 180 PLOT TEXT ,AT 50,200 : "不正解" GOTO 1000 200 LET a=INT((20*RND)/10)+1 LET b=INT((20*RND)/10)+1 IF a=1 THEN LET a$="全ての" IF a=2 THEN LET a$="ある" IF b=1 THEN LET b$="である。" IF b=2 THEN LET b$="でない。" RETURN 1000 END ◎スクワットする骨格 7−15 *骨格によってスクワット運動をシミュレーションする。 *黒い円の関節を運動させ、その間を線でつないでいる。 *全ての運動をpという一つのパラメーターだけで表現している。 *関節を動かす関数は、x軸方向、y軸方向、xy両軸の三種類。(二次元だから。) *仮に三次元のロボットを製作するとしたら、これにz軸方向の動きを加えればよい。 *pの増減を変化させれば、動きを大きくしたり小さくしたりできる。 *関数を変えれば異なった動きになる。 *座標系はy軸だけ上辺がゼロ。下に向って数値が大きくなる。 SET WINDOW 0,600,600,0 10 for i=0 to 200 12 IF i<100 THEN GOTO 16 14 LET p=200-i GOTO 18 16 LET p=i 18 CLEAR REM atama 30 DRAW circle WITH SCALE (20)*SHIFT(300,80+p) REM sebone 40 PLOT LINES : 300,100+p;300,225+p 50 DRAW disk WITH SCALE (10)*SHIFT(300,225+p) REM kosibone 60 PLOT LINES:300,225+p; 300,265+p REM kotsuban 70 PLOT LINES : 260,265+p;340,265+p DRAW disk WITH SCALE(10)*SHIFT(260,265+p) 80 DRAW disk WITH SCALE(10)*SHIFT(340,265+p) REM migi-asi 100 PLOT LINES: 340,265+p;350+p/3,360 DRAW disk WITH SCALE(10)*SHIFT(350+p/3,360) 110 PLOT LINES: 350+p/3,360;360,450 DRAW disk WITH SCALE(10)*SHIFT(360,450) REM hidari-asi 130 PLOT LINES: 260,265+p;250-p/3,360 DRAW disk WITH SCALE(10)*SHIFT(250-p/3,360) 140 PLOT LINES: 250-p/3,360;240,450 DRAW disk WITH SCALE (10)*SHIFT(240,450) REM kata 200 PLOT LINES: 250,140+p;350,140+p DRAW disk WITH SCALE(10)*SHIFT(250,140+p) 210 DRAW disk WITH SCALE(10)*SHIFT(350,140+p) REM migi-ude 220 PLOT LINES: 350,140+p;355+p/2,205+p DRAW disk WITH SCALE (10)*SHIFT(355+p/2,205+p) 230 PLOT LINES: 355+p/2,205+p;360+p/2,270-p/4 DRAW disk WITH SCALE(10)*SHIFT(360+p/2,270-p/4) REM hidari-ude 240 PLOT LINES: 250,140+p; 245-p/2,205+p DRAW disk WITH SCALE(10)*SHIFT(245-p/2,205+p) 260 PLOT LINES: 245-p/2,205+p;240-p/2,270-p/4 DRAW disk WITH SCALE(10)*SHIFT(240-p/2,270-p/4) WAIT DELAY 0.02 300 NEXT i 400 GOTO 10 END ◎ブロックによる文字フォント 7−16 *5行で配列変数を定義している。タテ5マス、ヨコ5マスの表を作るのと同じである。 *25マスからなる表の各欄に黒か白の正方形を入れてアルファベットを作る。 *15行ではキー入力を初期化している。何かキーを押すまで入力を待つ。 *17行以下はアルファベット各文字の造形である。0が白い正方形、1が黒い正方形。 y ↓ x→12345 2 3 4 5 *上のような順番で(1,1)(2,1)(3,1)・・・(5,5)までの25個のブロックをデータにしてある。 *data行は冒頭にDATAと書いて、各数値は「,」で分ける。readより前に書く。 *データを読むのはread文である。40行のread p で最初のデータ行から順に読み込む。 *100行以下で白か黒の正方形(外部絵定義)を上から下に向って順番に並べている。 *180行目のrestoreはデータを始めから読み直す命令である。 *170行以降で、26文字全てを表示した後、最初に戻れと命令している。 *プログラムを終了するためには停止ボタンを押す。 DECLARE EXTERNAL PICTURE sq 5 DIM a(5,5) LET i=0 10 SET WINDOW 0,300,300,0 15 CHARACTER INPUT CLEAR:c$ 17 DATA 0,1,1,1,0,1,0,0,0,1,1,1,1,1,1,1,0,0,0,1,1,0,0,0,1 rem A DATA 1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1 rem B DATA 1,1,1,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,1,1,1 REM C DATA 1,1,1,1,0,1,0,0,1,1,1,0,0,0,1,1,0,0,1,1,1,1,1,1,0 rem D DATA 1,1,1,1,1,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,1,1,1,1 rem E DATA 1,1,1,1,1,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0 rem F DATA 1,1,1,1,1,1,0,0,0,0,1,0,1,1,1,1,0,0,0,1,1,1,1,1,1 rem G DATA 1,0,0,0,1,1,0,0,0,1,1,1,1,1,1,1,0,0,0,1,1,0,0,0,1 rem H DATA 0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0 rem I DATA 0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,1,0,0,1,1,1,0 REM J DATA 1,1,0,0,1,1,1,0,1,0,1,1,1,0,0,1,1,0,1,0,1,1,0,0,1 rem K DATA 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,1,1,0 rem L DATA 1,1,0,1,1,1,1,1,1,1,1,0,1,0,1,1,0,0,0,1,1,0,0,0,1 rem M DATA 1,1,0,0,1,1,1,0,0,1,1,0,1,0,1,1,0,0,1,1,1,0,0,1,1 rem N DATA 1,1,1,1,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,1,1,1,1 rem O DATA 1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,0,0,0,0,1,0,0,0,0 rem P DATA 1,1,1,1,1,1,0,0,0,1,1,0,1,1,1,1,0,1,0,1,1,1,1,1,1 rem Q DATA 1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,0,0,1,0,1,0,0,1,1 rem R DATA 1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1 REM S DATA 1,1,1,1,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0 rem T DATA 1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,1,1,1,1 REM U DATA 1,0,0,0,1,1,0,0,0,1,0,1,0,1,0,0,1,0,1,0,0,0,1,0,0 REM V DATA 1,0,1,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1,0,1,0,1,0,1,0 rem W DATA 1,0,0,0,1,0,1,0,1,0,0,0,1,0,0,0,1,0,1,0,1,0,0,0,1 REM X DATA 1,0,0,0,1,0,1,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0 rem Y DATA 1,1,1,1,1,0,0,0,1,1,0,0,1,0,0,1,1,0,0,0,1,1,1,1,1 REM Z 20 for y=1 to 5 30 for x=1 to 5 40 read p 50 LET a(x,y)=p 60 NEXT x 70 NEXT y 100 for y=1 to 5 110 for x=1 to 5 120 IF a(x,y)=0 THEN SET AREA COLOR 0 130 IF a(x,y)=1 THEN SET AREA COLOR 1 GOTO 140 140 DRAW sq WITH SCALE(0.5)*SHIFT(50+20*x,50+20*y) 150 NEXT x 160 NEXT y 170 let i=i+1 180 IF i=26 THEN RESTORE 190 if i=26 then goto 5 200 goto 10 END 1100 EXTERNAL PICTURE sq PLOT AREA :0,0;50,0;50,50;0,50 1150 END PICTURE ◎ダンス・プログラム 7−17 *プログラム 7−15 のスクワット運動にデータ読み込みを加えた。 *関節の位置を示すパラメータをデータから読み込んでいる。 *全部で24のパラメータを使用。 *20種類の動作を行う。 *delay値で動きの速さを調節できる。 *関数自体を書き換えなくても、データだけで動きを指示できる。 *プログラムの終了はエスケープで行なう。 SET WINDOW 0,600,600,0 data 0.1,0,0,0,0.2,0,-0.2,0,0.2,0,0.5,0,0.1,0,0.5,0,-0.4,0,-0.4,0,0,0,0,0 data 0.1,0,0,0,0,0,0,0,0,0,-0.5,-1.3,0,0,0.5,-1.3,0.2,0,-0.2,0,-0.2,0,0.2,0 data 0.1,0,0,0,-0.2,0,0.2,0,-0.2,0,-0.5,0,-0.1,0,-0.5,0,0.4,0,0.4,0,0,0,0,0 data 0.1,0,0,0,0,0,0,0,0,0,-0.5,-1,0,0,0.5,-1,-0.2,0,0.2,0,-0.2,0,0.2,0 data 0.1,0,0,0,0.2,0,-0.2,0,0.2,0,0.5,0,0.1,0,0.5,0,-0.4,0,-0.4,0,0,0,0,0 data 1,0,0.1,0.1,1,0,1,0,1,0,0.5,-1,1,0,1.5,-1,1.2,0,0.8,0,0.8,0,1.2,0 DATA 0.1,0,0,0,-0.2,0,0.2,0,-0.2,0,-0.5,0,-0.1,0,-0.5,0,0.4,0,0.4,0,0,0,0,0 data -1,0,0.1,0.1,-1,0,-1,0,-1,0,-1.5,-1,-1,0,-0.5,-1,-0.8,0,-1.2,0,-1.2,0,-0.8,0 data 0.1,0,0,0,0.2,0,-0.2,0,0.2,0,0.5,0,0.1,0,0.5,0,-0.4,0,-0.4,0,0,0,0,0 data 0.1,0,-0.1,0.1,0,0,0,0,0,0,-0.5,-1,0,0,0.5,-1,0.2,0,-0.2,0,-0.2,0,0.2,0 data 0.1,0,0,0,-0.2,0,0.2,0,-0.2,0,-0.5,0,-0.1,0,-0.5,0,0.4,0,0.4,0,0,0,0,0 data 0.1,0,0.1,-0.1,0,0,0,0,0,0,-0.5,-1,0,0,0.5,-1,0.2,0,-0.2,0,-0.2,0,0.2,0 data 0.1,0,0,0,0.2,0,-0.2,0,0.2,0,0.5,0,0.1,0,0.5,0,-0.4,0,-0.4,0,0,0,0,0 data 0.1,0,0,0,0,0,0,0,0,0,-0.5,-1,0,0,0.5,-1,0.2,0,-0.2,0,-0.2,0,0.2,0 data 0.1,0,0,0,-0.2,0,0.2,0,-0.2,0,-0.5,0,-0.1,0,-0.5,0,0.4,0,0.4,0,0,0,0,0 data 0.1,0,0,0,0,0,0,0,0,0,-0.5,-1,0,0,0.5,-1,0.2,0,-0.2,0,-0.2,0,0.2,0 data 0.1,0,0,0,0.2,0,-0.2,0,0.2,0,0.5,0,0.1,0,0.5,0,-0.4,0,-0.4,0,0,0,0,0 data 0.1,0,0,0,0,0,0,0,0,0,-0.5,-1,0,0,0.5,-1,0.2,0,-0.2,0,-0.2,0,0.2,0 data 0.1,0,0,0,-0.2,0,0.2,0,-0.2,0,-0.5,0,-0.1,0,-0.5,0,0.4,0,0.4,0,0,0,0,0 data 0.1,0,0,0,0,0,0,0,0,0,-0.5,-1,0,0,0.5,-1,0.2,0,-0.2,0,-0.2,0,0.2,0 5 for j = 1 to 20 7 READ hx,hy,lsy,rsy,lex,ley,bx,by,rex,rey,lhx,lhy,wx,wy,rhx,rhy,lkx,lky,rkx,rky,llx,lly,rlx,rly 8 for k = 1 to 2 10 FOR i=0 TO 200 12 IF i<100 THEN GOTO 16 14 LET p=200-i GOTO 18 16 LET p=i 18 CLEAR REM atama 30 DRAW circle WITH SCALE (20)*SHIFT(300+p*hx,100+p*hy) REM sebone 40 PLOT LINES : 300+p*hx,120+p*hy ;300+p*bx,215+p*by 50 DRAW disk WITH SCALE (10)*SHIFT(300+p*bx,215+p*by) REM kosibone 60 PLOT LINES: 300+p*bx,215+p*by;300+p*wx,245+p*wy REM kotsuban 70 PLOT LINES : 260+p*wx,245+p*wy;340+p*wx,245+p*wy DRAW disk WITH SCALE(10)*SHIFT(260+p*wx,245+p*wy) 80 DRAW disk WITH SCALE(10)*SHIFT(340+p*wx,245+p*wy) REM migi-asi 100 PLOT LINES: 340+p*wx,245+p*wy;340+p*rkx,320+p*rky DRAW disk WITH SCALE(10)*SHIFT(340+p*rkx,320+p*rky ) 110 PLOT LINES: 340+p*rkx,320+p*rky ;340+p*rlx,395+p*rly DRAW disk WITH SCALE(10)*SHIFT(340+p*rlx,395+p*rly) REM hidari-asi 130 PLOT LINES: 260+p*wx,245+p*wy ;260+p*lkx,320+p*lky DRAW disk WITH SCALE(10)*SHIFT(260+p*lkx,320+p*lky) 140 PLOT LINES: 260+p*lkx,320+p*lky;260+p*llx,395+p*lly DRAW disk WITH SCALE (10)*SHIFT(260+p*llx,395+p*lly) REM kata 200 PLOT LINES: 250+p*hx,140+p*lsy ;350+p*hx,140+p*rsy DRAW disk WITH SCALE(10)*SHIFT(250+p*hx,140+p*lsy) 210 DRAW disk WITH SCALE(10)*SHIFT(350+p*hx,140+p*rsy) REM migi-ude 220 PLOT LINES: 350+p*hx,140+p*rsy; 355+p*rex,205+p*rey DRAW disk WITH SCALE (10)*SHIFT(355+p*rex,205+p*rey ) 230 PLOT LINES:355+p*rex,205+p*rey ;360+p*rhx,270+p*rhy DRAW disk WITH SCALE(10)*SHIFT(360+p*rhx,270+p*rhy) REM hidari-ude 240 PLOT LINES: 250+p*hx,140+p*lsy; 245+p*lex,205+p*ley DRAW disk WITH SCALE(10)*SHIFT( 245+p*lex,205+p*ley) 260 PLOT LINES: 245+p*lex,205+p*ley;240+p*lhx,270+p*lhy DRAW disk WITH SCALE(10)*SHIFT(240+p*lhx,270+p*lhy) WAIT DELAY 0.002 300 NEXT i 360 NEXT k 400 next j 500 restore GOTO 5 END ◎ラジオ体操 7−18 *冒頭から5行までを入れ替えると「ラジオ体操」になる。 *38種類の動作を行う。 SET WINDOW 0,600,600,0 data 0,0,0,0,0,-1.5,0,0,0,-1.5,0,-3,0,0,0,-3,0,0,0,0,0,0,0,0 data 0,0,0,0,0,-1.5,0,0,0,-1.5,0,-3,0,0,0,-3,0,0,0,0,0,0,0,0 data 0,0,0,0,.5,0,0,0,-.5,0,1,0,0,0,-1,0,0,0,0,0,0,0,0,0 data 0,0.5,0.5,0.5,-0.5,-0.5,0,0.5,0.5,-0.5,-0.8,-2,0,0.5,0.8,-2,-0.2,0.2,0.2,0.2,0,0,0,0 data 0,0,0,0,.5,0,0,0,-.5,0,1,0,0,0,-1,0,0,0,0,0,0,0,0,0 data 0,0.5,0.5,0.5,-0.5,-0.5,0,0.5,0.5,-0.5,-0.8,-2,0,0.5,0.8,-2,-0.2,0.2,0.2,0.2,0,0,0,0 data 0,0,0,0,.5,0,0,0,-.5,0,1,0,0,0,-1,0,0,0,0,0,0,0,0,0 data 0,0,0,0,0.5,-1.5,0,0,-0.5,-1.5,0.8,-3,0,0,-0.8,-3,0,0,0,0,0,0,0,0 data 0,0,0,0,.5,0,0,0,-.5,0,1,0,0,0,-1,0,0,0,0,0,0,0,0,0 data 0,0,0,0,0.5,-1.5,0,0,-0.5,-1.5,0.8,-3,0,0,-0.8,-3,0,0,0,0,0,0,0,0 data 0,0,0,0,.5,0,0,0,-.5,0,1,0,0,0,-1,0,0,0,0,0,0,0,0,0 data 0,0,0,0,-0.5,-1,0,0,0.5,-1,-1,-2,0,0,1,-2,0,0,0,0,0,0,0,0 data 0,0,0,0,.5,0,0,0,-.5,0,1,0,0,0,-1,0,0,0,0,0,0,0,0,0 data 0,0,0,0,-0.5,-1,0,0,0.5,-1,-1,-2,0,0,1,-2,0,0,0,0,0,0,0,0 data 0.5,0.5,0.5,0.8,1,-1.2,0,0,0,0.5,1.4,-2.5,0,0,0,0.5,0,0,0.1,0,0,0,0.2,0 data 0.5,0.5,0.5,0.8,1,-1.2,0,0,0,0.5,1.4,-2.5,0,0,0,0.5,0,0,0.1,0,0,0,0.2,0 data -0.5,0.5,0.8,0.5,0,0.5,0,0,-1,-1.2,0,0.5,0,0,-1.4,-2.5,-0.1,0,0,0,-0.2,0,0,0 data -0.5,0.5,0.8,0.5,0,0.5,0,0,-1,-1.2,0,0.5,0,0,-1.4,-2.5,-0.1,0,0,0,-0.2,0,0,0 data 0,2,1,1,0,1,0,0.5,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0 data 0,0.5,0.4,0.4,-0.5,0.1,0,0.2,0.5,0.1,0.3,-0.3,0,0.2,-0.3,-0.3,-0.1,0,0.1,0,-0.2,0,0.2,0 data 0,2,1,1,0,1,0,0.5,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0 data 0,0.5,0.4,0.4,-0.5,0.1,0,0.2,0.5,0.1,0.3,-0.3,0,0.2,-0.3,-0.3,-0.1,0,0.1,0,-0.2,0,0.2,0 data 0,0,0,0,.5,0,0,0,-.5,0,1,0,0,0,-1,0,0,0,0,0,0,0,0,0 data 0,0,0,0,.5,0,0,0,-.5,0,1,0,0,0,-1,0,0,0,0,0,0,0,0,0 data 0,0,0,0,0.5,-1,0,0,0.5,-1,1,-2,0,0,1,-2,0,0,0,0,0,0,0,0 data 0,0,0,0,0.5,-1,0,0,0.5,-1,1,-2,0,0,1,-2,0,0,0,0,0,0,0,0 data 0,0,0,0,.5,0,0,0,-.5,0,1,0,0,0,-1,0,0,0,0,0,0,0,0,0 data 0,0,0,0,.5,0,0,0,-.5,0,1,0,0,0,-1,0,0,0,0,0,0,0,0,0 data 0,0,0,0,-0.5,-1,0,0,-0.5,-1,-1,-2,0,0,-1,-2,0,0,0,0,0,0,0,0 data 0,0,0,0,-0.5,-1,0,0,-0.5,-1,-1,-2,0,0,-1,-2,0,0,0,0,0,0,0,0 data 0,0,0,0,0,0,0,0,0,0,.2,-1.2,0,0,-.2,-1.2,0,0,0,0,0,0,0,0 data 0.2,0,0,0,0.2,-1.5,0.2,0,0.2,-1.5,0.2,-3,0.2,0,0.2,-3,0.1,0,0.3,0,0,0,0.4,0 data 0,0,0,0,0,0,0,0,0,0,.2,-1.2,0,0,-.2,-1.2,0,0,0,0,0,0,0,0 data -0.2,0,0,0,-0.2,-1.5,-0.2,0,-0.2,-1.5,-0.2,-3,-0.2,0,-0.2,-3,-0.3,0,-0.1,0,-0.4,0,0,0 data 0,0,0,0,0,0,0,0,0,0,.2,-1.2,0,0,-.2,-1.2,0,0,0,0,0,0,0,0 data 0.2,0,0,0,0.2,-1.5,0.2,0,0.2,-1.5,0.2,-3,0.2,0,0.2,-3,0.1,0,0.3,0,0,0,0.4,0 data 0,0,0,0,0,0,0,0,0,0,.2,-1.2,0,0,-.2,-1.2,0,0,0,0,0,0,0,0 data -0.2,0,0,0,-0.2,-1.5,-0.2,0,-0.2,-1.5,-0.2,-3,-0.2,0,-0.2,-3,-0.3,0,-0.1,0,-0.4,0,0,0 5 for j = 1 to 38