title: Why is my variable resetting its value?
body: <p>Below is a powershell script I'm attempting to write. The problem is when I call the Validate-Response method, the variables $playGame and $validResponse keep resetting their value even though inside the method Validate-Response is clearly saying to set them both to true if the user inputs "Y". Help?</p>
  
  <p><strong>The method that is being referred to is:</strong></p>
  
  <pre><code>function Validate-Response{
      $validResponse
      if ($response -eq "Y"){
          $validResponse = "True"     
          $playGame = "True"
      } 
      elseif ($response -eq "N") { 
          Clear-Host 
          Write-host " `n`n Please return and play again soon." 
          Read-Host exit
          break 
      } 
      else { 
          Clear-Host
          Write-Host "`n`n Invalid input. Please press Enter try again." 
          Read-Host
             $validResponse = "False"
  
      }
      return $validResponse, $playGame
  }
  </code></pre>
  
  <p><strong>The Entire program:</strong></p>
  
  <pre><code>#Define variables used in this script 
  $playGame 
  #Controls gameplay and when to stop gameplay 
  $response = "" 
  #Stores the player’s input when prompted to play a game 
  $number = 0 
  #Stores the game’s randomly generated number 
  $secretWord = "" 
  #Stores the secret word for the current round of play 
  $attempts = 0 
  #Keeps track of the number of valid guesses made 
  $status = "True" 
  #Controls the current round of play 
  $guesses = "" 
  #Stores a list of letters by the player during gameplay 
  $reply 
  #Stores player letter guesses 
  $tempstring 
  #Stores a display string, with hidden characters, that is used 
  #to represent the secret word during gameplay 
  $validReply 
  #Stores the player’s response when prompted to play a new game
  $validResponse
  #String listing unacceptable input 
  $GuessesRemaining 
  #Keeps track of the number of guesses the player has left 
  #Create an Associative array and load it with words 
  $words = @{} 
  $words[0] = @("", "", "", "", "", "", "", "", "", "", "", "", "", "", "") 
  $words[1] = @("C", "O", "M", "M", "A", "N", "D", "E", "R") 
  $words[2] = @("F", "L", "A", "G") 
  $words[3] = @("T", "O", "A", "S", "T", "E", "R") 
  $words[4] = @("M", "A", "R", "K", "E", "R") 
  $words[5] = @("P", "I", "C", "T", "U", "R", "E") 
  $words[6] = @("D", "E", "S", "K") 
  $words[7] = @("G", "L", "O", "B", "E") 
  $words[8] = @("S", "P", "E", "A", "K", "E", "R") 
  $words[9] = @("B", "A", "C", "K", "Y", "A", "R", "D") 
  $words[10] = @("P", "E", "N", "C", "I", "L")
  
  #This function determines if the player’s guess is correct or incorrect 
  function Check-Answer { 
      param ($reply) #Argument containing the player’s guess 
      #Access script-level variable representing valid users guesses and 
      #add the current guess to it 
      $script:guesses = $script:guesses + " " + $reply 
      #Loop through each letter in the secret word (e.g., each element in the
      #array) and see if it matches the player’s guess 
      for ($i = 0; $i -le $secretWord.length - 1; $i++) { 
          if ($secretWord[$i] -ne $reply) { 
              #The guess does not match 
              #Place an underscore character into $word[0] in place of the letter 
              if ($words[0][$i] -eq "") {$words[0][$i] = "_"} 
          } 
          else 
          { #The guess matches #Place the letter being guessed into $word[0] 
              $words[0][$i] = $reply 
          } 
      } 
  }
  function Validate-Answer{
      param ($reply)
      $validReply = "False"
      if ($reply -eq "") { 
          #If an empty string was submitted, repeat the loop
          continue  
      } 
      #It is time to validate player input 
      elseif ($reply.Length -gt 1) { 
          #Limit input to one character at a time 
          Clear-Host #Clear the Windows command console screen 
          Write-Host "`n`n Error: You may enter only one letter at a time." 
          Read-Host "`n`n`n`n`n`n`n`n`n`n`n Press Enter to continue." 
          $reply = "" #Clear out the player’s input
          continue # Repeat the loop 
      } 
      elseif (1234567890 –match $reply) { 
          #Numeric input is not allowed 
          Clear-Host #Clear the Windows command console screen 
          Write-Host "`n`n Error: Numeric guesses are not allowed." 
          Read-Host "`n`n`n`n`n`n`n`n`n`n`n Press Enter to continue." 
          $reply = "" #Clear out the player’s input 
          continue #Repeat the loop 
      }
      elseif ($rejectList -match $reply) { 
          Clear-Host #Clear the Windows command console screen 
          Write-Host "`n`n Error: Special characters are not permitted." 
          Read-Host "`n`n`n`n`n`n`n`n`n`n`n Press Enter to continue." 
          $reply = "" #Clear out the player’s input 
          continue #Repeat the loop 
      }
      else{
          $validReply = "True"
  
      }   
  
  }
  
  
  
  #Prompt the player to guess a number 
  while ($playGame -ne "True") {
      Clear-Host 
      #Clear the Windows command console screen 
  
      #Display the game’s opening screen 
      Write-Host "`n`n`n`n" 
      write-Host " Welcome to the                         *********" 
      Write-Host "                                        *       *" 
      Write-host " PowerShell Hangman Game!               O       *" 
      Write-host "                                      __|__     *" 
      Write-host "                                        |       *" 
      Write-host "                                       / \      *" 
      Write-host "                                                *" 
      Write-host "                                                *"
      Write-host "                                                *" 
      Write-host "                                             *******" 
      #Collect the player’s guess
      while ($validResponse -eq "False"){
      $response = Read-Host "`n`n`n`n`n`n`n`n Would you like to play? (Y/N)"
      Validate-Response $reponse
  }
  
  
  
  }
  #Prompt the player to guess a number 
  while ($status -eq "True") {
      #Reset variables at the beginning of each new round of play 
      $tempString = "" 
      $words[0] = @("", "", "", "", "", "", "", "", "", "", "", "", "", "", "") 
      $attempts = 0 
      $guesses = "" 
      $reply = "" 
      #Generate a random number between 1 and 10 
      $number = Get-Random -minimum 1 -maximum 11 
      $secretWord = $words[$number] 
      #Populate an array with the letters that 
      #make up the game’s secret word using the 
      #random number to specify the array index
      #Create a loop to collect and analyze player input 
      while ($validReply -eq "False") {
          Clear-Host #Clear the Windows command console scre              
          $reply = Read-Host "`n`n Enter a guess" #Collect the player answeren 
          Validate-Answer $reply
          Clear-Host #Clear the Windows command console screen 
          $attempts++ #Only increment for good guesses
  
          #Now that player input has been validated, call on the Check-Answer #function to process the input 
          Check-Answer $reply 
          $tempString = "" #Clear out this variable used to display the current state of the word being guessed 
          #Loop through $words[0] and create a temporary display string that 
          #shows the state of the word being guessed 
          for ($i = 0; $i -le $words[0].length - 1; $i++) { 
              $tempString = $tempString + " " + $words[0][$i] 
          }
          #Display the current state of the secret word based on the input 
          #collected from the player 
          Write-Host "`n`n Results:`n" 
          Write-Host " ----------------------------------------- -`n" 
          Write-Host " $tempString`n" 
          Write-Host " ------------------------------------------`n`n" 
          Write-Host " Letters that have been guessed: $guesses`n" 
          #Calculate the number of guesses that the player has left 
          $GuessesRemaining = (12 - $attempts) 
          #Display the number of guesses remaining in the current round of play 
          Write-Host " Number of guesses remaining: $GuessesRemaining"
          #Pause the game to allow the player to review the game’s status 
          Read-Host "`n`n`n`n`n`n`n`n`n Press Enter to continue" 
          if ($tempString -notmatch "_") { 
              Write-Host "`n Game over. You have guessed the secret word!" ` "in $attempts guesses.`n`n" 
              Write-Host " The secret word was $secretWord `n`n" 
              Write-Host "`n`n`n`n`n`n`n`n" ` "`n`n`n`n`n`n`n" 
              Read-Host #Pause gameplay 
              $reply = "Done" #Signal the end of the current round of play 
              break #Repeat the loop 
          } #The player is only allowed 12 guesses, after which the game ends 
          if ($attempts -eq 12) {
              Clear-Host Write-Host "`n Game over. You have exceeded the maximum allowed" ` "number of guesses.`n`n" 
              Write-Host " The secret word was $secretWord `n`n" 
              Write-Host " The best you could do was $tempString`n`n`n`n`n`n`n`n" ` "`n`n`n`n`n`n`n" 
              Read-Host #Pause the game 
              $reply = "Done" #signal the end of the current round of play 
              break #Repeat the loop 
          }
  
  
          $reply = "" #Clear out the player’s input
      }
  
      $response = "" #Reset value to allow the loop to continue iterating 
      #It is time to prompt the player to play another round 
      $validReply = "False" #Set variable to ready its use in the while loop 
      #Loop until valid input is received 
      while ($validReply -ne "True") {
          Clear-Host #Clear the Windows command console screen 
          #Prompt the player to play a new game 
          $response = Read-Host "`n`n Play again? (Y/N)" 
          #Validate the player’s input 
          #Keep playing 
          if ($response -eq "Y"){
              $validReply = "True" 
              $status = "True" 
          } 
          elseif ($response -eq "N") { #Time to quit 
              Clear-Host #Clear the Windows command console screen 
              Write-host " `n`n Please return and play again soon." 
              Read-Host #Pause gameplay 
              $validReply = "True" 
              $status = "False" 
          } 
          else { #Invalid input received 
              Clear-Host #Clear the Windows command console screen 
              Write-Host "`n`n Invalid input. Please press Enter to try again." 
              $validReply = "False" 
              Read-Host #Pause gameplay 
          } 
      }
  }
  </code></pre>