AQA AS Level Problems - VB - Comp 1
<p>I seem to be having trouble with my program working and I am finding it hard to understand what I have done wrong, first of all I need a simple ( not really complicated) way of checking that the user cannot enter a string or a number over the requested amount (which currently is 1- 9 for menu options and 10 for a save option - which I need to do later) <strong>The code below is the code for the number and string checker relating to the menu and the code below the line is the whole code.</strong></p>

<p>I have tried doing this but it just loops when you enter it for the row and lets you through whatever number you enter on the column. I need help also on other question relating to this like</p>

<p>Telling the user what ship they have hit, </p>

<p>Saving and Loading the game
And a score counter - I had this working then it got deleted when trying to fix first question</p>

<p>And a limit on the amount of goes they can have.</p>

<p>I will upload the code required tomorrow as cannot now, But if anybody has access to the AQA As Level free pseudocode that they give you - (its not illegal ! ) Please help me !</p>

<pre><code>Sub GetRowColumn(ByRef Row As Integer, ByRef Column As Integer) ' Asks the user about where they want to go in the code
    Console.WriteLine()
    Dim checkcol, checkrow As String ' Defining the variables that I will user later
    Dim AscCol, AscRow As Integer

    Console.Write("Please enter a column:") ' Asks users to enter a column
    checkcol = Console.ReadLine()
    AscCol = Asc(checkcol(0)) ' It will check it on the ASCII scale to see if it isnt a letter
    While AscCol &gt; 57 Or AscCol &lt; 48 ' If it doesnt fit in here, it is not one of the alloacated numbers
        Console.WriteLine("This is not a number.")
        Console.Write("Please enter a column")
        checkcol = Console.ReadLine() ' Does the same for checkcol
        AscCol = Asc(checkcol(0))
    End While
    checkcol = ((Chr(AscCol)))
    Column = CInt(checkcol)
    Console.WriteLine() ' This is a printed space for spacing when printed as a code
    Do
        If Column &lt; 0 Or Column &gt; 9 Then ' Now if it fits the column alloation e.g. 1 to 9 it will be allowed through
            Console.WriteLine()
            Console.WriteLine(" That is an invalid Input") ' Tell the user that they cannot go through as it doesn't fit the right requrirments
            Column = Console.ReadLine()
        End If
        Console.WriteLine()
    Loop Until Column &lt; 10 And Column &gt;= 0 ' This part of the code will run until their answer is under 10 and over 0 

    Console.Write("Please enter a row:") ' Here is same for rows as it is for columns 
    checkrow = Console.ReadLine()
    AscRow = Asc(checkrow(0))
    While AscRow &gt; 57 Or AscRow &lt; 48
        Console.WriteLine("This is not a number.")
        Console.Write("Please enter a row")
        AscRow = Asc(checkrow(0))
    End While
    Row = CInt(checkrow)
    Do

        If Row &lt; 0 Or Row &gt; 9 Then
            Console.WriteLine()
            Console.WriteLine("That is an invalid Input.")
        End If
        Console.WriteLine()
    Loop Until Row &lt; 10 And Row &gt;= 0

End Sub
</code></pre>

<p>Other code </p>

<pre><code>'Skeleton Program for the AQA AS Paper 1 Summer 2016 examination
'this code should be used in conjunction with the Preliminary Material
'written by the AQA Programmer Team
'developed in the Visual Studio 2008 programming environment
'Version Number 1.0
Imports System.IO
Module Module1
    Const TrainingGame As String = "Training.txt" ' Calls the training text file used by new players
    Structure TShip ' Starts a new structure for use later that includes a stringed name and a size as an integer
        Dim Name As String
        Dim Size As Integer
    End Structure
    Sub MakePlayerMove(ByRef Board(,) As Char, ByRef Ships() As TShip) ' This part of the code advances on their column and row selection from earlier
        Dim Row As Integer
        Dim Column As Integer
        GetRowColumn(Row, Column)
        If Board(Row, Column) = "m" Or Board(Row, Column) = "h" Then ' m is miss h is a hit 
            Console.WriteLine("Sorry, you have already shot at the square (" &amp; Column &amp; "," &amp; Row &amp; "). Please try again.")
        ElseIf Board(Row, Column) = "-" Then ' Message to user to say that they have shot in a sqaure they habe already shot in
            Console.WriteLine("Sorry, (" &amp; Column &amp; "," &amp; Row &amp; ") is a miss.")
            Board(Row, Column) = "m"
        Else
            Console.WriteLine("Hit at (" &amp; Column &amp; "," &amp; Row &amp; ").")
            Board(Row, Column) = "h"
        End If
    End Sub

    Sub SetUpBoard(ByRef Board(,) As Char)
        Dim Row As Integer
        Dim Column As Integer
        For Row = 0 To 9
            For Column = 0 To 9
                Board(Row, Column) = "-"
            Next
        Next
    End Sub

    Sub LoadGame(ByVal Filename As String, ByRef Board(,) As Char)
        Dim Row As Integer
        Dim Column As Integer
        Dim Line As String
        Using FileReader As StreamReader = New StreamReader(Filename)
            For Row = 0 To 9
                Line = FileReader.ReadLine()
                For Column = 0 To 9
                    Board(Row, Column) = Line(Column)
                Next
            Next
        End Using
    End Sub

    Sub PlaceRandomShips(ByRef Board(,) As Char, ByVal Ships() As TShip)
        Dim Valid As Boolean
        Dim Row As Integer
        Dim Column As Integer
        Dim Orientation As Char
        Dim HorV As Integer
        For Each Ship In Ships
            Valid = False
            While Not Valid
                Row = Int(Rnd() * 10)
                Column = Int(Rnd() * 10)
                HorV = Int(Rnd() * 2)
                If HorV = 0 Then
                    Orientation = "v"
                Else
                    Orientation = "h"
                End If
                Valid = ValidateBoatPosition(Board, Ship, Row, Column, Orientation)
            End While
            Console.WriteLine("Computer placing the " &amp; Ship.Name)
            PlaceShip(Board, Ship, Row, Column, Orientation)
        Next
    End Sub

    Sub PlaceShip(ByRef Board(,) As Char, ByVal Ship As TShip, ByVal Row As Integer, ByVal Column As Integer, ByVal Orientation As Char)
        Dim Scan As Integer
        If Orientation = "v" Then
            For Scan = 0 To Ship.Size - 1
                Board(Row + Scan, Column) = Ship.Name(0)
            Next
        ElseIf Orientation = "h" Then
            For Scan = 0 To Ship.Size - 1
                Board(Row, Column + Scan) = Ship.Name(0)
            Next
        End If
    End Sub

    Function ValidateBoatPosition(ByVal Board(,) As Char, ByVal Ship As TShip, ByVal Row As Integer, ByVal Column As Integer, ByVal Orientation As Char)
        Dim Scan As Integer
        If Orientation = "v" And Row + Ship.Size &gt; 10 Then
            Return False
        ElseIf Orientation = "h" And Column + Ship.Size &gt; 10 Then
            Return False
        Else
            If Orientation = "v" Then
                For Scan = 0 To Ship.Size - 1
                    If Board(Row + Scan, Column) &lt;&gt; "-" Then
                        Return False
                    End If
                Next
            ElseIf (Orientation = "h") Then
                For Scan = 0 To Ship.Size - 1
                    If Board(Row, Column + Scan) &lt;&gt; "-" Then
                        Return False
                    End If
                Next
            End If
        End If
        Return True
    End Function

    Function CheckWin(ByVal Board(,) As Char)
        Dim Row As Integer
        Dim Column As Integer
        For Row = 0 To 9
            For Column = 0 To 9
                If Board(Row, Column) = "A" Or Board(Row, Column) = "B" Or Board(Row, Column) = "S" Or Board(Row, Column) = "D" Or Board(Row, Column) = "P" Then
                    Return False
                End If
            Next
        Next
        Return True
    End Function

    Sub PrintBoard(ByVal Board(,) As Char)
        Dim Row As Integer
        Dim Column As Integer
        Console.WriteLine()
        Console.WriteLine("The board looks like this: ")
        Console.WriteLine()
        Console.Write(" ")
        For Column = 0 To 9
            Console.Write(" " &amp; Column &amp; "  ")
        Next
        Console.WriteLine()
        For Row = 0 To 9
            Console.Write(Row &amp; " ")
            For Column = 0 To 9
                If Board(Row, Column) = "-" Then
                    Console.Write(" ")
                ElseIf Board(Row, Column) = "A" Or Board(Row, Column) = "B" Or Board(Row, Column) = "S" Or Board(Row, Column) = "D" Or Board(Row, Column) = "P" Then
                    Console.Write(" ")
                Else
                    Console.Write(Board(Row, Column))
                End If
                If Column &lt;&gt; 9 Then
                    Console.Write(" | ")
                End If
            Next
            Console.WriteLine()
        Next
    End Sub

    Sub DisplayMenu()
        Console.WriteLine("MAIN MENU") ' Main Menu Screen that is displayed to the user
        Console.WriteLine()
        Console.WriteLine("1. Start new game")
        Console.WriteLine("2. Load training game")
        Console.WriteLine(" 3. Change game limit")
        Console.WriteLine("4. Load Saved Game")
        Console.WriteLine("9. Quit")
        Console.WriteLine()
    End Sub
    Function GetMainMenuChoice() ' Will check if the menu choice is picked can go through
        Dim Choice As Integer ' Dim choice as an integer
        Try
            Console.Write("Please enter your choice: ") ' Ask user to enter their choice for the menu option
            Choice = Console.ReadLine() ' User enters here
            Console.WriteLine()
            If Choice &lt;&gt; "1" And Choice &lt;&gt; "2" And Choice &lt;&gt; "9" And Choice &lt;&gt; "10" Then
                Console.WriteLine("ERROR: Invalid input!") ' If their choice doesnt fit 1, 2 or 9 then it says this message
            End If
            Return Choice ' Return the choice to another part of code
        Catch Ex As Exception
            Console.WriteLine("Please enter a valid input (1, 2,9 or 10)")
        End Try
    End Function

    Sub PlayGame(ByVal Board(,) As Char, ByVal Ships() As TShip)
        Dim GameWon As Boolean = False
        Dim score As Integer = 0
        Dim gamelimit As Integer = 50
        Do
            PrintBoard(Board)
            MakePlayerMove(Board, Ships)
            score = score + 1
            Console.WriteLine("You have taken {0} number of moves,", score)
            GameWon = CheckWin(Board)
            If GameWon Then
                Console.WriteLine("All ships sunk!")
                Console.WriteLine()
            End If
        Loop Until GameWon Or score = 50
        If score = 50 Then
            Console.WriteLine("You used all your moves up. Try again ")

        End If

    End Sub
    Sub SaveGame(ByRef Board(,) As Char)
        Dim SaveGameWrite As StreamWriter
        SaveGameWrite = New StreamWriter("TEST.txt", True)

        For x As Integer = 0 To 9
            For y As Integer = 0 To 9
                SaveGameWrite.Write(Board(x, y))
            Next
        Next
        SaveGameWrite.Close()
    End Sub
    Sub LoadSavedGame(ByVal Filename As String, ByRef Board(,) As Char)
        Dim Row, Column As Integer
        Dim Line As String

        Console.WriteLine("Load training game or open a saved game? T for training or S for saved")

        If Console.ReadLine = "" Then
            Console.WriteLine("Enter the filename: ")
            Filename = Console.ReadLine
        End If
        Using FileReader As StreamReader = New StreamReader("C:\" &amp; Filename)
            For Row = 0 To 9
                Line = FileReader.ReadLine()
                For Column = 0 To 9
                    Board(Row, Column) = Line(Column)
                Next
            Next
        End Using
    End Sub
    Sub SetUpShips(ByRef Ships() As TShip)
        Ships(0).Name = "Aircraft Carrier"
        Ships(0).Size = 5
        Ships(1).Name = "Battleship"
        Ships(1).Size = 4
        Ships(2).Name = "Submarine"
        Ships(2).Size = 3
        Ships(3).Name = "Destroyer"
        Ships(3).Size = 3
        Ships(4).Name = "Patrol Boat"
        Ships(4).Size = 2
    End Sub

    Sub Main()
        Dim Board(9, 9) As Char
        Dim Ships(4) As TShip
        Dim MenuOption As Integer
        Do
            SetUpBoard(Board)
            SetUpShips(Ships)
            DisplayMenu()
            MenuOption = GetMainMenuChoice()
            If MenuOption = 1 Then
                PlaceRandomShips(Board, Ships)
                PlayGame(Board, Ships)
            ElseIf MenuOption = 2 Then
                LoadGame(TrainingGame, Board)
                PlayGame(Board, Ships)
            ElseIf MenuOption = 3 Then
                PlaceRandomShips(Board, Ships)
                PlayGame(Board, Ships)
            End If
        Loop Until MenuOption = 9
    End Sub
End Module
</code></pre>

<p>Thanks in advance, </p>

<p>The Scottish Warrior </p>