Thursday, November 7, 2019

Quoridor boardgame on paper

If you like the boardgame Quoridor, you may use this PDF to print it and easily have the game in a very portable way: as in a single sheet of paper. One paper allows you to play the game twice (both sides printed) with 2 or 4 players.

You can use the corners of the paper as the pawns. With a pen, draw the walls on the board and mark the used walls at the bottom of the board.

The abstract strategy game Quoridor is surprisingly deep for its simple rules. The object of the game is to advance your pawn to the opposite edge of the board. On your turn you may either move your pawn or place a wall. You may hinder your opponent with wall placement, but not completely block him off. Meanwhile, he is trying to do the same to you. The first pawn to reach the opposite side wins.

Download files from urls in Excel sheet

If you’d need to download several files based on some concatenated url’s it can be useful to build the url’s with Excel.

This little macro can then be used to download all the url’s found on the active sheet and store the files in a folder.

The target folder where the files need to be stored will be requested upon running the macro.

Based on some example VBA found online.

Sub DownloadUrlsOnSheet()
      Dim iRow, iColumn As Long

      Dim FileNum As Long

      Dim FileData() As Byte

       Dim MyFile As String

      Dim WHTTP As Object

          On Error Resume Next

          Set WHTTP = CreateObject("WinHTTP.WinHTTPrequest.5")

          If Err.Number <> 0 Then

              Set WHTTP = CreateObject("WinHTTP.WinHTTPrequest.5.1")

          End If

      On Error GoTo 0

          targetDir = BrowseForFolder

      If (targetDir = False) Then

          Exit Sub

      End If

          If Dir(targetDir, vbDirectory) = Empty Then MkDir targetDir

          Set rngRange = Nothing

      Set rngRange = Worksheets(ActiveCell.Worksheet.Name).Cells.Find("*", Worksheets(ActiveCell.Worksheet.Name).Cells(1, 1), xlFormulas, xlWhole, xlByRows, xlPrevious)

      If Not rngRange Is Nothing Then

          'if found then assign last non-empty cell row and colum index to the variable

          lngMaxColumIndex = rngRange.Column

          lngMaxRowIndex = rngRange.Row

      Else

          MsgBox ("Error clearing data, please check logs")

          Exit Sub

      End If

          For iRow = 1 To lngMaxRowIndex

          For iColumn = 1 To lngMaxColumIndex

              currValue = Trim(Worksheets(ActiveCell.Worksheet.Name).Cells(iRow, iColumn).Text)

               If CheckURL(currValue) Then

                  TempFile = Right(currValue, InStr(1, StrReverse(currValue), "/") - 1)

                   WHTTP.Open "GET", currValue, False

                  WHTTP.Send

                  FileData = WHTTP.ResponseBody

                   FileNum = FreeFile

                  Open targetDir & "\" & TempFile For Binary Access Write As #FileNum

                       Put #FileNum, 1, FileData

                  Close #FileNum

                   FileNum = FreeFile

                  Open targetDir & "\LogFile.txt" For Append As #FileNum

                  Print #FileNum, currValue & " --- Dowmloaded ----"

                  Close #FileNum

              Else

                  FileNum = FreeFile

                   Open targetDir & "\LogFile.txt" For Append As #FileNum

                  Print #FileNum, currValue & " !!! File Not Found !!!"

                  Close #FileNum

              End If

           Next

      Next

      Set WHTTP = Nothing

      MsgBox "Open the folder " & targetDir & " for the downloaded files..."

      Shell "C:\WINDOWS\explorer.exe """ & targetDir & "", vbNormalFocus

   End Sub   Function BrowseForFolder(Optional OpenAt As Variant) As Variant

       'Function purpose:  To Browser for a user selected folder.

       'If the "OpenAt" path is provided, open the browser at that directory

       'NOTE:  If invalid, it will open at the Desktop level

           Dim ShellApp As Object

            'Create a file browser window at the default folder

      Set ShellApp = CreateObject("Shell.Application"). _

      BrowseForFolder(0, "Please choose a folder", 0, OpenAt)

       'Set the folder to that selected.  (On error in case cancelled)

      On Error Resume Next

      BrowseForFolder = ShellApp.self.Path

      On Error GoTo 0

             'Destroy the Shell Application

      Set ShellApp = Nothing

             'Check for invalid or non-entries and send to the Invalid error

       'handler if found

       'Valid selections can begin L: (where L is a letter) or

       '\\ (as in \\servername\sharename.  All others are invalid

      Select Case Mid(BrowseForFolder, 2, 1)

      Case Is = ":"

          If Left(BrowseForFolder, 1) = ":" Then GoTo Invalid

      Case Is = "\"

          If Not Left(BrowseForFolder, 1) = "\" Then GoTo Invalid

      Case Else

          GoTo Invalid

      End Select

           Exit Function

        Invalid:

       'If it was determined that the selection was invalid, set to False

      BrowseForFolder = False

        End Function

   '

   Function CheckURL(URL) As Boolean

      Dim W As Object

      On Error Resume Next

          Set W = CreateObject("winhttp.winhttprequest.5")

          If Err.Number <> 0 Then

              Set W = CreateObject("winhttp.winhttprequest.5.1")

          End If

      On Error GoTo 0

          If (Len(URL) < 4 Or Left(URL, 4) <> "http") Then

           CheckURL = False

          Exit Function

      End If

              On Error Resume Next

      W.Open "HEAD", URL, False

      W.Send

      If W.Status = 200 Then

          CheckURL = True

      Else

           CheckURL = False

      End If

   End Function