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


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
0512
ジャンプのできないマリオなぜ配列の要素が無効なのか9解決


ジャンプのできないマリオ

リンク

2019/5/12(Sun) 11:22:15|NO.87295

HSP初心者です。質問をさせていただきます。
リアルタイムで線を引けるあみだくじのゲームを作っています。
ゲーム内容の構想もでき、あとはプログラミングを済ませるだけなのですが、
いざテストプレイしようとしてみると、
#Error7 in line 68(???)
-->配列の要素が無効です。
とでてしまい、プログラミングをテストする事も出来ず困ってます。

以下に描画部分以外のプログラミングを置かせていただきます。


;xは現在のx座標 ;yは現在のy座標 //スタート時のx,y座標です。 x=50 y=0 remindx=50 remindy=0 // linepower=0 reB=0 dim remindB1(reB),10 dim remindB2(reB),10 dim remindB3(reB),10 remindB1(reB)=0 remindB2(reB)=0 remindB3(reB)=0 reB=0 gsel 0,0 line 100,0,100,400 line 300,0,300,400 line 600,0,600,400 *main gsel 0,0 a=mousex b=mousey //線のx座標です。line1<line2<line3は守ること line1=50 line2=300 line3=600 //描画自由パート // redraw 1 await 20 redraw 0 color 255,255,255 boxf color //線の再描画をします line line1,0,line1,400 line line2,0,line2,400 line line3,0,line3,400 // //現在引いている線の描画をします。無い場合は*main3に飛びます color 100,100,100 if remindB1(reB)=0:if remindB2(reB)=0:if remindB3(reB)=0:goto *main3 if remindB1(reB)=0:line line2,remindB2(reB),a,b if remindB2(reB)=0:if linepower=1:line line1,remindB1(reB),a,b:else : if linepower=3:line 3,remindB3(reB),a,b if remindB3(reB)=0:line line2,remindB2(reB),a,b // *main3 color remindB=reB//現在の線につけられたナンバーを記憶します reB=0  //過去引いた線の再描画をします。 repeat *remain if reB=4:break if remindB1(reB)=0:if remindB3(reB)=0:reB=reB+1:goto *remain:else :goto *remain2 if remindB2(reB)=0:reB=reB+1:goto *remain if remindB3(reB)=0:if remindB1(reB)=0:reB=reB+1:goto *remain:else :goto *remain3 reB=reB+1 loop *remain2 line line2,remindB2(reB),line3,remindB3(reB) reB=reB+1 goto *remain *remain3 line line2,remindB2(reB),line1,remindB1(reB) reB=reB+1 goto *remain reB=remindB //ナンバーを戻します。 *main2 color 255,0,0:pset x,y:pset remindx,remindy //あみだ現在の位置を示す赤ポチの描画をします。 //赤ぽちの逆流防止弁です。前回分の赤ぽちを描画します。 remindx=x  remindy=y // //あみだの赤ぽちの移動を制御します color pget x+1,y if ginfo_r=0:if ginfo_g=0:if ginfo_b=0:color 255,0,0:pset x,y:x=x+1:R=1:L=0:goto *draw1 pget x+1,y+1 if R=1:if ginfo_r=0:if ginfo_g=0:if ginfo_b=0:color 255,0,0:pset x,y:x=x+1:y=y+1:goto *draw1 pget x-1,y if ginfo_r=0:if ginfo_g=0:if ginfo_b=0:color 255,0,0:pset x,y:x=x-1:L=1:R=0:goto *draw1 pget x-1,y+1 if L=1:if ginfo_r=0:if ginfo_g=0:if ginfo_b=0:color 255,0,0:pset x,y:x=x-1:y=y+1:goto *draw1 pget x,y+1 if ginfo_r=0:if ginfo_g=0:if ginfo_b=0:color 255,0,0:R=0:L=0:pset x,y:y=y+1:goto *draw1 pget x,y+1 if ginfo_r=100:if ginfo_g=100:if ginfo_b=100:color 255,0,0:R=0:L=0:pset x,y:y=y+1:goto *draw1 end//一番下までいったら終わりです。 ;ここまでが線の追従プログラムです。 *draw1 getkey key,1 if after=1:if key&1:goto *main after=0 if key&1:goto *draw2 remindB1(reB)=0 remindB2(reB)=0 remindB3(reB)=0 goto *main *draw2 color 100,100,100 if a=line1:remindB1(reB)=b:if remindB2(reB)=0 :linepower=1:goto *main :else :color :reB=reB+1:after=1:goto *main if a=line2:remindB2(reB)=b:if remindB1(reB)=0 :goto *main :else :if remindB3(reB)=0 :goto *main: else :color :reB=reB+1:after=1:goto *main if a=line3:remindB3(reB)=b:if remindB2(reB)=0 :linepower=3:goto *main :else :color :reB=reB+1:after=1:goto *main goto *main

初心者故つたないプログラミングで読みずらい点も多いと思いますが、返信お願いします!



この記事に返信する


Ponyo

リンク

2019/5/12(Sun) 12:07:13|NO.87296

dim命令で全ての配列変数(remindB1, remindB2, remindB3)の要素の最大を10個に指定していますが、
エラーの場所は配列変数remindB1に10番目を指定しています。

dimで定義した要素の最大からは以下が使用できます。

remindB1(0), remindB1(1), remindB1(2) ・・・ remindB1(8), remindB1(9)

エラー箇所ではremindB1(10)という存在しない要素を指定しています。
恐らく、reBをきちんと0(初期化)していないのが原因かと思われます。



Ponyo

リンク

2019/5/12(Sun) 12:13:21|NO.87297

分かりにくいと思うのでエラーサンプルを提供します。

dim a, 10 mes a(10) ; ←エラー stop



ジャンプのできないマリオ

リンク

2019/5/12(Sun) 13:26:47|NO.87298

>>Ponyoさん
返信していただきありがとうございます。
プログラミングが動くよう尽力したのですが、力不足で自力では修正箇所をどのように変更すればよいかわかりませんでした。
失礼ながら編集した私のプログラミングを送っていただけないでしょうか。



KA

リンク

2019/5/12(Sun) 15:27:05|NO.87299

repeat中にgotoで抜けて戻ったりしているのが原因です。
他にもif文の書き方などが怪しいですよ。

>>いざテストプレイしようとしてみると・・・
>>自力では修正箇所をどのように変更すれば・・・
どういう動作で、どういう状態が正常なのかは、あなたにしか
分かりません。せめて「どう動作する事を期待して、こう書い
ている」という風なコメントを各行に書きましょう。

ここまで作って初めてテストするのも分かりにくくなる原因で
す、普通は部分部分の動作をテストしながら作りますよ。



KA

リンク

2019/5/12(Sun) 15:50:54|NO.87300

ついでに

>>repeat
>>*remain
>>if reB=4:break
>>if remindB1(reB)=0:if remindB3(reB)=0:reB=reB+1:goto *remain:else :goto *remain2
>>if remindB2(reB)=0:reB=reB+1:goto *remain
>>if remindB3(reB)=0:if remindB1(reB)=0:reB=reB+1:goto *remain:else :goto *remain3
>>reB=reB+1
>>loop

reBはcntで、いやrepeat 4 でも良いんじゃない?
reB=reB+1:goto *remainは、continueでも良いんじゃない?

他の部分も色々怪しそうです。



ジャンプのできないマリオ

リンク

2019/5/12(Sun) 17:28:50|NO.87307

>>KAさん
返信ありがとうございます。
問題の動作個所はどうにかなりましたが、全体は想像どうりには動きませんでした。
全体のプログラミングを書き直して再挑戦したいと思います。



ジャンプのできないマリオ

リンク

2019/5/12(Sun) 19:54:57|NO.87313

自己解決しました。
>>ponyoさん、>>KAさん、助言いただきありがとうございました。



名無三

リンク

2019/5/12(Sun) 20:04:34|NO.87314

書き直す前に文法をちょちょいとなおしんさい、スレのやつは直しておきますから

//スタート時のx,y座標です。 x = 50 y = 0 remindx = x remindy = y linepower = 0 dim remindB1, 10 dim remindB2 ,10 dim remindB3,10 //線のx座標です。line1<line2<line3は守ること line1=50 line2=300 line3=600 repeat gsel 0,0 a=mousex b=mousey redraw 0 color 255,255,255 : boxf //線の再描画をします color line line1,0,line1,400 line line2,0,line2,400 line line3,0,line3,400 //現在引いている線の描画をします color 100,100,100 if remindB1(reB)=0 & remindB2(reB)=0 & remindB3(reB)!=0{ if remindB1(reB)=0{ line line2,remindB2(reB),a,b } if remindB2(reB)=0:if linepower=1 { line line1,remindB1(reB),a,b }else : if linepower=3{ line 3,remindB3(reB),a,b } if remindB3(reB)=0{ line line2,remindB2(reB),a,b } } //過去引いた線の再描画をします。 remindB=reB//現在の線につけられたナンバーを記憶します repeat 4 reB = cnt if remindB1(reB)=0 & remindB3(reB)=0{ continue }else { line line2,remindB2(reB),line3,remindB3(reB) } if remindB2(reB)=0{ continue } if remindB3(reB)=0 & remindB1(reB)=0{ continue }else { line line2,remindB2(reB),line1,remindB1(reB) } loop reB=remindB //ナンバーを戻します。 color 255,0,0 pset x,y pset remindx,remindy //あみだ現在の位置を示す赤ポチの描画をします。 //赤ぽちの逆流防止弁です。 remindx=x remindy=y //あみだの赤ぽちの移動を制御します stac = 0 pget x+1,y if ginfo_r=0 & ginfo_g=0 & ginfo_b=0{ color 255,0,0 pset x,y x++ R=1:L=0 stac++ goto *draw1 } pget x+1,y+1 if R=1 & ginfo_r=0 & ginfo_g=0 & ginfo_b=0 { color 255,0,0 pset x,y x++ y++ stac++ goto *draw1 } pget x-1,y if ginfo_r=0:if ginfo_g=0:if ginfo_b=0{ color 255,0,0 pset x,y x-- L=1:R=0 stac++ goto *draw1 } pget x-1,y+1 if L=1 & ginfo_r=0 & ginfo_g=0 & ginfo_b=0{ color 255,0,0 pset x,y x--:y++ stac++ goto *draw1 } pget x,y+1 if (ginfo_r=0 & ginfo_g=0 & ginfo_b=0) or (ginfo_r=100 & ginfo_g=100 & ginfo_b=100){ color 255,0,0 R=0:L=0 pset x,y y++ stac++ goto *draw1 } if stac = 0 { end//一番下までいったら終わりです。 } *draw1 //ここまでが線の追従プログラムです。 getkey key,1 if key=1{ if after!=1 { after=0 color 100,100,100 if a=line1{ remindB1(reB)=b if remindB2(reB)=0 { linepower=1 }else{ color reB++ after=1 } } if a=line2{ remindB2(reB)=b if remindB1(reB)!=0 { if remindB3(reB)!=0 { color :reB=reB+1:after=1 } } } if a=line3{ remindB3(reB)=b if remindB2(reB)=0 { linepower=3 }else{ color reB++ after=1 } } } }else{ remindB1(reB)=0 remindB2(reB)=0 remindB3(reB)=0 } /* 描画自由パート */ redraw 1 await 16 loop
スマホから+突貫なんで間違いがあるだろうけど、
1・ループが通るように設計する
2・gotoの乱用は避ける(1箇所放置してるケド)
3・{}、Tabの多用で可読性をあげる
4・:で1行にまとめない
あとできたら、
5・色で判定せず計算で全て求める(オセロのプログラムが参考になるだろう)
をまもるんやで。
上のならC畑の人でもなんとか読めるだろうから質問しやすいし、なにより順番がほぼ一直線なんで
おかしい箇所がわかりやすいんや



ジャンプのできないマリオ

リンク

2019/5/13(Mon) 09:18:41|NO.87324

>>南無三さん
とても読みやすい文法で書いていただきありがとうございます。
これからあみだの線も増やしていく予定なので、>>南無三さんのプログラミングは大変参考になります。



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