ゲームを作りたい人のための ソースコード集

私がその日作った短めのソースを簡単な解説とともに載せていきます
ゲーム制作初心者にとって参考になるかもしれないソースが多いです





一日ゲームNo.18「カメとアキレス」

一日ゲーム第十八弾

 

カメをアキレスに追いつかれる前にゴールにたどり着かせるゲームです

計算式の空欄に正しい数字を入れて、カメをゴールまで進ませましょう

レベルが高いほど計算が難しくなります

 

ダウンロード

ソースコード

 

0
    posted by higashijugem 07:12comments(0)|-|





    二次元マップのスクロール

    マップチップを並べた画面内を移動するアルゴリズムです

    キャラクターはマスに捉われない動き方をします

     


    csz=32:cszh=csz/2
    gmw=640/csz:gmh=480/csz        ;画面に表示されるマス数
    mpw=gmw*2:mph=gmh*2        ;マップ全体のマス数
    gmwmx=mpw*csz:gmhmx=mph*csz    ;マップ全体の大きさ
    dim mpdt,mpw,mph
    repeat 600
        mpdt(rnd(mpw-2)+1,rnd(mph-2)+1)=1
    loop
    ;マップチップ
    buffer 2,csz*3,csz:celdiv 2,csz,csz,cszh,cszh
    boxf:x=0
    color 1:boxf x,0,x+csz-1,csz:x+csz
    color 255,255,255:boxf x,0,x+csz-1,csz:x+csz
    color 255:circle x,0,x+csz-1,csz
    gsel 0
    gmode 2
    plx=cszh:ply=cszh
    *main
        color:boxf
        getkey k37,37
        getkey k38,38
        getkey k39,39
        getkey k40,40
        if k37{
            plx-4
        }
        if k38{
            ply-4
        }
        if k39{
            plx+4
        }
        if k40{
            ply+4
        }
        plx=limit(plx,cszh,gmwmx-cszh)
        ply=limit(ply,cszh,gmhmx-cszh)
        ;表示
        gstx=limit(plx-csz*gmw/2,0,csz*mpw-csz*gmw)
        gsty=limit(ply-csz*gmh/2,0,csz*mph-csz*gmh)
        sx=gstx/csz-1:sy=gsty/csz-1
        ix=gstx¥csz:iy=gsty¥csz
        repeat gmh+2:j=cnt
            repeat gmw+2:i=cnt
                tx=sx+i:ty=sy+j
                if 0<=tx&tx<mpw&0<=ty&ty<mph{
                    pos (i-1)*csz+cszh-ix,(j-1)*csz+cszh-iy
                    celput 2,mpdt(tx,ty)
                }
            loop
        loop
        pos plx-gstx,ply-gsty:celput 2,2
        redraw:await 17:redraw 0
        goto *main

    0
      posted by higashijugem 21:37comments(0)|-|





      あみだくじ

      あみだくじ表を自動で作成するプログラムです



      cmx=20    ;横線の数
      rmx=5    ;平行線の数
      randomize
      dim linedt,cmx,rmx
      cnm=0
      repeat
          if cnm>=cmx:break
          x=rnd(cmx):y=rnd(rmx)
          if linedt(x,y)=0{
              setflg=0
              if y=0{
                  dir=0
              }else:if y=rmx-1{
                  dir=1
              }else{
                  dir=rnd(2)
              }
              if dir=0{
                  if linedt(x,y+1)=0{
                      linedt(x,y)=1
                      linedt(x,y+1)=-1
                      setflg=1
                  }
              }else{
                  if linedt(x,y-1)=0{
                      linedt(x,y)=-1
                      linedt(x,y-1)=1
                      setflg=1
                  }
              }
              if setflg{
                  cnm++
              }
          }
          await
      loop
      sx=120:sy=80
      inlr=100
      inlc=16
      repeat rmx:y=cnt
          line sx,sy-inlc,sx,sy+(cmx+1)*inlc
          repeat cmx:x=cnt
              if linedt(x,y)=1{
                  ty=sy+x*inlc
                  line sx,ty,sx+inlr,ty
              }
          loop
          sx+inlr
      loop

      0
        posted by higashijugem 22:13comments(0)|-|





        慣性の法則

        慣性の法則のプログラムです

        十字キーを押すことで物体を移動させます

         

         

        cx=320.0
        cy=240.0
        mv=0.1
        vis=0.02
        cmx=0.0
        cmy=0.0
        angle=0
        cszh=16
        gw=640:gh=480
        *main
            color:boxf:color 255,255,255
            getkey k37,37
            getkey k38,38
            getkey k39,39
            getkey k40,40
            angle=0:kpush=0
            if k37{
                angle+180:kpush++
            }
            if k38{
                angle+90:kpush++
            }
            if k40{
                angle+270:kpush++
            }
            if k39{
                if k40{
                    angle+360
                }else{
                    angle+0
                }
                kpush++
            }
            if kpush>0{
                angle/kpush
                cmx+=cos(deg2rad(angle))*mv
                cmy-=sin(deg2rad(angle))*mv
            }else{
                cmx-=vis*cmx
                cmy-=vis*cmy
            }
            cx+=cmx
            cy+=cmy
            ;バウンド
            if cx<cszh{        ;左壁
                cx=0f+cszh
                cmx=-cmx
            }
            if cx>gw-cszh{    ;右壁
                cx=0f+gw-cszh
                cmx=-cmx
            }
            if cy<cszh{        ;上壁
                cy=0f+cszh
                cmy=-cmy
            }
            if cy>gh-cszh{    ;下壁
                cy=0f+gh-cszh
                cmy=-cmy
            }
            color 255,255,255
            circle cx-cszh,cy-cszh,cx+cszh,cy+cszh
            redraw:await 17:redraw 0
            goto *main

        0
          posted by higashijugem 19:16comments(0)|-|





          落下と上昇

          落下と上昇を組み合わせたアルゴリズムです

          そのままでは物体が落ちていくだけですが、上キーを押すことで上昇させることができます

           


          vy=0.0        ;速度
          ay=0.0        ;加速度
          vis=0.05    ;粘性抵抗係数
          grav=0.8    ;重力

          chx=320.0
          chy=240.0
          border=480
          chcsz=24:chcszh2=chcsz/2
          fallflg=1
          *main
              color:boxf
              getkey k38,38
              if k38{
                  if fallflg=0{
                      ay=0.0
                      vy=0.0
                      chy-=1.0
                  }
                  fallflg=1
                  ay=-grav+(vis*(-vy))
              }else{
                  if fallflg=1{
                      ay=grav-(vis*vy)
                  }
              }
              vy+ay
              chy+vy
              if chy>=border{
                  chy=border
                  fallflg=0
              }
              color 255,255,255
              boxf chx-chcszh2,chy-chcsz,chx+chcszh2,chy
              redraw:await 17:redraw 0
              goto *main

          0
            posted by higashijugem 19:10comments(0)|-|





            縄張りアルゴリズム

            一定の範囲内に進入した場合のみ、キャラクターを追いかけるプログラムです

             

             

            #enum e_i_sflg=0
            #enum e_i_stype
            #enum e_i_rsensx
            #enum e_i_rsensy
            #enum e_i_rsenslen
            #enum e_i_target
            #enum e_d_sx=0
            #enum e_d_sy
            #enum e_d_srad
            #enum e_d_sspd
            pirad2=M_PI*2

            spsum=2
            steer=0.01
            dim i_shipdt,6,spsum
            ddim d_shipdt,4,spsum
            i_shipdt(0,0)=1,0
            d_shipdt(0,0)=600.0, 400.0, deg2rad(220), 0.5
            i_shipdt(0,1)=1,1,300,320,200,-1
            d_shipdt(0,1)=300.0, 320.0, deg2rad(0), 0.0

            *main
                color 255,255,255:boxf:color
                repeat spsum:spid=cnt
                    if i_shipdt(e_i_sflg,spid){
                        rad=d_shipdt(e_d_srad,spid)
                        spd=d_shipdt(e_d_sspd,spid)
                        d_shipdt(e_d_sx,spid)+=cos(rad)*spd
                        d_shipdt(e_d_sy,spid)+=sin(rad)*spd
                        if i_shipdt(e_i_stype,spid)=0{
                            color ,,255
                        }else{    ;相手のなわばりアルゴリズム
                            rsx=0f+i_shipdt(e_i_rsensx,spid)
                            rsy=0f+i_shipdt(e_i_rsensy,spid)
                            len=0f+i_shipdt(e_i_rsenslen,spid)
                            ;なわばり範囲
                            color:circle rsx-len,rsy-len,rsx+len,rsy+len,0
                            espx=d_shipdt(e_d_sx,spid)
                            espy=d_shipdt(e_d_sy,spid)
                            esprad=d_shipdt(e_d_srad,spid)
                            espspd=d_shipdt(e_d_sspd,spid)
                            losid=-1
                            if i_shipdt(e_i_target,spid)>=0{
                                fspx=d_shipdt(e_d_sx,i_shipdt(e_i_target,spid))
                                fspy=d_shipdt(e_d_sy,i_shipdt(e_i_target,spid))
                                tlen=sqrt(powf(rsx-fspx,2)+powf(rsy-fspy,2))
                                if len>tlen{
                                    i_shipdt(e_i_target,spid)=-1
                                }
                            }
                            if i_shipdt(e_i_target,spid)<0{
                                repeat spsum:tspid=cnt
                                    if spid!=tspid&i_shipdt(e_i_stype,tspid)=0{
                                        fspx=d_shipdt(e_d_sx,tspid)
                                        fspy=d_shipdt(e_d_sy,tspid)
                                        tlen=sqrt(powf(rsx-fspx,2)+powf(rsy-fspy,2))
                                        if len>tlen{
                                            len=tlen
                                            losid=tspid
                                            d_shipdt(e_d_sspd,spid)=0.8
                                        }
                                    }
                                loop
                            }
                            if losid>=0{    ;縄張り内に侵入者
                                i_shipdt(e_i_target,spid)=losid
                                rot2=atan(fspy-espy,fspx-espx)
                                rot1=esprad
                                ;下の行をアンコメントするとどこまでも追いかける
                                ;i_shipdt(e_i_rsenslen,spid)=999999
                            }else{    ;侵入者が縄張り外に出た場合
                                tlen=sqrt(powf(rsx-espx,2)+powf(rsy-espy,2))
                                if tlen>10{    ;ほぼ中心地に戻る
                                    rot2=atan(rsy-espy,rsx-espx)
                                    rot1=esprad
                                }else{
                                    d_shipdt(e_d_sspd,spid)=0.0
                                }
                            }
                            ;ターゲットの進行方向と、ターゲットから見た標的の角度差
                            rad=rot2-rot1
                            ;方向の値が0〜円周率に収まるようにする
                            if rad>M_PI:rad-pirad2
                            if rad<-M_PI:rad+pirad2
                            if rad>steer{d_shipdt(e_d_srad,spid)+steer}
                            if rad<-steer{d_shipdt(e_d_srad,spid)-steer}
                            color 255
                        }
                        x=d_shipdt(e_d_sx,spid):y=d_shipdt(e_d_sy,spid)
                        circle x-10,y-10,x+10,y+10
                    }
                loop
                redraw:await 17:redraw 0
                goto *main

            0
              posted by higashijugem 12:10comments(0)|-|





              迎撃アルゴリズム

              キャラクターの接触ポイントを予測し、それに基づいた行動をさせるアルゴリズムです

               


              #enum e_i_sflg=0
              #enum e_i_stype
              #enum e_d_sx=0
              #enum e_d_sy
              #enum e_d_srad
              #enum e_d_sspd
              pirad2=M_PI*2

              spsum=2
              steer=0.01
              dim i_shipdt,2,spsum
              ddim d_shipdt,4,spsum
              i_shipdt(0,0)=1,0
              d_shipdt(0,0)=600.0, 400.0, deg2rad(220), 0.5
              i_shipdt(0,1)=1,1
              d_shipdt(0,1)=50.0, 420.0, deg2rad(0), 0.8

              *main
                  color 255,255,255:boxf:color
                  repeat spsum:spid=cnt
                      if i_shipdt(e_i_sflg,spid){
                          rad=d_shipdt(e_d_srad,spid)
                          spd=d_shipdt(e_d_sspd,spid)
                          d_shipdt(e_d_sx,spid)+=cos(rad)*spd
                          d_shipdt(e_d_sy,spid)+=sin(rad)*spd
                          x=d_shipdt(e_d_sx,spid):y=d_shipdt(e_d_sy,spid)
                          if i_shipdt(e_i_stype,spid)=0{
                              color ,,255
                          }else{    ;相手の迎撃アルゴリズム
                              len=999999.0
                              espx=d_shipdt(e_d_sx,spid)
                              espy=d_shipdt(e_d_sy,spid)
                              esprad=d_shipdt(e_d_srad,spid)
                              espspd=d_shipdt(e_d_sspd,spid)
                              losid=-1
                              repeat spsum:tspid=cnt
                                  if spid!=tspid&i_shipdt(e_i_stype,tspid)=0{
                                      fspx=d_shipdt(e_d_sx,tspid)
                                      fspy=d_shipdt(e_d_sy,tspid)
                                      tlen=sqrt(powf(espx-fspx,2)+powf(espy-fspy,2))
                                      if len>tlen{
                                          len=tlen
                                          losid=tspid
                                      }
                                  }
                              loop
                              if losid>=0{
                                  fspx=d_shipdt(e_d_sx,losid)
                                  fspy=d_shipdt(e_d_sy,losid)
                                  fsprad=d_shipdt(e_d_srad,losid)
                                  fspspd=d_shipdt(e_d_sspd,losid)
                                  fax=cos(fsprad)*fspspd:fay=sin(fsprad)*fspspd
                                  eax=cos(esprad)*espspd:eay=sin(esprad)*espspd
                                  vrx=fax-eax:vry=fay-eay
                                  srx=fspx-espx:sry=fspy-espy
                                  tc=sqrt(srx*srx+sry*sry)/sqrt(vrx*vrx+vry*vry)
                                  stx=fspx+fax*tc:sty=fspy+fay*tc
                                  ;予測衝突地点
                                  color:circle stx-10,sty-10,stx+10,sty+10,0
                                  rot2=atan(sty-espy,stx-espx)
                                  rot1=esprad
                                  ;ターゲットの進行方向と、ターゲットから見た標的の角度差
                                  rad=rot2-rot1
                                  ;方向の値が0〜円周率に収まるようにする
                                  if rad>M_PI:rad-pirad2
                                  if rad<-M_PI:rad+pirad2
                                  if rad>steer{d_shipdt(e_d_srad,spid)+steer}
                                  if rad<-steer{d_shipdt(e_d_srad,spid)-steer}
                              }
                              color 255
                          }
                          circle x-10,y-10,x+10,y+10
                      }
                  loop
                  redraw:await 17:redraw 0
                  goto *main

              0
                posted by higashijugem 21:51comments(0)|-|





                LOSアルゴリズム

                キャラクターの追跡アルゴリズムです

                直線する青を赤色が追いかけます

                 


                #enum e_i_sflg=0
                #enum e_i_stype
                #enum e_d_sx=0
                #enum e_d_sy
                #enum e_d_srad
                #enum e_d_sspd
                pirad2=M_PI*2

                spsum=2
                steer=0.01
                dim i_shipdt,2,spsum
                ddim d_shipdt,4,spsum
                i_shipdt(0,0)=1,0
                d_shipdt(0,0)=600.0, 400.0, deg2rad(220), 0.5
                i_shipdt(0,1)=1,1
                d_shipdt(0,1)=50.0, 420.0, deg2rad(0), 0.8

                *main
                    color 255,255,255:boxf:color
                    repeat spsum:spid=cnt
                        if i_shipdt(e_i_sflg,spid){
                            rad=d_shipdt(e_d_srad,spid)
                            spd=d_shipdt(e_d_sspd,spid)
                            d_shipdt(e_d_sx,spid)+=cos(rad)*spd
                            d_shipdt(e_d_sy,spid)+=sin(rad)*spd
                            x=d_shipdt(e_d_sx,spid):y=d_shipdt(e_d_sy,spid)
                            if i_shipdt(e_i_stype,spid)=0{
                                color ,,255
                            }else{    ;相手の追跡アルゴリズム
                                len=999999.0
                                espx=d_shipdt(e_d_sx,spid)
                                espy=d_shipdt(e_d_sy,spid)
                                esprad=d_shipdt(e_d_srad,spid)
                                losid=-1
                                repeat spsum:tspid=cnt
                                    if spid!=tspid&i_shipdt(e_i_stype,tspid)=0{
                                        fspx=d_shipdt(e_d_sx,tspid)
                                        fspy=d_shipdt(e_d_sy,tspid)
                                        tlen=sqrt(powf(espx-fspx,2)+powf(espy-fspy,2))
                                        if len>tlen{
                                            len=tlen
                                            losid=tspid
                                        }
                                    }
                                loop
                                if losid>=0{
                                    fspx=d_shipdt(e_d_sx,losid)
                                    fspy=d_shipdt(e_d_sy,losid)
                                    rot2=atan(fspy-espy,fspx-espx)
                                    rot1=esprad
                                    ;ターゲットの進行方向と、ターゲットから見た標的の角度差
                                    rad=rot2-rot1
                                    ;方向の値が0〜円周率に収まるようにする
                                    if rad>M_PI:rad-pirad2
                                    if rad<-M_PI:rad+pirad2
                                    if rad>steer{d_shipdt(e_d_srad,spid)+steer}
                                    if rad<-steer{d_shipdt(e_d_srad,spid)-steer}
                                }
                                color 255
                            }
                            circle x-10,y-10,x+10,y+10
                        }
                    loop
                    redraw:await 17:redraw 0
                    goto *main

                0
                  posted by higashijugem 20:12comments(0)|-|





                  三次元極座標

                  三次元の球面上に点を描写するプログラムです

                  原点から一定の距離にランダムで点を配置します

                   

                  #include "d3m.hsp"
                  #const double CAMERA_R 180
                  #const double PI 3.1415
                  randomize
                  r=60.0
                  camera_phi=PI/3.0
                  camera_theta=0.0
                  old_mx=0
                  old_my=0
                  d3mkparticle 0,255,255,255

                  sum=120
                  dim x,sum
                  dim y,sum
                  dim z,sum
                  repeat sum    ;球面上にパーティクル配置
                      rad0=deg2rad(rnd(360))
                      rad1=deg2rad(rnd(360))
                      ;曲座標を求める式
                      x(cnt)=r*sin(rad0)*cos(rad1)
                      y(cnt)=r*sin(rad0)*sin(rad1)
                      z(cnt)=r*cos(rad0)
                  loop
                  *main
                      color:boxf:color 255,255,255
                      ok1=k1:getkey k1,1:tk1=k1^ok1&k1
                      gosub *move_camera
                      gosub *draw
                      redraw:await 17:redraw 0
                      goto *main

                  *draw        ;座標軸とパーティクルの描写
                      color 255:d3line -r,0,0,r,0,0
                      color ,255:d3line 0,-r,0,0,r,0
                      color ,,255:d3line 0,0,-r,0,0,r
                      gmode 5, , , 255
                      repeat sum
                          d3particle 0, x(cnt), y(cnt), z(cnt), 5
                      loop
                      return
                  *move_camera    ;ドラッグでカメラ視点移動
                      if k1{
                          if ok1{
                              camera_theta += 0.01 * ( old_mx - ginfo_mx )
                              camera_phi   = limitf( camera_phi + 0.01 * ( old_my - ginfo_my ), 0.01, PI - 0.01 )
                          }
                          old_mx = ginfo_mx
                          old_my = ginfo_my
                      }
                      d3vrotate camera_x, camera_y, camera_z, 0, 0, CAMERA_R, 0, 1, 0, camera_phi
                      d3vrotate camera_x, camera_y, camera_z, camera_x, camera_y, camera_z, 0, 0, 1, camera_theta
                      d3setcam  camera_x, camera_y, camera_z
                      return

                  0
                    posted by higashijugem 16:46comments(0)|-|





                    点同士を繋ぐ線

                    点と点の間に直線を描写するプログラムです

                    点同士をドラッグすることで線を引けます


                    randomize
                    areal=20
                    sum=10
                    dim ptcct,sum,sum
                    cctnum=0
                    dim ptxy,2,sum
                    repeat sum
                        ptxy(0,cnt)=rnd(640),rnd(480)
                    loop
                    setid=-1
                    *main
                        mux=mousex:muy=mousey
                        ok1=k1:getkey k1,1:tk1=k1^ok1&k1:rk1=k1^ok1&ok1
                        color 255,255,255:boxf:color
                        if tk1{    ;点をクリック
                            repeat sum
                                len=sqrt(powf(mux-ptxy(0,cnt),2)+powf(muy-ptxy(1,cnt),2))
                                if len<=areal{
                                    setid=cnt
                                    break
                                }
                            loop
                        }
                        if k1{
                            if setid>=0{    ;別の点にドラッグすることでラインを描写
                                repeat sum
                                    len=sqrt(powf(mux-ptxy(0,cnt),2)+powf(muy-ptxy(1,cnt),2))
                                    if len<=areal{
                                        if cnt!=setid{
                                            ptcct(cnt,setid)=1
                                            ptcct(setid,cnt)=1
                                            setid=cnt
                                            break
                                        }
                                    }
                                loop
                            }
                        }else{
                            setid=-1
                        }
                        ;点描写
                        repeat sum
                            x=ptxy(0,cnt):y=ptxy(1,cnt)
                            circle x-10,y-10,x+10,y+10
                        loop
                        ;ライン描写
                        repeat sum-1:j=cnt
                            repeat sum-(j+1),j+1:i=cnt
                                if ptcct(i,j)=1{
                                    sx=ptxy(0,i):sy=ptxy(1,i)
                                    gx=ptxy(0,j):gy=ptxy(1,j)
                                    line gx,gy,sx,sy
                                }
                            loop
                        loop
                        redraw:await 17:redraw 0
                        goto *main

                    0
                      posted by higashijugem 22:34comments(0)|-|