トピック

プログラムが思い通りに動かない

敵を飛び越えたごとにスコアが1加算されるプログラムを、「IF X==EX[I] THEN SCORE=SCORE+1」と表現(?)したのですが、スコアが0のまま加算されません。どこをなおせば思い通りに動いてくれるんですか? コメント欄で画面写真の続き載せていきます。 日本語下手で分かりづらいです。すみません…><
2そうだね
プレイ済み
返信[1]
親投稿
画面写真の続き
0そうだね
プレイ済み
返信[2]
親投稿
画面写真の続き(2)
0そうだね
プレイ済み
返信[3]
親投稿
画面写真の続き(3)
0そうだね
プレイ済み
返信[4]
親投稿
画面写真の続き(4) 110行目が思い通りに動きません。
0そうだね
プレイ済み
返信[5]
親投稿
一応プレイ画面。 一番左上が経過時間で、その右がスコアです。このスコアがずっと0のまま、増えません。 以上が、画面写真すべてです。
0そうだね
プレイ済み
返信[6]
親投稿
Oskar oskar_liebig
ヒント:112行目を PRINT SCORE,I にして動かしてみる
0そうだね
プレイ済み
返信[7]
親投稿
say sayer.exe
ふむふむ 自分のx位置が7だったとして、動かないものとする(その場ジャンプ) で、敵さんが400の位置から現れて速度が4とする ハイ、敵さん来ましたジャンプしました すれ違う直前:x=7 ex[i]=8 すれ違ったあと:x=7 ex[i]=4 いわゆるすり抜けが起こったってやつです
0そうだね
プレイ済み
返信[8]
親投稿
say sayer.exe
すり抜けを起こさない方法としては… if x<ex[i]-es[i] and x>ex[i]-es[i] then 略 かな?(多分)
0そうだね
プレイ済み
返信[9]
親投稿
say sayer.exe
もとい if x<ex[i]+es[i] and x>ex[i]-es[i] then 略 前の状態 今の状態 後の状態 を計算して数直線上に書き込んだら理由がわかるよ
0そうだね
プレイ済み
返信[10]
親投稿
>>Oskarさん,sayさん 僕は理解力がすごく乏しいので、よく分かりません…。 じゅうぶん分かりやすく解説してくれているんでしょうが…。 もう少し詳しくお願いします…><
0そうだね
プレイ済み
返信[11]
親投稿
みなさんの回答を元に、解決方法はともかく駄目な理由はわかりましたか? それがわかってないと解決方法以前の問題になっちゃうんで…。
0そうだね
プレイ済み
返信[12]
親投稿
>>でんぺんさん すり抜けが起こっているのがダメな理由というのは、sayさんの回答でなんとなくですがわかりました。
0そうだね
プレイ済み
返信[13]
親投稿
なるほど。それなら原因はわかってるっぽいですね。 sayさんのやり方は、X座標の完全一致での判断ではX座標が完全に一致しないケースでは飛び越えたとにならないので、そうじゃなくて移動前と移動後の座標の両方を比較してきちんとX座標をまたいだかを判定している感じですよ。 なので判定さえきちんとすればsayさん以外のやり方でも大丈夫ですが、その辺の感覚的なところはわかってきてる感じかな?
0そうだね
プレイ済み
返信[14]
親投稿
あともう一つ。 今ちゃんとプログラム見て気づいたけど、飛び越え判定しているところってFORループを抜けている気がするんで、そしたらもう全ての敵に対しての判定対象にならないんじゃないのかな?
0そうだね
プレイ済み
返信[15]
親投稿
>>でんぺんさん FORループを見直して、sayさんのプログラムを打つと、うまく動きました!
0そうだね
プレイ済み
返信[16]
親投稿
>>Oskarさん、sayさん、でんぺんさん プログラムを教えていただき、本当にありがとうございました!!!
1そうだね
プレイ済み
返信[17]
親投稿
sayさんのプログラムを試したときにはFORループの問題もあって直らなかったからよくわからなく感じていたみたいですねー。 とりあえずうまくいって良かったです。これからも頑張ってください〜。
1そうだね
プレイ済み
返信[18]
親投稿
すみません、「めでたしめでたし」じゃありませんでした。 飛び越えたら1ずつ増えるんですが、たまに増えなかったり、一気に2増えてしまうときがあります。何故ですか…? (プログラムは画面写真以外のところは書き換えていません。)
0そうだね
プレイ済み
返信[19]
親投稿
とりあえずIF分ですが、僕が見た感じでは、 IF X < EX[I]+ES[I] && X >= EX[I] THEN のような気がする。つまりEX[I] + ES[I]は以前の座標になるはずなので、前の座標が自分より前で、今の座標が自分より後ろなら飛び越えたって感じね。 IF時のかつのアンドはANDより&&の方が理解せずに利用した際の誤動作が少ないと思うので&&の方がオススメです。
0そうだね
プレイ済み
返信[20]
親投稿
>>でんぺんさん ありがとうございます。でんぺんさんのアドバイスを参考にしたら、2増えることはなくなったんですが、増えないことがたまに起きてしまいます… 何故でしょうか?
0そうだね
プレイ済み
返信[21]
親投稿
なんとなく気づいたのは、その増えない時って自分も移動しながら飛び越した時じゃないですか? 止まってジャンプしている時は必ず増えるなら原因としては特定出来た感じですが、今の自分の移動量っていくつになってるんですかね?
0そうだね
プレイ済み
返信[22]
親投稿
say sayer.exe
前に動いた時に飛び越えた時に加算されない ってケースじゃない? おいらの説明は「xは動かない」前提なんで、そうなるでしょうね 正直、検証コードで2増える事象は体感してましたんで、だいたいそうなるんじゃないかなとは想像してました で、どうしたらいいかと言うと、 自分で書いた動作を自分で書いて調べる のが手っ取り早いんでしょう 実際ここが天王山で、 「俺に何書いたんだ?」 と反すうできるともう大丈夫大丈夫♪
0そうだね
プレイ済み
返信[23]
親投稿
やっぱり原因はそうですよね。 ということでもうちょっと根本的に改善しないと駄目かもしれませんが、一番簡単なのは敵にもう一つ飛び越えたかどうかのフラグ用の変数を持たせて、それで判定を重複させないのが手っ取り早いんじゃないかなと言う気がしますね。
0そうだね
プレイ済み
返信[24]
親投稿
say sayer.exe
おおおぅ おいら何書い書いてんだ 「俺に何書いたんだ?」 じゃのうて、 「俺何書いたんだ?」 だったわ 何十年使い続けた日本語ですらこんなもん ミスなんかよーあるよーある(と恥隠し)
1そうだね
プレイ済み
返信[25]
親投稿
はい、今の段階では理解できないことが多いですが、コツコツ地道に頑張って行きたいと思います。今日は長い間ありがとうございました。
0そうだね
プレイ済み
返信[26]
親投稿
Oskar oskar_liebig
言葉足らずですみませんでしたが、ループの問題は解決したみたいなので何よりですが、まだ問題が残っているようですね。 一つの方法ですけれど ・VSYNC の値を大きくして(ボタンの反応が悪くなるかも) ・2つある LOCATE は一時的にコメントにして ・PRINT SCORE の代わりに PRINT SCORE,X,I,EX[I],ES[I] にして ・うまくいかなかったときにすぐにSTARTボタンで止めて ・うまくいかなかったときの前後にPRINTされた値を見てみて ・プログラムを読んで、どうしてそういう値になるのか調べる といいかもしれません。
0そうだね
プレイ済み
返信[27]
親投稿
一つのやり方のヒントの断片だけ。別にこの方法が唯一でもないです。 DIM EF[8] IF EX[I] == -100 THEN 〜 EF[I] = 0(またはFALSE) ENDIF IF EX[I] < X && !EF[I] THEN SCORE=SCORE+1 EF[I] = 1(またはTRUE) ENDIF
1そうだね
プレイ済み
返信[28]
親投稿
>>Oskarさん、でんぺんさん ありがとうございます!! 参考にして、頑張ってみます!!
0そうだね
プレイ済み