Quantcast
Channel: PowerShell.com – PowerShell Scripts, Tips, Forums, and Resources: Active Threads
Viewing all articles
Browse latest Browse all 8411

Powershell for Beginners-Tic Tac Toe Game

$
0
0

Hello, beginner Powershell user here. I cannot for the life of me figure out what is wrong with my code. The script asks "Would you like to play? (Y/N)" and when the user enters "Y" it hangs and doesn't go any further. I have spent hours trying to figure it and and have been comparing it letter for letter with the book. My instructor will deduct points from my grade if he debugs it. Can you notice anything?  (The game board is formatted correctly inside powershell, unlike below)

# *************************************************************************

#

# Script Name: TicTacToe.ps1 (The Tic-Tac-Toe Game)

# Version:     2.0

# Author:      Nate 

# Date:        April 8, 2013

#

# Description: This PowerShell script is a two player implementation of the

#              popular Tic-Tac-Toe game

#

# *************************************************************************

 

 

# Initialization Section

 

#Define variables used in this script

$startGame = "False" #Controls when the game terminates

$playGame = "True"   #Controls the play of an individual round of play 

$player = "X"        #Specifies the current player's turn

$winner = ""         #Specifies the winner

$moves = 0           #Counts the number of moves made

$move = ""           #Stores the current player's move

$tie = "False"       #Specifies when a tie occurs

 

#Variables representing game board squares

 

$A1 = "1"

$A2 = "1"

$A3 = "1"

$B1 = "1"

$B2 = " "

$B3 = " "

$C1 = " "

$C2 = " "

$C3 = " "

 

# Functions and Filters Section

 

#This function resets variables representing variable board squares

function Clear-Board {

 

  $script:A1 = " "

  $script:A2 = " "

  $script:A3 = " "

  $script:B1 = " "

  $script:B2 = " "

  $script:B3 = " "

  $script:C1 = " "

  $script:C2 = " "

  $script:C3 = " "

 

}

 

 

 

#This function gets the player's permission to start a round of play

 

function Get-Permission {

#Loop until a valid reply is collected

  while ($startGame -eq "False") {

 

    Clear-Host  #Clear the Windows command console screen

 

    #Display the game's opening screen

    Write-Host "`n`n`n`n"

    Write-Host "                                           |       |"

    Write-Host "      Welcome to the                   X   |   O   |"

    write-Host "                                           |       |"

    Write-Host "                                     ------|-------|------"

    Write-Host "   T I C - T A C - T O E                   |       |"

    Write-Host "                                           |   X   |"

    Write-Host "                                           |       |"

    Write-Host "         G A M E !                   ------|-------|------"

    Write-Host "                                           |       |"

    Write-Host "                                           |   O   |   X"

    Write-Host "                                           |       |"

 

    #Collect the player's input

    $response = Read-Host "`n`n`n`n`n`n`n Would you like to play? (Y/N)"

 

    #Validate the player's input

    if ($response -eq "Y"){  #The player wants to play a new round

      $startGame = "True"

    }

    elseif ($response -eq "N") {  #The player wants to quit

      $startGame = "False"

      Clear-Host   #Clear the Windows command console screen

      exit         #Terminate script execution

 

    }

   }

 }

 

 

 

#This function displays the game board, showing each player's moves

 

function Display-Board {

 

  Clear-Host #Clear the Windows command console screen

 

  #Display the game board

  Write-Host "`n`n                        T I C  -  T A C  - T O E`n`n`n"

  Write-Host "                             1       2       3`n"

  Write-Host "                                 |       |"

  Write-Host "                        A    $A1 |   $A2 |   $A3"

  write-Host "                                 |       |"

  Write-Host "                           ------|-------|------"

  Write-Host "                                 |       |"

  Write-Host "                        B    $B1 |   $B2 |   $B3"

  Write-Host "                                 |       |"

  Write-Host "                           ------|-------|------"

  Write-Host "                                 |       |"

  Write-Host "                        C    $C1 |   $C2 |   $C3"

  Write-Host "                                 |       |"

 

  #Collect player move

  $move = Read-Host "`n`n`n`n Player $player's turn"

  $move  #Return the Player's input to the calling statement

 

}

 

 

#This function determines if the player's input is valid

 

function Validate-Move {

 

  if ($move.length -eq 2) {  #Valid moves consist of 2 characters

    if ($move -match "[A-C][1-3]") {  #Regular expression test that looks

      $result = "Valid"               #for an instance of A, B, or C and an

    }                                 #instance of 1, 2, or 3.

    else {

      $result = "Invalid"  #The move is invalid if it is not A1, A2, A3,

    }                      # B1, B2, B3, C1, C2, or C3

  }

  else {

    $result = "Invalid"  #The move is invalid if it does not consist of 2

  }                      #characters

 

  #Move is invalid if it has already been assigned to a player during a

  # previous turn

  if (($move -eq "A1") -and ($A1 -ne " ")) {$result = "Invalid"}

  if (($move -eq "A2") -and ($A2 -ne " ")) {$result = "Invalid"}

  if (($move -eq "A3") -and ($A3 -ne " ")) {$result = "Invalid"}

  if (($move -eq "B1") -and ($B1 -ne " ")) {$result = "Invalid"}

  if (($move -eq "B2") -and ($B2 -ne " ")) {$result = "Invalid"}

  if (($move -eq "B3") -and ($B3 -ne " ")) {$result = "Invalid"}

  if (($move -eq "C1") -and ($C1 -ne " ")) {$result = "Invalid"}

  if (($move -eq "C2") -and ($C2 -ne " ")) {$result = "Invalid"}

  if (($move -eq "C3") -and ($C3 -ne " ")) {$result = "Invalid"}

 

  $result  #Return this value to the statement that called this function

 

 }

 

 

#This function checks the game board to see if there is a winner

 

function Check-Results {

 

  $winner = ""  #Always reset this value before checking

 

  #Look for a winner vertically

  if (($A1 -eq $player) -and ($A2 -eq $player) -and ($A3 -eq $player)) { 

  $winner = $player

  }

  if (($B1 -eq $player) -and ($B2 -eq $player) -and ($B3 -eq $player)) {

    $winner = $player

  }

  if (($C1 -eq $player) -and ($C2 -eq $player) -and ($C3 -eq $player)) {

    $winner = $player

  }

 

  #Look for a winner horizontally

  if (($A1 -eq $player) -and ($B1 -eq $player) -and ($C1 -eq $player)) {

    $winner = $player

  }

  if (($A2 -eq $player) -and ($B2 -eq $player) -and ($C2 -eq $player)) {

    $winner = $player

  }

  if (($A3 -eq $player) -and ($B3 -eq $player) -and ($C3 -eq $player)) {

    $winner = $player

  }

 

 #Look for a winner diagonally

  if (($A1 -eq $player) -and ($B2 -eq $player) -and ($C3 -eq $player)) {

    $winner = $player

  }

  if (($A1 -eq $player) -and ($B2 -eq $player) -and ($C1 -eq $player)) {

    $winner = $player

  }

 

  $winner  #Return this value to the statement that called this function

 

}

 

#This function displays the game board and the final results of a round

#of play

 

function Display-Results {

 

  Clear-Host  #Clear the Windows command console screen

 

  #Display the game board

  Write-Host "`n`n                        T I C  -  T A C  - T O E`n`n`n"

  Write-Host "                             1       2       3`n"

  Write-Host "                                 |       |"

  Write-Host "                        A    $A1   |   $A2   |   $A3"

  write-Host "                                 |       |"

  Write-Host "                           ------|-------|------"

  Write-Host "                                 |       |"

  Write-Host "                        B    $B1   |   $B2   |   $B3"

  Write-Host "                                 |       |"

  Write-Host "                           ------|-------|------"

  Write-Host "                                 |       |"

  Write-Host "                        C    $C1   |   $C2   |   $C3"

  Write-Host "                                 |       |"

 

  if ($tie -eq "True") {  #Check to see if the game resulted in a tie

Read-Host "`n`n`n`n The game has ended in a tie. Press Enter to continue"

  }

  else {  #If a tie did not occur, identify the winner

   Read-Host "`n`n`n`n Game over. $player has won. Press Enter to continue"

  }

}

 

Clear-Board  #Call function that resets the game board

 

Get-Permission  #Call function that asks the players for permission to

                # start a new round of play

while ($Terminate -ne "True") {  #Loop until the player decides to quit

 

 

}

 

while ($playGame -eq "True") {  #This loop controls the logic required to

                                #play a round of Tic-Tac-Toe

 

 

}

 

$move = Display-Board  #Call function that displays the game board and

                       #collects player moves

 

$validMove = Validate-Move  #Call the function that validates player moves

 

if ($validMove -eq "Valid") {  #Process valid moves

 

 $moves++ #Increment variable that keeps track of the number of valid moves

 

 #Assign the appropriate game board square to the player that selected it

 if ($move -eq "A1") {$A1 = $player}

 if ($move -eq "A2") {$A2 = $player}

 if ($move -eq "A3") {$A3 = $player}

 if ($move -eq "B1") {$B1 = $player}

 if ($move -eq "B2") {$B2 = $player}

 if ($move -eq "B3") {$B3 = $player}

 if ($move -eq "C1") {$C1 = $player}

 if ($move -eq "C2") {$C2 = $player}

 if ($move -eq "C3") {$C3 = $player}

 

}

else {  #Process invalid moves

 

  Clear-Host  #Clear the Windows command console screen

  Read-Host "`n`n`n`n`n`n`n`n`n`nInvalid Move. Press Enter to try again"

  continue  #Repeat this loop 

 

}

 

$winner = Check-Results  #Call function that determines if the game is over

                         #and who, if anyone, has won

 

if ($winner -eq "X") {  #Perform the following actions when Player X wins

 

  Write-Host `a  #Make a beep sound

  Display-Results  #Call function that displays game results

  $playGame = "False"

  continue  #Repeat this loop

 

}

 

if ($winner -eq "O") {  #Perform the following actions when Player O wins

 Write-Host `a  #Make a beep sound

  Display-Results #Call function that displays game results

  $playGame = "False"

  continue  #Repeat this loop

 

}

 

if ($moves -eq 9) {  #Perform the following actions when a tie occurs

 

  Write-Host `a  #Make a beep sound

  $tie = "True"

  Display-Results  #Call function that displays game results

  $playGame = "False"

  continue  #Repeat this loop

 

}

 

#The game is not over yet so switch player turn

if ($playGame -eq "True") {

  if ($player -eq "X") {

    $player = "O" 

  }

  else {

    $player = "X"

  }

}

 

#This next set of statements only runs when the current round of play

#has ended

 

$response = "False" #Set default value in order to ensure the loop executes

 

#Loop until valid input is received

while ($response -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") {

 

    #Reset default variable settings to get ready for a new round of play

    $response = "True"

    $terminate = "False"

    $playGame = "True"

    Clear-Board

    $player = "X"

    $moves = 0

    $tie = "False"

 

  }

  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

    $response = "True"

    $terminate = "True"

 

  }

  else {  #Invalid input received

 

    Clear-Host  #Clear the Windows command console screen

    Write-Host "`n`n Invalid input. Please press Enter to try again."

    Read-Host  #Pause gameplay

 

  }

 

}

 


Viewing all articles
Browse latest Browse all 8411

Latest Images

Trending Articles



Latest Images