Lesson8 基礎編のまとめ
Lesson1からLesson7まで、VBSの基礎となる事柄を概説してきました。このLesson8では、いままでのLessonの総まとめという意味で、ちょっと複雑なスクリプトを取り上げてみます。
数字当てゲーム
このスクリプトは、「実用スクリプト」として公開中のスクリプト(とは言えどこが実用なのか、書いている本人もわかりません)を、ちょっと改造したものです。古畑任三郎が得意とした、数当てゲームです。ルールは起動させると表示されるので、これを見てください。
このスクリプトの核心部分は、ランダムな数字を生成するところと、プレイヤーの入力した数値を判定するところです。この部分をよく見てください。
余力のある方は、このスクリプトを改良してみてください。(例 : ポイントが0点になったらゲームオーバーとする。・試行回数がある一定値を越えると失敗とする。・一発で正解を出せばボーナス点を加える。etc)
# ところで「ドロー」っていう言い方、正しいんでしょうか…?
自信なし(^^;
## ↑「ボール」というのが正解らしいです。
###↑ヒットアンドブロー(Hit&Blow)が正式名称です。これで確定。
'数字当てゲーム On Error Resume Next Dim intAnsFigure(9),intTryFigure(9) '正解の数字と、プレイヤーの考えた数字を一桁ずつ変数として宣言。 Dim intAnsNumber,intTryNumber '正解の数字と、プレイヤーの考えた数字 Dim strTryNumber,strTryFigure(9),strAnsNumber,strAnsFigure(9) '各値の文字型変数 Dim I,J 'ループのカウンタ Dim x,a,b '一時的に数字を格納 Dim intMsg 'MsgBox関数の返値を入れる Dim strHint 'ヒント文 Dim intTryTimes '試行回数 Dim intPoint '得点 Dim intHit,intDraw 'ヒット数とドロー数 Dim strRule 'ルール Const intFigure = 3 '桁数。これを大きくすると難易度アップ! intPoint = 100 '初期得点 strRule = "コンピュータの考えた3桁の0から9までの数字(それぞれの桁の数字はすべて異なる)" strRule = strRule & vbNewLine & "を当てるのが目的です。" strRule = strRule & vbNewLine & "プレイヤーはまず当てずっぽうに3桁の数字を入力します。" strRule = strRule & vbNewLine & "その数字に対し、コンピュータが「正解にどれだけ近いか」のヒントを出します。" strRule = strRule & vbNewLine & "ある桁に対応する数字が一致していれば「ヒット」、桁は間違っているが数字のみが" strRule = strRule & vbNewLine & "あっている場合は「ドロー」となります。" strRule = strRule & vbNewLine & "たとえば正解が298だった場合に、プレイヤーが286という数字を入力した場合は" strRule = strRule & vbNewLine & "1ヒット1ドローになります。" strRule = strRule & vbNewLine & "そのヒントを元に、再び数字入力をおこないます。これを繰り返し、できるだけ早く" strRule = strRule & vbNewLine & "正解に到達するのが目的です。" 'vbNewLineは、「改行」を意味するVBSの定数。vbCrLf、Chr(13) & Chr(10) と書いても同じ。 MsgBox strRule,vbInformation,"数字当てゲーム" Do 'このループは、ゲームを終了するまで繰り返される。 Call MakeNumber '正解の数値を生成。 Do 'このループは、プレイヤーが正解を出すか、ギブアップするまで繰り返される strTryNumber = InputBox (strHint ,intFigure & "桁の数字を入れてね。" & "Point = " & intPoint,strTryNumber) If strTryNumber <> "" Then 'もしプレイヤーが何か数値を入れていれば Call DataCheck '何hit 何drawか調べる If intHit = intFigure Then 'ヒット数が桁数に等しいなら、完全に一致していることになり、ゲームクリアー intPoint = intPoint + 30 MsgBox strTryNumber & "は正解です!おめでとう!" ,, "Point = " & intPoint Call AskExit Exit Do Else '他の場合は、不正解ということになるので、ヒントを表示 intTryTimes = intTryTimes + 1 intPoint = intPoint - 6 + intHit * 2 + intDraw MsgBox strTryNumber & "は、" & intHit & "ヒット" & intDraw & "ドローです。" ,, "Point = " & intPoint strHint = strHint & intTryTimes & "回目 : " & strTryNumber & " = " & intHit & " hit , " & intDraw & " draw" & vbNewLine End If Else '「キャンセル」を押したり、何も入力しない場合はギブアップとみなす intPoint = intPoint - 10 MsgBox "正解は" & strAnsNumber & "でした。" & vbNewLine & strHint,,"Point = " & intPoint Call AskExit Exit Do End If Loop Loop Sub MakeNumber() 'ランダムな数字を生成するためのSubプロシージャ strAnsNumber = "" strHint = "" intTryTimes = 0 '以上、数値の初期化 Randomize '乱数の初期化 For I = 0 To UBound(intAnsFigure) 'intAnsFigureという配列に、それぞれ0から9の数字を入れる。 intAnsFigure(I) = I Next For I = 0 To 255 '配列intAnsFigureの数字をランダムに入れ替える。入れ替えは256回おこなわれる。 a = Int(Rnd * 10) 'aには一桁の整数のどれかが入る b = Int(Rnd * 10) 'bには一桁の整数のどれかが入る x = intAnsFigure(a) intAnsFigure(a) = intAnsFigure(b) intAnsFigure(b) = x '上の三行でintAnsFigure(a)とintAnsFigure(b)の値が入れ替わる。 Next For I = 0 To intFigure - 1 'intFigure桁の数字を生成 strAnsNumber = strAnsNumber & intAnsFigure(I) Next End Sub Sub DataCheck() 'プレイヤーの入力した数値が、正解とどれだけ近いかチェックする。 intHit = 0 'intHitという変数を初期化 intDraw = 0 'intDrawという変数を初期化 For I = 0 To intFigure - 1 '入力された数字を、桁ごとに分解 strTryFigure(I) = Mid(strTryNumber, I + 1 , 1) 'Mid関数で、Iに対応する場所の桁の数字を取得 intTryFigure(I) = CInt(strTryFigure(I)) 'CInt関数で、データ型を文字列型から整数型に変換 Next For I = 0 To intFigure - 1 'プレイヤーの考えた数字が、正解と一致しているか、一桁ずつ比較 For J = 0 To intFigure - 1 If intAnsFigure(I) = intTryFigure(J) Then If I=J Then '桁とその数字があっていれば「ヒット」 intHit = intHit + 1 Else '桁は違うものの数字があっていれば「ドロー」 intDraw = intDraw + 1 End If End If Next Next End Sub Sub AskExit() '続けるか、やめるか intMsg=MsgBox ("次のゲームを始めますか?",vbYesNo,"Point = " & intPoint) If intMsg=vbNo Then MsgBox "あなたの得点は" & intPoint & "点でした。",vbInformation,"結果発表" Wscript.Quit End If End Sub
Lesson1からLesson8まで8回にわたって、VBScriptの基本構文をざっと解説しましたが、いかがでしたでしょうか?
私自身、系統立てたプログラミングの学習というのをしたことがないので、たぶん間違いや、常軌を逸したスクリプトもあったと思いますが、これから「応用編」で必要となる基礎知識は一応網羅したと思います。
なお、「基礎編」では紹介しきれなかった事柄もいくつかありますが、それについてはVBSランゲージリファレンスを参照していただけると幸いです。特にVBSの関数についてはごく一部しか取り上げられませんでしたから。
「応用編」では、WSHで使用できるオブジェクト(主にWscript.ShellとScripting.FileSystemObject)を取り上げ、WSHを本格的に活用していく方法を紹介していきたいと思います。
それではひとまず…、ご苦労様でした(^^)