Noughts And Crosses 2

@echo off
setlocal enabledelayedexpansion
title Noughts and crosses 2



:main
    call :titleScreen
    if "%EXIT%"=="1" exit /b
    call :firstSetup

    :main_Loop
    call :resetBoard
    call :gameLoop
    call :endGameScreen %win%
    if /i %rematch%==Y (
        goto main_Loop
    )
    exit /b


:titleScreen
    echo Welcome to Noughts and Crosses.
    echo.
    echo.
    echo Type EXIT to quit the game.
    echo.
   
    :askP1Type
        set p1Type=
        set /p p1Type="Player 1 - Human or computer? [H/C] - "
        if /i "!p1Type!"=="C" goto askP2Type
        if /i "!p1Type!"=="H" goto askP2Type
        if /i "!p1Type!"=="EXIT" (
            set EXIT=1
            exit /b
        )
    goto askP1Type

    :askP2Type
        set p2Type=
        set /p p2Type="Player 2 - Human or computer? [H/C] - "
        if /i "!p2Type!"=="C" exit /b
        if /i "!p2Type!"=="H" exit /b
        if /i "!p2Type!"=="EXIT" (
            set EXIT=1
            exit /b
        )
    goto askP2Type



:firstSetup
    set p1Score=0
    set p2Score=0
    set turn=
    set p1Char=X
    set p2Char=O
    set p1Score=0
    set p2Score=0
    set NL=^


    ::winList contains all the possible winning lines, separated by the new line character.
    set winList=1 2 3 !NL! 4 5 6 !NL! 7 8 9 !NL! 1 4 7 !NL! 2 5 8 !NL! 3 6 9 !NL! 1 5 9 !NL! 3 5 7
    exit /b

:ResetBoard
    for /l %%I in (1,1,9) do (
        set G%%I=%%I
    )
    if "%turn%"=="" (
        set /a turn=%random% %% 2 + 1
    ) else (
        set /a turn= 3 - %turn%
    )
    set turnCount=0
    set availableMoves=123456789
    set errorMessage=
    set win=0
    exit /b

:gameLoop
    set /a otherTurn= 3 - %turn%
    if /i "!p%turn%Type!"=="H" (
        call :humanTurn
    ) else (
        call :computerTurn %turn% !p%turn%Char! !p%otherTurn%Char!
    )
    set /a turnCount+=1
    set availableMoves=!availableMoves:%move%=!
    if NOT %win%==0 exit /b
    if %turnCount%==9 exit /b
    set /a turn= 3 - %turn%
    goto GameLoop

:humanTurn
    call :displayGrid
    echo.
    echo.%infoMessage%
    set infoMessage=
    set move=
    set /p move= Player %turn%'s turn. Enter the number of your move [1-9] -
    if !move! lss 1 (
        set infoMessage=Invalid move, enter a number between 1 and 9.
        goto humanTurn
    )
    if !move! gtr 9 (
        set infoMessage=Invalid move, enter a number between 1 and 9.
        goto humanTurn
    )
    if NOT "!G%Move%!"=="!Move!" (
        set infoMessage=That move has already been made, choose another.
        goto humanTurn
    )
    set G%move%=!p%turn%Char!
    call :CheckWin %turn% !p%turn%Char!
    exit /b

:computerTurn

    set move=
    for /f "tokens=1-3 delims= " %%I in ("!winList!") do (       
        if "!G%%I!!G%%J!!G%%K!"=="%2%2%%K" (
            set move=%%K
        )
        if "!G%%I!!G%%J!!G%%K!"=="%2%%J%2" (
            set move=%%J
        )
        if "!G%%I!!G%%J!!G%%K!"=="%%I%2%2" (
            set move=%%I
        )

        if NOT "!move!"=="" (
            set G!move!=%2
            set win=%1
            exit /b
        )

    )

    for /f "tokens=1-3 delims= " %%I in ("!winList!") do (
        if "!G%%I!!G%%J!!G%%K!"=="%3%3%%K" (
            set move=%%K
        )
        if "!G%%I!!G%%J!!G%%K!"=="%3%%J%3" (
            set move=%%J
        )
        if "!G%%I!!G%%J!!G%%K!"=="%%I%3%3" (
            set move=%%I
        )

        if NOT "!move!"=="" (
            set G!move!=%2
            exit /b
        )
    )
    set /a moveGuess= %random% %% ( 9 - %turnCount% )
    set move=!availableMoves:~%moveGuess%,1!
    set G%move%=!p%turn%Char!
    exit /b

:displayGrid
    cls
    echo.
    echo                          ^|   ^|
    echo                        %G1% ^| %G2% ^| %G3%
    echo                      -------------
    echo                        %G4% ^| %G5% ^| %G6%
    echo                      -------------
    echo                        %G7% ^| %G8% ^| %G9%
    echo                          ^|   ^|
    exit /b

:checkWin
    for /f "tokens=1-3 delims= " %%I in ("!winList!") do (
        if "!G%%I!!G%%J!!G%%K!"=="%2%2%2" (
            set win=%1
            exit /b
        )
    )
    set win=0
    exit /b

:endGameScreen
    if NOT %win%==0 (
        set /a p%win%Score+=1
    )
    call :Displaygrid
    echo.
    echo.
    if %win% gtr 0 (
        echo Player %win% wins^!
    ) else (
        echo It's a draw^!
    )
    echo.
    echo.
    echo                   Current Scores
    echo                   --------------
     echo Player 1 Score - %p1Score%                Player 2 Score - %p2Score%
    echo.
    set rematch=
    set /p rematch="Would you like a rematch? [Y/N] - "
    if /i "!rematch!"=="Y" exit /b
    if /i "!rematch!"=="N" (
        exit /b
    ) else (
        goto endGameScreen
    )