310 astrWordList(6) = “ENTERPRISE” astrWordList(7) = “ESCALATION” astrWordList(8) = “HAPPINESS” astrWordList(9) = “WEDNESDAY” End Function Function PlayTheGame() ‘Initialize variables displayed by the game’s initial pop-up dialog intNoMisses = 0 intNoRight = 0 strWrongGuesses = “” strRightGuesses = “” ‘Get the game a mystery word strGameWord = RetrieveWord() ‘Call function that formats the initial pop-up dialog’s display string strDisplayString = InitialDisplayString() strTempStringOne = strGameWord ‘Let the player start guessing Do Until intNoMisses = 6 ‘Collect the player’s guess strChoice = InputBox(vbCrLf & vbTab & strDisplayString & vbCrLf & _ vbCrLf & vbCrLf & “No. of Misses: “ & intNoMisses & _ “ “ & vbTab & “Incorrect:” & strWrongGuesses & vbCrLf _ & vbCrLf & vbCrLf & _ “Type a letter and click on OK.” , cTitleBarMsg) ‘Determine if the player has quit If strChoice = “” Then Exit Function End If Microsoft WSH and VBScript Programming for the Absolute Beginner, Second Edition strProcessGuess = FirstLevelValidation() ‘The player wants to quit the game If strProcessGuess = “ExitFunction” Then Exit Function End If ‘The player typed invalid input If strProcessGuess <> “SkipRest” Then strProcessGuess = SecondLevelValidation() Select Case strProcessGuess Case “DuplicateWrongAnswer” MsgBox “Invalid: You’ve already guessed this incorrect letter.” Case “DuplicateRightAnswer” MsgBox “Invalid: You’ve already guessed this correct letter.” Case Else strCheckAnswer = TestLetterGuess() If strCheckAnswer <> “IncorrectAnswer” Then ‘Reset the value of variable used to build a string containing ‘the interim stage of the word as currently guessed by player strTempStringTwo = “” NonGuessedString() ‘Check to see if the player has guessed the word blnGameStatus = CheckIfGameWon() If blnGameStatus = “True” Then blnWordGuessed = “True” Exit Do End If ‘Set the value of the temporary string equal to the string ‘created by the Previous For Next loop strTempStringOne = strTempStringTwo 311 Chapter 9 • Handling Script Errors 312 ‘Clear out the value of the strDisplayString variable strDisplayString = “” FlipString() End If End Select End If Loop DisplayGameResults() End Function ‘This function randomly retrieves a word from an array Function RetrieveWord() Randomize intRandomNo = FormatNumber(Int(10 * Rnd)) RetrieveWord = astrWordList(intRandomNo) End Function Function InitialDisplayString() ‘Create a loop that processes each letter of the word For intLetterCounter = 1 to Len(strGameWord) ‘Use underscore characters to display string representing each letter InitialDisplayString = InitialDisplayString & “_ “ Next End Function ‘Validate the player’s input Function FirstLevelValidation() Microsoft WSH and VBScript Programming for the Absolute Beginner, Second Edition ‘See if the player clicked on Cancel or failed to enter any input If strChoice = “” Then FirstLevelValidation = “ExitFunction” Exit Function End If ‘Make sure the player only typed 1 letter If Len(strChoice) > 1 Then MsgBox “Invalid: You must only enter 1 letter at a time!” FirstLevelValidation = “SkipRest” Else ‘Make sure the player did not type a number by accident If IsNumeric(strChoice) = “True” Then MsgBox “Invalid: Only letters can be accepted as valid input!” FirstLevelValidation = “SkipRest” Else FirstLevelValidation = “Continue” End If End If End Function Function SecondLevelValidation() ‘Check to see if this letter is already on the incorrectly guessed list If Instr(1, strWrongGuesses, UCase(strChoice), 1) <> 0 Then SecondLevelValidation = “DuplicateWrongAnswer” Else ‘Check to see if this letter is already on the correctly guessed list If Instr(1, strRightGuesses, UCase(strChoice), 1) <> 0 Then SecondLevelValidation = “DuplicateRightAnswer” End If End If End Function 313 Chapter 9 • Handling Script Errors 314 Function TestLetterGuess() If Instr(1, UCase(strGameWord), UCase(strChoice), 1) = 0 Then ‘Add the letter to the list of incorrectly guessed letters strWrongGuesses = strWrongGuesses & “ “ & UCase(strChoice) ‘Increment the number of guesses that the player has made by 1 intNoMisses = intNoMisses + 1 ‘If the player has missed 6 guesses then he has used up all chances If intNoMisses = 6 Then blnWordGuessed = “False” End If TestLetterGuess = “IncorrectGuess” Else TestLetterGuess = “CorrectGuess” End If End Function Function NonGuessedString() ‘Loop through the temporary string For intLetterCounter = 1 to Len(strTempStringOne) ‘Examine each letter in the word one at a time strWordLetter = Mid(strTempStringOne, intLetterCounter, 1) ‘Otherwise add an underscore character indicating a nonmatching guess If UCase(strWordLetter) <> UCase(strChoice) Then strTempStringTwo = strTempStringTwo & strWordLetter Else ‘The letter matches player’s guess. Add it to the temporary string intNoRight = intNoRight + 1 strRightGuesses = strRightGuesses & “ “ & UCase(strChoice) strTempStringTwo = strTempStringTwo & “_” End If Next End Function Microsoft WSH and VBScript Programming for the Absolute Beginner, Second Edition Function CheckIfGameWon() ‘Check and see if the player has guessed all the letters that make up ‘the word. If so, set indicator variable and exit the Do Until loop If intNoRight = Len(strGameWord) Then CheckIfGameWon = “True” End If End Function Function FlipString() ‘Spin through and reverse the letters in the strTempStringTwo variable ‘In order to switch letters to underscore characters and underscore ‘characters to the appropriate letters For intFlipCounter = 1 to Len(strTempStringTwo) ‘Examine each letter in the word one at a time strWordLetter = Mid(strTempStringTwo, intFlipCounter, 1) ‘Replace each letter with the underscore character If strWordLetter <> “_” Then strDisplayString = strDisplayString & “_ “ Else ‘Replace each underscore with its appropriate letter strDisplayString = strDisplayString & _ Right(Left(strGameWord,intFlipCounter),1) & “ “ End If Next End Function ‘Determine if the player won or lost and display game results Function DisplayGameResults() ‘Select message based on whether or not the player figured out the word If blnWordGuessed = “True” Then strMsgText = “Congratulations, You Win!” 315 Chapter 9 • Handling Script Errors 316 Else strMsgText = “Sorry, You Lose.” End If ‘Display the results of the game intPlayAgain = MsgBox(vbCrLf & “The word was: “ & _ UCase(strGameWord) & vbCrLf & vbCrLf & vbCrLf & strMsgText & _ vbCrLf & vbCrLf & vbCrLf & _ “Would you like to play again?” , 4, cTitleBarMsg) ‘Find out if the player wants to play another game If intPlayAgain = 6 Then ‘If the answer is yes reset the following variables & start a new game strDisplayString = “” strTempStringTwo = “” PlayTheGame() End If End Function ‘This function displays the game splash screen Function SplashScreen() MsgBox “Thank you for playing VBScript Hangman © Jerry Ford 2002.” & _ vbCrLf & vbCrLf & “Please play again soon!”, , cTitlebarMsg End Function Although the script, as shown here, should work just fine, there is always the chance that you’ll miss something or make a typo when creating it. After all, this is a rather large script and with size generally comes complexity, which only increases the probability that some- thing will go wrong. After you’ve thoroughly tested the script, give it to somebody else to test. Ask your tester to play the game according to the rules, and then ask him to play it by not following the rules. Ask your tester to keep track of any problems that he experiences and to record any error mes- sages that might appear. If an error does appear, get the player to write down exactly what steps he took, so that you can go back and generate the error yourself and begin debugging it. Microsoft WSH and VBScript Programming for the Absolute Beginner, Second Edition Summary In this chapter, you learned how to add programming logic to your scripts to help deal with errors. This included everything from rewriting error messages to making them more user friendly to ignoring errors or creating error-handling routines that allow your scripts to recover from certain types of errors. I also provided advice that can help you prevent errors from occurring in the first place, or at least minimize their number. Finally, I reviewed the different ways of reporting errors that cannot otherwise be handled. On top of all this, you learned how to create the Hangman game and how to test it at various stages of development. 317 Chapter 9 • Handling Script Errors C HALLENGES 1. Make the Hangman game more fun and interesting by expanding the pool of game words. 2. Improve the Hangman program by keeping track of the number of games played during a session and displaying a summary of the overall number of times the player won and lost. 3. Add logic to the Hangman game that allows you to track its use. For example, prompt the player for his or her name, and then write a message to either a log file or the Windows application event log each time the player plays the game. This page intentionally left blank Using the Windows Registry to Configure Script Settings 10 CHAPTER S o far, all the scripts you’ve worked with in this book collected configura- tion information and input from three places: from the user, from within the script itself, or from INI files. In this chapter, I’ll show you another option for externalizing script settings by storing and retrieving configuration data using the Windows Registry. As a bonus, in the chapter’s game project, I’ll also demonstrate how to retrieve input data from files. Specifically, you will • Review the overall organization and design of the Windows Registry • Learn how to programmatically create, modify, and delete Registry keys and values • Learn how to read data stored in external files and process it as input Project Preview: Part 2 of the Hangman Game In this chapter, you will enhance the Hangman game that you began developing in Chapter 9, “Handling Script Errors.” You’ll begin by creating a new setup script that uses the Windows Registry to store the location of the folder where new external word files are stored. You’ll then modify the Hangman script by remov- ing the array that stores game words within the script and tweaking the script so that it retrieves words from the external word files. You will also modify the game to allow the player to select the category of words to play in. For example, you might want to create different word files for categories such as Foods or Places. CHAPTER . Function Microsoft WSH and VBScript Programming for the Absolute Beginner, Second Edition Function CheckIfGameWon() ‘Check and see if the player has guessed all the letters that make up the word back and generate the error yourself and begin debugging it. Microsoft WSH and VBScript Programming for the Absolute Beginner, Second Edition Summary In this chapter, you learned how to add programming. _ “Type a letter and click on OK.” , cTitleBarMsg) ‘Determine if the player has quit If strChoice = “” Then Exit Function End If Microsoft WSH and VBScript Programming for the Absolute Beginner, Second