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

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


<< ダイクストラ法 | main | キャラクターアニメーション(DirectX) >>



文字列の計算式

テキストボックスに数式を入力し、その数式を計算して解答を求めるプログラムです

実数の計算も行えます

2019/3/2 バグを見つけたので修正しました

 


calctext="(2+3*4+(10-5))"
pos 20,20:input calctext,240,24
pos 300,20:button goto "=",*calc
pos 370,20:input answertext,70,24:objid=stat
pos 20,50
mes"※使用可能な文字は「.0123456789+-*/()」です"
mes"※半角文字で入力してください"
mes"※「=」を押すと結果が表示されます"
stop
*calc
    sdim fmldt,,100
    dim symdt,100
    id=0:dtid=0
    errflg=0
    blocknum=0
    repeat
        val=peek(calctext,id)
        numstr=strmid(calctext,id,1)
        if val=46|(48<=val&val<=57){    ;.0〜9
            repeat
                tval=peek(calctext,id)
                tnumstr=strmid(calctext,id,1)
                if tval=46|(48<=tval&tval<=57){
                    fmldt(dtid)+=tnumstr
                    id++
                }else{
                    id--
                    break
                }
                await
            loop
            if dtid>=2{
                repeat
                    if dtid-1<0:break
                    if symdt(dtid-1)=1{
                        gosub *calcprogram
                        if errflg:break
                    }else{
                        break
                    }
                loop
            }
        }else:if val=41{    ;)
            if blocknum>=1{
                dtid--
                if symdt(dtid-1)=2{
                    fmldt(dtid-1)=fmldt(dtid)
                    fmldt(dtid)=""
                    symdt(dtid-1)=0
                    dtid--
                }else{
                    repeat
                        gosub *calcprogram
                        if errflg:break
                        if symdt(dtid-1)=2{
                            fmldt(dtid-1)=fmldt(dtid)
                            fmldt(dtid)=""
                            symdt(dtid-1)=0
                            dtid--
                            break
                        }
                        await
                    loop
                }
                if dtid>=2{
                    repeat
                        if dtid-1<0:break
                        if symdt(dtid-1)=1{
                            gosub *calcprogram
                            if errflg:break
                        }else{
                            break
                        }
                    loop
                }
            }else{
                errflg=1
            }
            blocknum--
        }else:if val=40{    ;(
            fmldt(dtid)=numstr
            symdt(dtid)=2
            blocknum++
        }else:if val=42|val=47{    ;*/^
            fmldt(dtid)=numstr
            symdt(dtid)=1
        }else:if val=43|val=45{    ;-+
            fmldt(dtid)=numstr
        }else{    ;式の終わり
            dtid--
            repeat
                gosub *calcprogram
                if errflg:break
                if dtid<=0:break
                await
            loop
            break
        }
        id++:dtid++
        if errflg:break
        await
    loop
    answertext=double(fmldt(0))    ;答え
    objprm objid,answertext
    if errflg{
        dialog"式が正しくありません"
    }
    stop
*calcprogram    ;計算処理
    if dtid=0{
        return
    }else:if dtid=1{
        errflg=1
        return
    }
    num1=double(fmldt(dtid))
    ope=fmldt(dtid-1)
    num2=double(fmldt(dtid-2))
    if ope="+"{
        set=num2+num1
    }else:if ope="-"{
        set=num2-num1
    }else:if ope="*"{
        set=num2*num1
    }else:if ope="/"{
        set=num2/num1
    }else{
        errflg=1
    }
    fmldt(dtid)=""
    fmldt(dtid-1)=""
    fmldt(dtid-2)=str(set)
    symdt(dtid)=0
    symdt(dtid-1)=0
    symdt(dtid-2)=0
    dtid-2
    return

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


    この記事に対するコメント