RECOMMEND
SELECTED ENTRIES
CATEGORIES
ARCHIVES
MOBILE
qrcode
LINKS
PROFILE
OTHERS

04
--
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
--
>>
<<
--

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

私がその日作った短めのソースを簡単な解説とともに載せていきます。
ゲーム制作初心者にとって参考になるかもしれないソースが多いです。
主にHSPでプログラミングされています。
文字列を数値配列に変換
0

    文字列で作成されたマップ情報を、int型配列に代入するプログラムです

     


    #module
    ;マップ情報配列(代入先)、マップ情報(文字列)、横幅、縦幅
    #deffunc mapstr_int array mapdt,var mapstr,var mc,var mr
        b=""
        i=0
        mcsetflg=1
        repeat
            getstr b,mapstr,i,','
            if strsize<=0{break}
            if mcsetflg{
                if strsize=2{mc++}
            }
            if strsize=3{mr++:mcsetflg=0:x=0:y+20}
            mapdt(cnt)=int(b)
            i=i+strsize
        loop

        if mcsetflg=0{mc++}
        return
    #global
    ;マップ情報(文字列)
    mapstr={"
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0
    0,0,0,0,0,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0
    0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0
    0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0
    0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0
    0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0
    0,0,1,1,1,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0
    0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0
    0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
    0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
    0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0
    0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
    0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0
    0,0,1,1,1,1,0,1,1,1,1,1,1,1,1,0,0,0,0,0
    0,0,0,0,0,1,0,0,1,1,1,1,1,1,1,1,0,0,0,0
    0,0,0,0,0,0,0,1,1,1,1,0,1,0,1,0,0,0,0,0
    0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,1,1,0,0
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    "}
    ;マップ情報配列(代入先)
    dim mapdt
    mc=0:mr=0    ;横幅、縦幅
    mapstr_int mapdt,mapstr,mc,mr
    ;描写
    title""+mc+", "+mr
    csz=16
    repeat mr:j=cnt
        repeat mc:i=cnt
            pos i*csz,j*csz:mes""+strf("%c",46+mapdt(j*mc+i))
        loop
    loop

    | HSP | 20:39 | comments(0) | - | - |
    歯車
    0

      歯車を描写し、回転させるプログラムです

      プログラムでは三つ表示させています

       


      #module
          ;情報を入れる配列、配列番号、仮想画面番号、X座標、Y座標、半径、回転方向
      #deffunc gearcreate array geardt,int gearid,double bufid,double x,double y,double r,double dirflg
          cenx=r+15:ceny=r+15        ;歯車の半径
          buffer bufid,cenx*2,ceny*2:color:boxf:celdiv bufid,cenx*2,ceny*2,cenx,ceny
          color 255,255,255
          circle cenx-r,ceny-r,cenx+r,ceny+r
          hasuu=r/3    ;歯数
          ;歯を描写
          dirplus=360.0/hasuu
          dir=hasuu*bufid
          repeat hasuu
              line cenx,ceny,(r+15)*cos(deg2rad(dir))+cenx,(r+15)*sin(deg2rad(dir))+ceny
              dir+dirplus
          loop
          if dirflg!=0{
              h0=360.0/r*0.1
          }else{
              h0=-360.0/r*0.1
          }
          geardt(0,gearid)=bufid, x, y, 0.0, h0
          return
      #global
      ;歯車情報設定
      ddim geardt,5,3        ;仮想画面番号、X座標、Y座標、画像の傾き、回転速度
      gearcreate geardt,0,2,105,100,36,0
      gearcreate geardt,1,3,235,100,72,1
      gearcreate geardt,2,4,333,203,48,0
      ;描写処理
      gsel
      gmode 2
      repeat
          color:boxf
          repeat 3
              pos geardt(1,cnt),geardt(2,cnt)
              celput geardt(0,cnt),0,,,deg2rad(geardt(3,cnt))
              geardt(3,cnt)+geardt(4,cnt)
          loop
          redraw:await 17:redraw 0
      loop

      | HSP | 20:09 | comments(0) | - | - |
      指定座標に寄せるランダム配置
      0

        最初の位置から移動しながらマスを配置する場合、

        普通のランダムではポジションがあちこちに飛んでってしまい、歪な形になってしまいます

        このプログラムでは中心から離れれば離れるほど

        中心に近づく方向にポジションが移動するようにしました

        言葉では分かりにくいという人は、実際に実行してみるとよいでしょう

        「比較用コード」をコメントアウトから復帰させると違いが分かります

         


        ;中心に近づくランダム配置
        #include"hspda.as"
        rndf_ini 0

        mc=25:mr=25:csz=16
        dim map,mc,mr

        startx=mc/2:starty=mr/2
        map(startx,starty)=1
        px=startx:py=starty
        repul=1        ;中心に引っ張る力(1が最大)
        part=1.0/(4*(repul))*(repul-1)
        s=1.0/((startx+starty+(mc-startx-1)+(mr-starty-1))*repul)

        ddim dir,4
        repeat 200
            dir(0)=s*px+part    ;上下左右に移動する確率を
            dir(1)=s*py+part    ;その都度指定
            dir(2)=s*(mc-px-1)+part
            dir(3)=s*(mr-py-1)+part
            rndf_get set
            
            r=0:chkr=0.0
            repeat 4
                chkr+=dir(cnt)
                if set<=chkr{
                    r=cnt:break
                }
            loop
            
            ;rndf_get set:r=0+set*4    ;比較用コード
            
            if r=0{        ;移動
                if 0<px{
                    px--
                }
            }else:if r=1{
                if 0<py{
                    py--
                }
            }else:if r=2{
                if px<mc-1{
                    px++
                }
            }else{
                if py<mr-1{
                    py++
                }
            }
            map(px,py)=1
        loop
        ;描写
        repeat mr:c1=cnt
            repeat mc
                pos cnt*csz,c1*csz
                if map(cnt,c1)=0{
                    mes"."
                }else:if map(cnt,c1)=1{
                    mes"*"
                }
            loop
        loop

        | HSP | 11:01 | comments(0) | - | - |
        一日ゲームNo.13「七並べ」
        0

          一日ゲーム第十三弾は、カードゲーム「7並べ」です

          ルールは通常の7並べと同じです

          すでに配置されているカードの隣のスペースをクリックし、手持ちに対応したカードがあれば配置します

          相手のターンは自動で進行します

           

          操作説明:

           左クリック・・・カード配置

           右クリック・・・パス

           

          ダウンロード

           

          | 一日ゲーム | 10:36 | comments(0) | - | - |
          スロット
          0

            カジノやゲームセンターによくある、横一列にマークを揃えるルーレットです

            クリックすることで左から順にルーレットを止めます

             


            markmax=6
            font msgothic,40
            randomize
            sdim slotmark,,markmax,3
            repeat 3
                slotmark(0,cnt)="A","B","C","D","E","S"
            loop
            dim slotpoint,3

            gosub *begin
            repeat
                ok1=k1:getkey k1,1:tk1=k1^ok1&k1:rk1=k1^ok1&ok1
                if tk1{        ;左クリック
                    setid++
                    if setid=3{    ;三つ止めたら結果表示
                        gosub *result
                        gosub *begin
                    }else{    ;一つ止めるごとにスピードアップ
                        spdmax/=2
                    }
                }
                if spdtime{
                    spdtime--
                }else{
                    repeat 3-setid,setid
                        slotpoint(cnt)=(slotpoint(cnt)+1)¥markmax
                    loop
                    spdtime=spdmax
                }
                gosub *slotdraw
                redraw:await 17:redraw 0
            loop
            stop
            *result
                score=10
                h0=slotpoint(0)
                repeat 2,1
                    if slotpoint(cnt)=h0{
                        score*10
                    }
                loop
                if slotmark(slotpoint(0),0)="S"{    ;Sを揃えるとスコア10000点
                    score*10
                }
                dialog"score : "+score
                return
            *begin
                repeat 3
                    slotpoint(cnt)=rnd(markmax)
                loop
                spdmax=20
                spdtime=0
                setid=0
                return
            *slotdraw
                color 255,255,255:boxf:color
                x=200:y=200
                repeat 3
                    pos x,y:mes""+slotmark(slotpoint(cnt),cnt)
                    x+50
                loop
                return

            | HSP | 10:02 | comments(0) | - | - |
            一日ゲームNo.12「ピラミッド」
            0

              一日ゲーム第十弾、「ピラミッド」というトランプを使ったカードゲームです

              詳しいルールはこちらのサイトに書いてあります。

               

              左クリックでカードを選択、選択したカードは青線で囲まれます

              右クリックで選択したカードを解除します

              右下のカード群が手札です、クリックすることで次々とカードを指定できます

              カードを消せなくなったら左上のボタンを押すと最初からやり直せます

               

              合計が13になるようにカードを選び、ピラミッドのカードがなくなればゲームクリアです

               

              ダウンロード

               

              | 一日ゲーム | 09:11 | comments(0) | - | - |
              ビンゴゲーム
              0

                ビンゴゲームのプログラムです

                左上にあるボタンを押すことで操作を行います

                数字を見つけやすいように、左の縦列から0~19、20~39、40~59・・・の範囲の数字を割り当てています

                 


                randomize
                pos 10,40:button gosub "ルーレット",*but0

                gosub *gameset    ;ゲーム初期化
                gosub *draw        ;描写
                stop
                *but0    ;ボタンを押したときの処理(2工程)
                    turnflg^1
                    if turnflg{    ;番号を表示
                        id=numlist(nlid):nlid++
                        objprm 0,"次へ"
                    }else{        ;ボードのチェック
                        turn++
                        gosub *boardcheck
                        objprm 0,"ルーレット"
                    }
                    gosub *draw
                    return
                *boardcheck    ;数字が出たらボードのラインをチェック
                    bkflg=0    ;該当する番号があればボードに穴を開ける
                    repeat 5:j=cnt
                        repeat 5:i=cnt
                            if board(i,j)=id{
                                bdflg(i,j)=1
                                bkflg=1:break
                            }
                        loop
                        if bkflg:break
                    loop
                    flg=0    ;横と縦のラインをチェック
                    repeat 5:j=cnt
                        count1=0:count2=0
                        repeat 5:i=cnt
                            if bdflg(i,j)=1{count1++}
                            if bdflg(j,i)=1{count2++}
                        loop
                        if count1=5|count2=5{
                            flg=1:break
                        }
                    loop
                    if flg=0{    ;斜めのラインをチェック
                        count1=0:count2=0
                        repeat 5:i=cnt:j=4-cnt
                            if bdflg(i,cnt)=1{count1++}
                            if bdflg(j,cnt)=1{count2++}
                        loop
                        if count1=5|count2=5{
                            flg=1
                        }
                    }
                    if flg{        ;ビンゴなら
                        gosub *draw
                        dialog"BINGO!"
                        stop
                    }
                    return
                *gameset
                    dim board,5,5
                    dim bdflg,5,5
                    repeat 5:j=cnt    ;数字が被らないようボードに配置
                        dim kekka,20
                        repeat 20
                            value=rnd(cnt + 1)
                            kekka(cnt) = kekka(value)
                            kekka(value) = cnt
                        loop
                        repeat 5
                            board(j,cnt)=kekka(cnt)+(j*20)
                        loop
                    loop
                    dim numlist,100        ;順番に取り出す数字の羅列を作る
                    repeat 100
                        value=rnd(cnt + 1)
                        numlist(cnt) = numlist(value)
                        numlist(value) = cnt
                    loop
                    turnflg=0
                    nlid=0
                    turn=0
                    return
                *draw
                    gmode 2
                    title"ターン:"+turn
                    color 255,255,255:boxf:color
                    if turnflg=0{
                        sysfont
                        pos 10,10:mes"ボタンを押すと番号が出ます"
                    }else{
                        font msgothic,40
                        pos 300,50:mes""+id
                    }
                    font msgothic,28
                    x=200:y=200
                    repeat 5:j=cnt
                        repeat 5:i=cnt
                            if bdflg(i,j){
                                tx=i*40+x+14:ty=j*40+y+14
                                circle tx-14,ty-14,tx+14,ty+14
                            }else{
                                pos i*40+x,j*40+y:mes""+board(i,j)
                            }
                        loop
                    loop
                    redraw:await 17:redraw 0
                    return

                | HSP | 08:47 | comments(0) | - | - |
                異なるウィンドウのオブジェクトを同時に動かす
                0

                  別々のウィンドウに表示された図形を動かすプログラムです

                  どちらか片方の図形をドラッグさせると、もう片方の図形も同じように移動します

                   


                  randomize
                  buffer 2:r=100:color 255    ;オブジェクト生成
                  boxf 320-r,240-r,320+r,240+r

                  screen 3    ;ウィンドウ1
                  screen 0    ;ウィンドウ2
                  ltx=0:lty=0
                  gsel 3:gcopy 2,ltx,lty,640,480:color 255,255,255
                  gsel 0:gcopy 2,ltx,lty,640,480:color 255,255,255
                  repeat
                      ok1=k1:getkey k1,1:tk1=k1^ok1&k1:rk1=k1^ok1&ok1
                      if ginfo_act>=0{    ;ウィンドウ1か2がアクティブの場合
                          gsel ginfo_act
                          hspflg=1
                      }else{
                          hspflg=0
                      }
                      if hspflg{    ;ドラッグすることで図形が動く
                          if tk1{
                              dragflg=1
                              sx=mousex+ltx:sy=mousey+lty
                          }
                          if k1{
                              ltx=sx-mousex
                              lty=sy-mousey
                              gsel 3:redraw 0:boxf:gcopy 2,ltx,lty,640,480:redraw
                              gsel 0:redraw 0:boxf:gcopy 2,ltx,lty,640,480:redraw
                          }else{
                              dragflg=0
                          }
                      }
                      await 17
                  loop

                  | HSP | 14:24 | comments(0) | - | - |
                  全角半角の判定
                  0

                    取得した部分が全角文字か半角文字かを区別するプログラムです

                    全角なら1、半角なら0が割り当てられます

                     


                    moji="HSPでプログラミング"
                    id=0
                    repeat strlen(moji)
                        chk=peek(moji,id)
                        if (chk>128&chk<160)|chk>223{res=1:len=2}    ;全角文字
                        else:if chk!=0{res=0:len=1}        ;半角文字
                        else{res=-1:break}        ;範囲外
                        mes""+strmid(moji,id,len)+", "+res
                        id+=len
                    loop

                    | HSP | 17:40 | comments(0) | - | - |
                    トラクトリックス
                    0

                      トラクトリックスという曲線を描写するプログラムです

                      追跡線、牽引線、引弧線、犬曲線とも呼ばれます

                      トラクトリックスについてはこちらをどうぞ

                      aは定数であり、yの最大値を表します

                       

                       

                      orix=320:oriy=240    ;原点
                      scalex=50:scaley=50    ;一目盛りの大きさ
                      ;XY軸(長さは適当)
                      wh=320
                      line orix-wh,oriy,orix+wh,oriy
                      line orix,oriy-wh,orix,oriy+wh
                      ;軸の目盛り
                      dim memx:memx=-4,-2,2,4
                      dim memy:memy=-1,1
                      repeat length(memx)
                          mem=memx(cnt)
                          x=orix+scalex*mem
                          line x,oriy-5,x,oriy+5:pos x-5,oriy+7:mes""+mem
                      loop
                      repeat length(memy)
                          mem=memy(cnt)
                          y=oriy-scaley*mem
                          line orix-5,y,orix+5,y:pos orix+7,y-8:mes""+mem
                      loop
                      ;トラクトリックス
                      y=0.01
                      xm=-10:xp=10
                      a=1.0
                      repeat
                          ty=y+0.01
                          if ty>=a{break}
                          root=sqrt(a*a-ty*ty)
                          txm=a*logf((a-root)/ty)+root
                          txp=a*logf((a+root)/ty)-root
                          ex=txm*scalex+orix:ey=-ty*scaley+oriy
                          sx=xm*scalex+orix:sy=-y*scaley+oriy
                          line ex,ey,sx,sy
                          ex=txp*scalex+orix:ey=-ty*scaley+oriy
                          sx=xp*scalex+orix:sy=-y*scaley+oriy
                          line ex,ey,sx,sy
                          y=ty
                          xm=txm:xp=txp
                      loop

                      | HSP | 12:58 | comments(0) | - | - |