シープドッグ

ベーマガの投稿作品の扱いについては
・作者本人であること。
・非営利目的であること。
・元となった雑誌の掲載年月日を明記すること。
などの条件がそろえば、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


ディスクイメージ版。
オオカミの移動量を減らして、難易度をさげました。