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

| |
|
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(初期化)していないのが原因かと思われます。
|
|
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さん
返信していただきありがとうございます。
プログラミングが動くよう尽力したのですが、力不足で自力では修正箇所をどのように変更すればよいかわかりませんでした。
失礼ながら編集した私のプログラミングを送っていただけないでしょうか。
|
|
2019/5/12(Sun) 15:27:05|NO.87299
repeat中にgotoで抜けて戻ったりしているのが原因です。
他にもif文の書き方などが怪しいですよ。
>>いざテストプレイしようとしてみると・・・
>>自力では修正箇所をどのように変更すれば・・・
どういう動作で、どういう状態が正常なのかは、あなたにしか
分かりません。せめて「どう動作する事を期待して、こう書い
ている」という風なコメントを各行に書きましょう。
ここまで作って初めてテストするのも分かりにくくなる原因で
す、普通は部分部分の動作をテストしながら作りますよ。
|
|
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
>>南無三さん
とても読みやすい文法で書いていただきありがとうございます。
これからあみだの線も増やしていく予定なので、>>南無三さんのプログラミングは大変参考になります。
|
|