[トップ][編集][ノート][編集履歴][一覧][最近の更新][->English]

HSPベンチマーク

HSPのベンチマーク


the Ackermann function

ソース

;HSP3用


#module
#deffunc A int x, int y

        if x == 0 {
                return y + 1
        }

        if y == 0 {
                A x - 1, 1
                return
        }
        else {
                A x, y - 1
                A x - 1, stat
                return
        }
#global

#uselib "winmm.dll"
#func timeGetTime "timeGetTime"

timeGetTime
s_time = stat

A 3, 4
result = stat

timeGetTime
e_time = stat

mes result
mes e_time - s_time

結果

  • 僕のところでは、20ミリ秒くらいで実行できました。
    でも、終了するとき、異常終了するようです。

多分、何かのベンチマーク

randomize
buffer 1
picload "rpg.bmp"

screen 0,480,336

*START
gmode 2
gosub *SETMAP
MESSAGE=""

MHP=100         ;主人公のデータ
MLEVEL=1
MAT=1
MDF=3
EXP=0
sdim INVENT,128 :INVENT=""

;/■/■/■メインループ/■/■/■
*LOOP1
redraw 0
color 0,0,0 :boxf 0,0,479,335

;移動ルーチン

MDX=0 :MDY=0
stick KY,15,1
if KY=1 :MDX=-1
if KY=4 :MDX=+1
if KY=2 :MDY=-1
if KY=8 :MDY=+1
if KY=16 :gosub *INVENTORY

MMX=MX+MDX :MMY=MY+MDY
if MAP.MMX.MMY>='タ':gosub *TAKARABAKO
if (MAP.MMX.MMY>='ア') and (MAP.MMX.MMY<='コ'):gosub *ENCOUNT
if (MAP.MMX.MMY>='a') and (MAP.MMX.MMY<='z') :gosub *PUSHSW
if (MAP.MMX.MMY>='A') and (MAP.MMX.MMY<='Z') {
        S="A"
        poke S,0,MAP.MMX.MMY
        MESSAGE=S+"と書かれたドアは閉ざされている"
}
if MAP.MMX.MMY<'3' {MX=MMX:MY=MMY}

if MX<0 :MX=0
if MX>44 :MX=44
if MY<0 :MY=0
if MY>44 :MY=44

;画面表示
gosub *DRAWMAP
color 255,255,255 :pos 0,288 :mes MESSAGE
redraw 1

if MHP<=0 :goto *GAMEOVER
if MAP.MX.MY='2' :goto *GOAL
await 80
goto *LOOP1

;/■/■/■マップ表示/■/■/■
*DRAWMAP
SX=MX-7
if SX<0 :SX=0
if SX>30 :SX=30
SY=MY-4
if SY<0 :SY=0
if SY>36 :SY=36
repeat 9
        RCNT=cnt
        repeat 15
                SSX=SX+cnt :SSY=SY+RCNT
                S=MAP.SSX.SSY
                if S>='タ' :SS=5
                if S<='ソ' :SS=0
                if S<='z' :SS=6
                if S<='Z' :SS=8
                if S<='9' :SS=S-'0'
                pos cnt*32,RCNT*32 :gcopy 1,32*SS,0,32,32
                if (S>='ア')and(S<='ソ') :gcopy 1,ANIM*32+64,32,32,32
        loop
loop
ANIM=ANIM+1 :if ANIM>1 :ANIM=0
pos (MX-SX)*32,(MY-SY)*32 :gcopy 1,ANIM*32,32,32,32
return

;/■/■/■マップ初期化/■/■/■
*SETMAP
ASC=0
dim MAP,45,45
alloc MAPS,2115
bload "rpgmap.txt",MAPS
repeat 45
        RCNT=cnt
        repeat 45
                peek ASC,MAPS,RCNT*47+cnt
                MAP.cnt.RCNT=ASC
                if ASC='9' {MX=cnt :MY=RCNT :MAP.cnt.RCNT='0'}  
        loop
loop

sdim MONDATA,128:notesel MONDATA
noteload "monster.txt"
sdim ITMDATA,128:notesel ITMDATA
noteload "item.txt"
return


;/■/■/■スイッチ発見/■/■/■
*PUSHSW
S="A"
poke S,0,MAP.MMX.MMY
S=S+"のスイッチです。\n押しますか?"
dialog S,2,"RPG"
if stat=7 :return
MESSAGE="何も起こらない"
SS=MAP.MMX.MMY-32       ;小文字を大文字にする
repeat 45
        RCNT=cnt
        repeat 45
                if MAP.cnt.RCNT=SS {
                        MAP.cnt.RCNT='1'
                        MESSAGE="どこかでギィッという音がした"
                }
        loop
loop
return

;/■/■/■宝箱発見/■/■/■
*TAKARABAKO
dialog "宝箱がある\n開けますか?",2,"RPG"
if stat=7 :return
ITM=MAP.MMX.MMY-'タ'             ;アイテム番号取得
notesel ITMDATA
noteget ITEMNAME,ITM*3 
noteget S,ITM*3+1 :ITEMTYPE=S
noteget S,ITM*3+2 :ITEMVAL=0+S

dialog ITEMNAME+"を拾いますか?",2,"RPG"
if stat=7 :return
if ITEMTYPE="H" {
        notesel INVENT
        noteadd ""+ITM,0
        notemax SS
        if SS>6 :notedel 6
}
if ITEMTYPE="S" {
        MAT=ITEMVAL
}
if ITEMTYPE="A" {
        MDF=ITEMVAL
}
MESSAGE=ITEMNAME+"を手に入れた"
MAP.MMX.MMY='0'
return

;/■/■/■アイテム一覧/■/■/■
*INVENTORY
gosub *DRAWMAP
redraw 1
color 0,0,0 :boxf 80,40,400,240
color 255,255,255
pos 84,44 :mes "レベル"+MLEVEL+" 体力"+MHP+" 攻撃力"+MAT+" 防御力"+MDF
NEXP=(MLEVEL*MLEVEL*MLEVEL*246)-EXP
pos 84,60 :mes "経験値"+EXP+"(次のレベルに"+NEXP+"必要)"
pos 84,90 :mes "セーブ:S、ロード:L"
pos 84,120 :mes "アイテム(使う:A〜F、閉じる:スペース)"
notesel INVENT :notemax SS
repeat SS
        notesel INVENT :noteget S,cnt :ITM=0+S
        notesel ITMDATA :noteget ITEMNAME,ITM*3
        S="A":poke S,0,cnt+65
        pos 84,cnt*16+136 :mes S+":"+ITEMNAME
loop

*IVKYLOOP
KY=0
repeat SS
        getkey KY,'A'+cnt
        if KY=1 {
                notesel INVENT :noteget S,cnt :ITM=0+S
                notedel cnt
                notesel ITMDATA :noteget ITEMNAME,ITM*3
                noteget S,ITM*3+2
                MHP=MHP+S
                MAXHP=MLEVEL*30+70
                if MHP>MAXHP :MHP=MAXHP         
                MESSAGE=ITEMNAME+"を使った。体力が"+MHP+"に回復した"
                break
        }
loop
if KY=1 :return
getkey KY,'S'
if KY=1 {gosub *DATASAVE :return}
getkey KY,'L'
if KY=1 {gosub *DATALOAD :return}
stick KY
if KY=16 :return
wait 5
goto *IVKYLOOP

;/■/■/■データのセーブ/■/■/■
*DATASAVE
dim SDATA,7
SDATA.0=MHP :SDATA.1=MLEVEL :SDATA.2=MAT
SDATA.3=MDF :SDATA.4=EXP
SDATA.5=MX  :SDATA.6=MY
bsave "save1.dat",SDATA
notesel INVENT
notesave "save2.dat"
bsave "save3.dat",MAP
MESSAGE="データをセーブした"
return

;/■/■/■データのロード/■/■/■
*DATALOAD
dim SDATA,7
bload "save1.dat",SDATA
MHP=SDATA.0 :MLEVEL=SDATA.1 :MAT=SDATA.2
MDF=SDATA.3 :EXP=SDATA.4
MX=SDATA.5  :MY=SDATA.6
notesel INVENT
noteload "save2.dat"
bload "save3.dat",MAP
MESSAGE="データをロードした"
return

;/■/■/■怪しい気配発見/■/■/■
*ENCOUNT
dialog "怪しげな気配がある\n踏み込みますか?",2,"RPG"
if stat=7 :return
ENCT=MAP.MMX.MMY-'ア'            ;モンスター番号取得
buffer 2 :picload "monster"+ENCT+".bmp"
gsel 0
notesel MONDATA
noteget S,ENCT*6   :ENAME=S
noteget S,ENCT*6+1 :EHP=0+S
noteget S,ENCT*6+2 :ELEVEL=0+S
noteget S,ENCT*6+3 :EAT=0+S
noteget S,ENCT*6+4 :EDF=0+S
noteget S,ENCT*6+5 :ETMR=0+S

gosub *BATTLESTART
return

;/■/■/■モンスターとの戦闘/■/■/■
*BATTLESTART
gosub *DRAWMAP
redraw 1
pos 80,40 :gcopy 2,0,0,320,220
color 255,255,255 :pos 0,288 :mes ENAME+"が現れた"
wait 100

ETM=0
*BATTLE         ;戦闘
color 0,0,0:boxf 0,288,479,335
color 255,0,0 :pos 0,288 :mes "どうする(攻撃A、防御D、逃げるE)?"
color 255,255,255
DICENUM=MLEVEL*2
gosub *DICE
*KYLOOP
getkey KY,'A'
if KY=1 :goto *ATTACK
getkey KY,'D'
if KY=1 :goto *DEFENCE
getkey KY,'E'
if KY=1 :goto *ESCAPE
wait 5
goto *KYLOOP

*ATTACK
CMAT=DICEVAL+MAT
CMDF=MDF
goto *ENEMY

*DEFENCE
CMAT=0
CMDF=DICEVAL+MDF

*ENEMY
DICENUM=ELEVEL*2
gosub *DICE
RND R,10
if R<ETMR {
        ETM=ETM+DICEVAL+EAT :CEAT=0
}
else {
        CEAT=DICEVAL+EAT+ETM :ETM=0
}
CEDF=EDF
;ダメージ判定
MDAMAGE=CEAT-CMDF :if MDAMAGE<0 :MDAMAGE=0
EDAMAGE=CMAT-CEDF :if EDAMAGE<0 :EDAMAGE=0
MHP=MHP-MDAMAGE :if MHP<0 :MHP=0
EHP=EHP-EDAMAGE :if EHP<0 :EHP=0

color 0,0,0:boxf 0,288,479,335
color 255,255,255 :pos 0,288 
mes "あなたの攻撃が敵に" +EDAMAGE+"のダメージを与えた!"
wait 50
if (ETM >0)and (EHP>0) {
        mes "敵は力をためている"
} else :mes "敵から"+MDAMAGE+"のダメージを受けた"
wait 100
color 0,0,0:boxf 0,288,479,335
color 255,255,255 :pos 0,288 :mes "自分の体力"+MHP+"、敵の体力"+EHP
wait 100
if (EHP<=0) and (MHP>0) :goto *BKATI
if MHP<=0 :goto *BMAKE
goto *BATTLE

*ESCAPE
MESSAGE="あなたは命からがら逃げ出した"
return

*BKATI
GEXP=ELEVEL*ELEVEL*ELEVEL*49    ;獲得経験値計算
RND R,(GEXP/10)
GEXP=GEXP+R-(GEXP/20)
EXP=EXP+GEXP
NEXP=(MLEVEL*MLEVEL*MLEVEL*246)-EXP
color 0,0,0:boxf 0,288,479,335
color 255,255,255 :pos 0,288 :mes ENAME+"を倒した"
mes "経験値"+GEXP+"を得た(次のレベルアップに"+NEXP+"必要)"
MAP.MMX.MMY='0'
if NEXP<=0 {
        wait 100
        color 0,0,0:boxf 0,288,479,335
        color 255,255,255 :pos 0,288 :mes "レベルアップ!"
        MLEVEL=MLEVEL+1
}
MESSAGE=""
wait 200
return

*BMAKE
color 0,0,0:boxf 0,288,479,335
color 255,255,255 :pos 0,288 :mes "あなたは敵に敗れた"
MESSAGE=""
wait 200
return

;/■/■/■サイコロ投げ/■/■/■
*DICE
DICEVAL=0
repeat DICENUM
        RND R,6
        DICEVAL=DICEVAL+R+1
loop
return

;/■/■/■ゲームクリアー/■/■/■
*GOAL
color 0,200,255 :font "MS ゴシック",30,1
pos 140,140 :mes "STAGECLEAR"
wait 400
END

;/■/■/■ゲームオーバー/■/■/■
*GAMEOVER
color 255,0,0 :font "MS ゴシック",30,1
pos 160,160 :mes "GAMEOVER"
wait 200
sysfont
dialog "REPLAY?",2,"GAMEOVER"
if stat=6 : goto *START
end