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を本格的に活用していく方法を紹介していきたいと思います。

それではひとまず…、ご苦労様でした(^^)


Home Up Back Next