ベーマガの投稿作品の扱いについては
・作者本人であること。
・非営利目的であること。
・元となった雑誌の掲載年月日を明記すること。
などの条件がそろえば、webに転載することができます。
なので、誌面をOCRで取り込んでみました。自前のフロッピーディスクにはデータが残ってなかったので、動いてるところを久しぶりに見ることができました。
下の画面はX68000エミュレータで動かした状態のスクリーンショットです。
▲タイトル画面です。
▲マウスで犬を操って、オオカミからヒツジを守ります。
▲ヒツジを柵の向こう側へ運ぶとクリア。ヒツジの数が増えていきます。
▲ヒツジがオオカミに食われるとゲームオーバーです。
題名:「シープドッグ」
転載元:電波新聞社 「マイコンBASICマガジン」1992年3月号
対応機種:X68000 (X-BASIC)
サウンド関連の命令は注釈にしてしまったので、鳴らしたい場合は外してください。
10 /* ---------------------< SHEEP DOG for x68k >--------------------- */ 20 /* (Original) Micom BASIC Magazine 1992/3 by takuya matsubara */ 30 screen 0,1,1,1:color 7:mouse(0):mouse(4):apage(1) 40 int x,y,t,f,z,h,i,J,k,m,n,c 50 dim int e(9),w(9),e1(9),w1(9) 60 dim str v(3)[64] 70 music():sp():pal() 80 symbol(40,30,"シープドッグ",1,4,2,15,0) 90 symbol(25,140,"push mouse button"1,1,2,5,0) 100 apage(0):fill(0,0,255,46,3):fill(0,48,255,255,8):fill(0,48,64,255,12) 110 for i=0 to 4:j=i*2:line(56+j,40+j,56+j,255+j,15) 120 line(55,i*50+44,65,i*50+54,15):next 130 /*------------------------ title*/ 140 while -1 150 vpage(2):sp_off(0,127):sp_disp(1):cls:/*m_play(5)*/ 160 x=100:h=1:g=0 170 repeat:if abs(120-x)>80 then h=sgn(120-x) 180 t=abs(t-1):x=x+h*rnd()*10:sp_set(0,x,190,&H2101+&H2000*h+t,3) 190 until msbtn(1,0,50)>1 200 vpage(1) 210 /* ----------------------- set up*/ 220 while -1 230 /*m_stop()*/ 240 msarea(230,120,250,150):msarea(16,64,255,255):mspos(x,y) 250 c=0:f=0:m=90:n=225:h=0:g=g+1 260 for i=0 to g-1:e(i)=int(rnd()*20)+200:w(i)=i*18+80:e1(i)=0:w1(i)=0 270 sp_set(i+2,e(i)+rnd()*2,w(i)+rnd()*2,&H100,3):next 280 sp_set(0,x,y,&H101,3) 290 sp_set(1,m,n,&H103,3) 300 print "R O U N D";g 310 print "「ヒツジヲ助ケルワン!」":for j=0 to 15000:next 320 locate 0,1:print " " 330 /* -------------------------------- main loop*/ 340 while f=0 350 /*if m_stat(1)=0 then m_play(1,2)*/ 360 /* ------------ dog*/ 370 mspos(x,y):t=abs(t-1):sp_set(0,x,y,&H101+t,3) 380 /* ------------ sheep*/ 390 c=0 400 for i=0 to g-1:j=e(i):k=w(i) 410 if abs(x-j)<20 and abs(y-k)<20 then e1(i)=j-x:w1(i)=k-y:/*m_play(3)*/ 420 if point(j,k)=12 then c=c+1 430 if e1(i)<>0 or w1(i)<>0 then { 440 j=j+e1(i):k=k+w1(i) 450 e1(i)=e1(i)*rnd():w1(i)=w1(i)*rnd() 460 if j<32 then j=32 470 if k<80 then k=80 480 if j>240 then j=240 490 if k>240 then k=240 500 } 510 sp_set(i+2,j+rnd()*2,k+rnd()*2,&H100,3) 520 e(i)=j:w(i)=k 530 if abs(j-m)<16 and abs(k-n)<16 then f=2:break 540 next:locate 22,0:print "救出";c;"匹":if c=g then f=3 550 /* ----------------------- wolf */ 560 if rnd()>0.95# then h=int(rnd()*g) 570 m=m+sgn(e(h)-m)*rnd()*4:n=n+sgn(w(h)-n)*rnd()*4 580 sp_set(1,m,n,&H103,3) 590 if m<80 then m=80 600 if abs(x-m)<16 and abs(y-n)<16 then f=1 610 endwhile 620 /* ------------------------------- game over */ 630 /*m_stop()*/ 640 if f=3 then { sp_set(1,m,n,&H8103,3):/*m_play(1,6)*/ 650 print "「タスケタワン」" 660 for i=0 to 15000:next:cls 670 if g=10 then for i=m to 272:sp_set(1,i,k,&H103,3):for h=0 to 400:next:next:break 680 } else { print "「ヤラレタワン」":/*m_play(4)*/ 690 if f=2 then sp_set(i+2,j,k,&H8100,3) 700 for i=0 to 50:t=abs(t-1):sp_set(0,x,y,&H8101+t,3) 710 for h=0 to 400:next:next:break 720 } 730 endwhile 740 endwhile 750 end 760 /*--------------------------- sprite*/ 770 func sp():sp_init() 780 v(0)="00008880000000000088BBB8000000000878B8B8800800008778B88780878000" /*sheep*/ 790 v(1)="88888787787778008666887777777780866687777777778086687777777777B0" 800 v(2)="8668777777777778088777777777778000877777777777800087777777777780" 810 v(3)="00087777777778800008686888686800000BB8B808B8B8000008B8B808888800" 820 def(0) 830 v(0)="0000000000000000000088880000000008888118000000000811211800000000" /*dog1*/ 840 v(1)="811111800000088B888811180000081B08811A1188B88118081188A111111188" 850 v(2)="088888A1A111188000008A11AAAA11800008A1188888A188008A118800088A18" 860 v(3)="0811188000008A18088188000000811800888000000088880000000000000000" 870 def(1) 880 v(0)="0000000000000000000000000000000000008888000000000888811800000000" /*dog2*/ 890 v(1)="0811211800000000811111800000000088881118000000008111181188888880" 900 v(2)="888888A111111118000008A1A111181800008A11AAAA181800008A18888A1888" 910 v(3)="00008A1808A1800000008A1808A1180000008818008A18000000088800088800" 920 def(2) 930 v(0)="0000000008008000000000008288280000000000828B28000088880086222800" /*wolf*/ 940 v(1)="0886668862B8B800086222686222280082622228628222808222262862888800" 950 v(2)="082222228622280008622886288B800008282886828000000828288286280000" 960 v(3)="0828288288280000082868828828000008626286286280000888888880888000" 970 def(3) 980 endfunc 990 /*---------------------- sp_def*/ 1000 func def(k) 1010 dim char p(255) 1020 for i=0 to 3:for j=0 to 63:p(i*64+j)=val("&H"+mid$(v(i),j+1,1)):next:next 1030 sp_def(k,p,1) 1040 endfunc 1050 /* -------------------palette */ 1060 func pal() 1070 sp_color(0,0) 1080 sp_color(1,17338) 1090 sp_color(2,24464) 1100 sp_color(6,42780) 1110 sp_color(7,65535) 1120 sp_color(8,1) 1130 sp_color(10,673) 1140 sp_color(11,54913) 1150 endfunc 1160 /* ----------------------music*/ 1170 func music():str a 1180 /*m_alloc(1,99):m_alloc(2,99):m_alloc(3,99):m_alloc(4,99):m_alloc(5,99):m_alloc(6,99)*/ 1190 /*m_assign(1,1):m_assign(2,2):m_assign(3,3):m_assign(4,4):m_assign(5,5):m_assign(6,6)*/ 1200 /*a="@5v15c<cdef>fde<ddfge>d9fg9f9r1":m_trk(1,a)*/ 1210 /*a="@6v15o3dcdcdcdede<eddd>dfdfdfr1":m_trk(2,a)*/ 1220 /*a="@66v15a9" :m_trk(3,a)*/ 1230 /*a="@1v15b9a9g9f9e9d9c1" :m_trk(4,a)*/ 1240 /*a="@8o5v15afcgd9e<d1>d2c5fg4ef<d1>":m_trk(5,a)*/ 1250 /*a="@51v15a8abdg<a8d>c8f4e" :m_trk(6,a)*/ 1260 endfunc
ディスクイメージ版。
オオカミの移動量を減らして、難易度をさげました。