OriosのActiveBasic講座(1-5):やってみようの答え(1-5)

1.ファイルへの書き込み
【問題】

(1)あらかじめRnd関数で0〜3の数字を用意し、(2)それ数字をユーザに予想してもらって入力してもらい、ユーザが当てるまで(1)(2)を繰り返すプログラムを作ってみましょう。 ただし、プログラムが終わるまでの(1)の数字と(2)の数字を全て、各行「(1)の数字,(2)の数字」という形で"LetsTry5-1.txt"に書き込むようにしましょう。

[ファイル書き込みの例]
1,3
2,0
0,1
3,3
【解答例】
#console
' 変数名等は適当に
Dim true_ans As Integer
Dim user_ans As Integer
Open "LetsTry1-5-1.txt" For Output As #1
' このようにユーザに何をやるかを表示すると分かりやすいと思います。
' 書かなくても構いません。
Print "今からコンピューターが0〜3の中のどれかを選ぶのでそれを当ててください。"
'乱数を使う場合これを入れておいた方がいいです。
Randomize
While -1
    true_ans = Fix(Rnd() * 4)
    Input user_ans
    ' 数字・コンマの間にスペースを入れないようにするにはこの方法がベストです。
    Print #1, true_ans;
    Print #1, ",";
    Print #1, user_ans
    If true_ans = user_ans Then
        Exit While
    Else
        ' 書く必要はありませんが書いたほうがユーザに分かりやすいです。
        Print "ハズレ"
    End If
WEnd
Close #1
Exec "LetsTry1-5-1.txt"
End
【解説】

まず一番重要なのはファイルがきちんと扱えているかということです。 ポイントは「きちんとファイルが開けているか」「ファイルを閉じ忘れていないか」「ファイルにきちんと書き込めているか」という3点です。 まず「ファイルを開く」ところですが、今回はプログラムと同じ場所のファイルに書き込むのでパスを書く必要はありません。 それから「ファイルへの書き込み」は、コンソールウィンドウに表示するのと同じ要領なので結構簡単だったかと思います。 ただし「#1」(ファイル番号が違う場合は「#」+「そのファイル番号」)は忘れないようにしてください。

あと今回は「書く必要はありませんが……」という文章が多いですが、これからは与えられた指示以外にもユーザが使いやすくなるようにご自分で考えていただきたいと思ったので問題の指示以外の記述も多くなっています。

2.ファイルの読み込み
【問題】

ここに某年、某都市の各月の平均気温のリストがあります。→[ LetsTry1-5-2.txt ](右クリックしてダウンロードしてください。) このファイルには各行にそれぞれの月の平均気温が書かれています。 これを利用して某年、某都市の一年間の平均気温を求め、それをファイルの最後に追加して書き込み、最後にそのファイルを表示するプログラムを作ってみましょう。

【解答例】
' 今回は入力や表示が無いので#consoleはなくても構いません。
#console
' 変数名等は適当に
Dim temp[11] As Single '温度は小数なのでSingleかDoubleを推奨
Dim i As Integer
Dim ave As Single
Open "LetsTry1-5-2.txt" For Input As #1
' 各月のデータだと最初から分かっているのでForループで0〜11を使って読み込むなどしても構いません。
Do
    Input #1, temp[i]
    i = i + 1
Loop Until Eof(1) = -1 '「Loop Until Eof(1)」でも構いません。
Close #1
' 平均の求め方はこれ以外にもいろいろ方法はあると思います。
For i = 0 To 11
    ave = ave + temp[i]
Next
ave = ave / 12
Open "LetsTry1-5-2.txt" For Append As #1
Print #1, ave
Close #1
Exec "LetsTry1-5-2.txt"
End
【解説】

今回は「読み込み」と「追加書き込み」をやっていますが、やはりポイントちゃんとモードを選んで開けているかということと、InputとPrintでうまくファイルの読み書きができているかです。 あとは問題文に従ってプログラムを組んでいけばできると思います。 ちなみに平均温度の正解は"16.5249996185303℃"です。

3.バイナリファイルの読み書き
【問題】
【数当てゲームを作ろう】

乱数を用いて毎回1〜3の数字を用意し、それをユーザに当ててもらうゲームを作りましょう。 条件は次の通りです。

  • ゲーム結果を記録するためにバイナリファイルを用います。 このバイナリファイルは勝数と敗数を文字コードを使ってそれぞれ表して並べたものです。 例えば「3勝2敗」なら文字コード「3」と文字コード「2」を並べて表します。 右のファイルが今例を挙げた「3勝2敗」のファイルです。[ LetsTry1-5-3.txt ]
  • ゲームの前に上の対戦結果を記録したバイナリファイルを読み込んで今までの結果を表示するようにしましょう。
  • ゲームは一回終わるごとに「続けてやりますか?」と聞き、「N」もしくは「n」が入力されたときにプログラムを終わるようにしましょう。
  • プログラムを終了するときに累計の対戦結果(前回の結果も含めた結果)を表示して、さらにその結果を対戦結果を記録するバイナリファイルに保存しましょう。

《ヒント》
  • 対戦結果が記録されたバイナリファイルを読み込むと、その文字列の[0]が勝数、[1]が敗数になります。
  • もしファイルがないときは文字列が0バイトになるので[1]をするとエラーが起こるかもしれません。どうしましょう?
  • 正解の数字を決めるには乱数を使いましょう。
【解答例】
#console

' 変数の宣言 (変数名などは自由)
Dim data As String
Dim usr_win As Integer
Dim usr_loose As Integer
Dim true_ans As Integer
Dim usr_ans As Integer
Dim continue_yn As String
Dim new_data As String

' 対戦結果ファイルを読み出す
Open "LetsTry1-5-3.txt" As #1
Field #1, Lof(1)
Get #1, 1, data
' ファイルがなかったときはdata[1]がエラーになる可能性があるので、
'  ファイルがあるときだけ読み込んだデータを代入する
If Lof(1) <> 0 Then
    usr_win = data[0]
    usr_loose = data[1]
End If
Close #1

' 今までの記録を表示
Print "今までの対戦結果:"; usr_win; "勝"; usr_loose; "敗"

' ゲーム本体
Randomize
Do
    ' 正解の数字は乱数で
    true_ans = Fix(Rnd() * 3) + 1
    Input "数を当ててください(1〜3)", usr_ans
    If true_ans = usr_ans Then
        Print "当たり"
        usr_win = usr_win + 1
    Else
        Print "はずれ"
        usr_loose = usr_loose + 1
    End If
    Input "続けますか?[Y/N]", continue_yn
Loop Until continue_yn = "N" or continue_yn = "n"

' 対戦結果の更新 (文字列変数「data」に上書きしても可)
new_data = String$(2, Chr$(0))
new_data[0] = usr_win
new_data[1] = usr_loose
Print "累計対戦結果:"; usr_win; "勝"; usr_loose; "敗"

' 対戦結果をファイルに保存
' ファイルサイズが同じなのでKillはしてもしなくても可
Kill "LetsTry1-5-3.txt"
Open "LetsTry1-5-3.txt" As #1
Field #1, Len(new_data)
Put #1, 1, new_data
Close #1

Sleep(3000)

End
【解説】

今回は基本編の最後ということで少し本格的なゲームを出してみましたがいかがだったでしょうか? ポイントは何といっても「バイナリファイル」の扱いです。 この「バイナリファイル」がきちんと扱えていれば合格です。 バイナリファイルを読み書きするための命令語に「Field」「Put」「Get」などがありましたがちゃんと使えていますか?

あと、バイナリファイルを使うのは二つ理由があります。 一つは「ファイルサイズが小さくて済む」ことです。 例えば「10勝10敗」を記録しようとすれば、バイナリファイルは文字コード「10」を二つ並べるだけですから2バイトで済みますが、普通のファイルの場合は「10,10」と5バイト必要になります。 もう一つは他人が見ても簡単にわからないということです。 今回のファイルもメモ帳で開いたら分かると思いますが、少なくとも素人には分かりません。 なのでなるべく隠したい情報を記録するのには適しています。

最後に、バイナリファイルを扱うのには「バイナリエディタ」という種類のソフトがあると便利です。 私が使っているのは、後藤和重さんが作られているStirlingというソフトです。 このような「バイナリエディタ」というソフトを使えばバイナリファイルの内容も見ることができるで、バイナリファイルを扱うときには一緒に使うことをお勧めします。


ご質問・ご意見・ご感想・苦情等はメールまたはメイン掲示板のActiveBasic板などでお気軽にどうぞ。

前に戻る - 講座トップに戻る

ホーム > OriosのActiveBasic講座(トップページ) >