メモ帳への保存について

解決


ハチ公  2009-01-11 19:29:52  No: 145630

ゲームの得点をテキストファイルに保存する処理を行っています。
H_ScoreにはベストスコアのテキストファイルをW_Scoreにはワーストスコアのテキストファイルを読み込んでいます。
ScoreLabelにゲームのスコアが入り、それをベストスコアとワーストスコアで比較し、当てはまるほうの処理を行いたいのですが、上手くいきません。
ベストスコアとワーストスコアの初期値は0です。
ゲームをクリアして、スコアが100や200でもワーストスコアに書き込みされます。
どうしてでしょうか??
教えてください。
よろしくお願いします。

Const H_Score As String = "HiScore.txt"
Const W_Score As String = "WorstScore.txt"
Dim filenum As Integer
Dim readline As String

If H_Score < ScoreLabel.Text Then
    MsgBox("Best Score!!")
    filenum = FreeFile()
    FileOpen(filenum, H_Score, OpenMode.Output)
    Print(filenum, ScoreLabel.Text)
    FileClose(filenum)
End If

If W_Score > ScoreLabel.Text Then
    MsgBox("Worst Score!!")
    filenum = FreeFile()
    FileOpen(filenum, W_Score, OpenMode.Output)
    Print(filenum, ScoreLabel.Text)
    FileClose(filenum)
End If


魔界の仮面弁士  2009-01-11 20:16:53  No: 145631

> メモ帳への保存について
> テキストファイルに保存する処理を行っています。
「テキストファイルに保存」の方が、表現としては適切ですね。

> ベストスコアとワーストスコアの初期値は0です。
本当にそれで良いのでしょうか。

ゲーム内容が分かりませんが、点数加算方式だとしたら、0 点を下回る点数は無いですよね。
たとえ正しいプログラムを書いたとしても、その仕様のまま作っていくとしたら、
ワーストスコアが更新される事は無く、常に 0 点のままになってしまうと思いますよ。

> スコアが100や200でも
「100」(半角数字)ではなく、
「100」(全角数字)で、ラベルに表示しているという事でしょうか。

『(ラベル表示のための)数字』(String)ではなく、点数加算のために使うべき
『(ゲーム点数計算用の)数値』(Integer など)は、どこにありますか?

> ScoreLabelにゲームのスコアが入り、それをベストスコアとワーストスコアで比較し、
(中略)
> どうしてでしょうか??
提示されたコードには、スコアを比較するためのコードが記述されていないからです。
また、ファイルに保存するコードはあっても、ファイルから読み取るコードも見当たりません。

> If H_Score < ScoreLabel.Text Then
まず、ここに誤解があるのではないでしょうか。

これは点数(数値)の比較では無く、文字列同士の大小比較です。
H_Score は、文字列『HiScore.txt』を表していますし、
そして ScoreLabel.Text もまた、文字列である事に注意してください。

文字列の比較では、左端の文字から順に比べられていきます。初期設定では、
  0 < 9 < A < Z < a < z < 0 < 9 < a < z < A < Z
という並びになります。

そのため、たとえば ScoreLabel.Text の中身が半角「100」であった場合、
  If H_Score < ScoreLabel.Text Then
  If W_Score > ScoreLabel.Text Then
の結果は、
  If "HiScore.txt"    < "100" Then    '…条件に一致しない(False)
  If "WorstScore.txt" > "100" Then    '…条件に一致する(True)
というコードに読み替えられる事となります。


魔界の仮面弁士  2009-01-11 20:27:05  No: 145632

書き間違えました。

先の英数字の文字列比較については、
>  0 < 9 < A < Z < a < z < 0 < 9 < a < z < A < Z
ではなく、
  0 < 9 < A < Z < a < z < 0 < 9 < A < Z < a < z
の誤記です。失礼しました。

何にせよ、今回の問題は
> 提示されたコードには、スコアを比較するためのコードが記述されていないからです。
> また、ファイルに保存するコードはあっても、ファイルから読み取るコードも見当たりません。
という部分にありますので、もう一度プログラムを確認してみてください。

ついでに補足。

> 文字列の比較では、左端の文字から順に比べられていきます。初期設定では、
ここで書いた「初期設定」とは、『Option Compare Binary』の事を指します。
『Option Compare Text』にした場合は、大文字/小文字や全角/半角の違いは
無視されますので、先ほどの並び順は
  (0 = 0) < (9 = 9) < (A = A = a = a) < (Z = Z = z = Z)
のようになります。……もっとも、今回の問題とは無関係ですけれども。


魔界の仮面弁士  2009-01-11 21:20:48  No: 145633

またミスってしまいました……。重ね重ね失礼しました。

先の補足事項に書いた
>   (0 = 0) < (9 = 9) < (A = A = a = a) < (Z = Z = z = Z)
について、正しくは
    (0 = 0) < (9 = 9) < (A = A = a = a) < (Z = Z = z = z)
です(最後のゼット)。

修正投稿ばかりでは情報にならないので(スミマセン)、
せめてヒントを追記しておきます。

-------
> Print(filenum, ScoreLabel.Text)
これは、ファイルへ出力するためのコードですよね。
その逆にファイルから入力を受け取るためのコードは
  Dim s As String = LineInput(filenum)
となります。

ただし FileOpen に頼ったファイル入出力は、現在あまり推奨されていません。
.NET においては、System.IO 名前空間のクラスを使う事が推奨されていますので、
余裕があれば、System.IO を用いた方法についても調べてみてください。
-------
> If H_Score < ScoreLabel.Text Then
画面上のラベル(ScoreLabel)を、そのまま点数判定に使うのは止めた方が良いです。

点数は、Integer などの数値変数に別途保持するようにしておき、
ハイスコア判定などには、その Integer 変数を利用するようにしてください。

何故ならば、たとえば「20点」と「150点」とを比較するような場合に、
『数値』の比較であれば、20 < 150 という大小関係になりますが、
『文字列』の比較では、"150" < "20" という逆の結果になってしまうからです。

これは(先に書いた通り)、文字列の比較が左端から
>>  0 < 9 < A < Z < a < z < 0 < 9 < A < Z < a < z
の順で解析される仕様なため、「"150" の先頭の "1"」と
「"20" の先頭の "2"」が比較されてしまうためです。
-------
> ベストスコアとワーストスコア
> Const H_Score As String = "HiScore.txt"
> Const W_Score As String = "WorstScore.txt"
[ベストスコア] と [HiScore] の表現の違いが、ちょっと気になりました。

top / bottom
high / low
best / worst
better / worse
-------


ハチ公  2009-01-15 07:15:27  No: 145634

すいません。
解決いたしました。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加