HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0209
電子レンジ右上に文字が表示される10解決


電子レンジ

リンク

2017/2/9(Thu) 17:11:31|NO.78207

サンプルコードにプログラムを追加しながら、
プログラムを覚えていたら右上に文字が表示されるようになってしましました。
最初にinput命令を追加したことによって起きたことだと思うのですが、どのようにすれば
かいぜんできますか?
プログラムを読むのは大変だと思いますが、どうにかよろしくお願いします。
randomize
buffer 1
picload "ver.1.bmp"



screen 0,480,336
h="name"
cls 4
color 255,255,255
pos 150,100
mes"名前を入力してください。
pos 170,180

input h
button"Let'go",*aa
stop
*aa
cls 4
color 100,255,0
pos 150,100
font"MS 明朝",40
mes h +"の冒険"


pos 170,180
color 255,255,255
font"MS 明朝",20
mes"バージョン を入力
ve=""
pos 197,200
input brcc
button"go",*START
stop



*START
mmload ve +".wav",0,1

cls

gmode 2
gosub *SETMAP
MESSAGE=""

MHP=100 ;主人公のデータ
MLEVEL=1
MAT=1
MDF=3
EXP=0

;/■/■/■メインループ/■/■/■
*DRAWLOOP1

redraw 0
color 0,0,0 :boxf 0,0,479,335

;移動ルーチン
MDX=0 :MDY=0 ;カーソルキーに応じて移動量MDX,MDYを取得
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 ;移動量を足して、移動先の座標を求める
S=MAP(MMX,MMY) ;移動先のマップデータを変数Sに代入
if S>=400:gosub *TAKARABAKO ;移動先の物体に応じた処理
if S>=300 & S<=399 :gosub *ENCOUNT
if S>=200 and S<=299 :gosub *PUSHSW
if S>=100 and S<=199 { ;閉じたドアの処理
SS="A"
poke SS,0,'A'+S-(S/100*100)
MESSAGE=SS+"と書かれたドアは閉ざされている"
}
if S=3 :goto *GOAL
if S<2 {MX=MMX:MY=MMY} ;移動先が2未満ならそこに移動

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
await 80
goto *DRAWLOOP1

;/■/■/■マップ表示/■/■/■
*DRAWMAP

color 255,255,255 :boxf 0,0,480,280
SX=MX-5
if SX<0 :SX=0
if SX>34 :SX=34
SY=MY-4
if SY<0 :SY=0
if SY>36 :SY=36
repeat 9
YCNT=cnt
repeat 11
XCNT=10-cnt ;ループを逆にする
S=MAP(SX+XCNT,SY+YCNT)
pos (XCNT+YCNT)*24, (YCNT-XCNT)*12+120
if S<5 :gcopy 1,S*48,0,48,48 ;番号が0〜4の場合
if S>4 { ;番号が100〜499の場合
SS=S/100-1
gcopy 1,SS*48,48,48,48
}
if (SX+XCNT=MX) and (SY+YCNT=MY) :gcopy 1,192,0,48,48
loop
loop
return


;/■/■/■マップ初期化/■/■/■
*SETMAP

dim MAP,45,45
bload ve +".map",MAP
repeat 45 ;自キャラ位置取得
RCNT=cnt
repeat 45
if MAP(cnt,RCNT)=4 {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"
mmplay 0
return

;/■/■/■スイッチ発見/■/■/■
*PUSHSW
SW=MAP(MMX,MMY)-MAP(MMX,MMY)/100*100 ;下二桁を取得
SS="A"
poke SS,0,'a'+SW
dialog SS+"のスイッチです。\n押しますか?",2,"RPG"
if stat=7 :return
MESSAGE="何も起こらない"
SW=SW+100 ;ドアの番号を求める
repeat 45 ;対応するドアを探す
RCNT=cnt
repeat 45
if MAP(cnt,RCNT)=SW {
MAP(cnt,RCNT)=1
MESSAGE="どこかでギィッという音がした"
}
loop
loop
return

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

dialog ITEMNAME+"を拾いますか?",2,"RPG"
if stat=7 :return
if ITEMTYPE="H" {
notesel INVENT
noteadd ""+ITM,0
LEN=noteinfo(0)
if LEN>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 :SS=noteinfo(0) ;拾ったアイテムの数を求める
repeat SS ;アイテムの数だけループ
notesel INVENT :noteget T,cnt :ITM=int(T) ;アイテム番号を取り出す
notesel ITMDATA :noteget ITEMNAME,ITM*3 ;対応するデータを探す
T="A":poke T,0,cnt+65 ;アルファベットを作る
pos 84,cnt*16+136 :mes T+":"+ITEMNAME ;画面に表示
loop

*IVKYLOOP
KY=0
repeat SS
getkey KY,'A'+cnt
if KY=1 {
notesel INVENT :noteget T,cnt :ITM=int(T)
notedel cnt
notesel ITMDATA :noteget ITEMNAME,ITM*3
noteget T,ITM*3+2
MHP=MHP+T
MAXHP=MLEVEL*30+70
if MHP>MAXHP :MHP=MAXHP
MESSAGE=ITEMNAME+"を使った。体力が"+MHP+"に回復した"
break
}
loop
if KY=1 :return
getkey KY,'S' ;サブルーチン*DATASAVEを呼び出す
if KY=1 {gosub *DATASAVE :return}
getkey KY,'L' ;サブルーチン*DATALOADを呼び出す
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)-MAP(MMX,MMY)/100*100 ;モンスター番号取得
buffer 2 :picload "monster"+ENCT+".bmp"
gsel 0
notesel MONDATA
noteget SS,ENCT*6 :ENAME=SS
noteget SS,ENCT*6+1 :EHP=int(SS)
noteget SS,ENCT*6+2 :ELEVEL=int(SS)
noteget SS,ENCT*6+3 :EAT=int(SS)
noteget SS,ENCT*6+4 :EDF=int(SS)
noteget SS,ENCT*6+5 :ETMR=int(SS)

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
R=rnd(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 h +"あの攻撃が敵に" +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= h +"は命からがら逃げ出した"
return

*BKATI
GEXP=ELEVEL*ELEVEL*ELEVEL*49 ;獲得経験値計算
R=rnd(GEXP/5)-(GEXP/8)
GEXP=GEXP+R
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 h +"は敵に敗れた"
MESSAGE=""
wait 200
return

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

;/■/■/■ゲームクリアー/■/■/■
*GOAL
redraw 1
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



この記事に返信する


電子レンジ

リンク

2017/2/9(Thu) 17:12:16|NO.78208

ごめんなさい。
長いので読まなくていいです。



電子レンジ

リンク

2017/2/9(Thu) 17:17:07|NO.78209

32行目
brccではなくveです。



Sado

リンク

2017/2/10(Fri) 00:30:02|NO.78213

長いプログラムはpreタグで囲って下さい。
もう一つ、
>右上に文字が表示される
だけではコードをしっかり読まないと問題点を見つけることが困難です。
せめて、表示される文字の内容を教えてくださらないとです。



Sado

リンク

2017/2/10(Fri) 00:43:40|NO.78214

inputのオブジェクトは、メインループに入る前にclsで完全に消えていますので関係ありません。

mesのある部分だけ軽く見てみましたが、全てposは定数で指定されていますし、
戦闘シーンもmesの自動改行を利用しているようですので、おかしなモノは見つけられませんでした。
マップ・敵データの仕様も分からないので(調べるのが面倒なだけですが)、実行はできませんでした。

そちらのほうで、右上に意図せず文字を表示させている部分とその周辺の、条件式・ジャンプの流れをよく見直してみて下さい。



電子レンジ

リンク

2017/2/12(Sun) 15:14:44|NO.78246

>Sadoさん
表示されるのは、押したキーです。



電子レンジ

リンク

2017/2/12(Sun) 15:16:00|NO.78247

遅くなってごめんなさい!



Sado

リンク

2017/2/12(Sun) 17:20:16|NO.78251

>表示されるのは、押したキーです。
これだけでは該当する部分を予想するのが難しいんですって……もう少し詳しく……
とりあえず、キーを押した時の複雑なアクションをしているインベントリのルーチンだと予想して見てみますが、「実行」に必要なファイル群が不足していて詳しいデバッグはできません。

関係ないとは思いますが、現在位置のマップデータをSに代入して比較していますね。
2バイト文字のwpokeを見かけませんでしたが、255(FF)より大きな値を扱っているのはいったい……?



Sado

リンク

2017/2/12(Sun) 17:49:32|NO.78253

すみません、僕ではお力になれそうにありません。怪しい箇所も見つけられませんでした。
別で気がついたことですが、
メインルーチン(drawloop1)の最後でgosub*drawmapを実行しているのに、他所でもdrawmapへサブルーチンジャンプを繰り返しているようですが、これは必要な処理ですか?

個人的な感想ですけれど、以下の部分でちょっと迷子になりかけましたw
ラベル*BATTLESTARTはラベル*ENCOUNTからサブルーチンジャンプしてきて、あちこち行き、最終的にBkati/Bmakeラベルでreturnしていると気づくのに少し時間がかかってしまいました。



電子レンジ

リンク

2017/2/24(Fri) 19:50:35|NO.78309

ありがとうございました。
学年末テストがあったため、遅くなってしましました。



電子レンジ

リンク

2017/2/26(Sun) 18:45:25|NO.78320

なんとかなりそうなので閉じさせていただきます。



ONION software Copyright 1997-2023(c) All rights reserved.