2016-04-22 7 views
2

私のプログラムに問題があるようですが、私が間違ったことを理解するのは難しいです。AQA AS試験レベル - COMP 1 VB

私は、次のヘルプが必要:

  1. のと同様ではないユーザーが、私はそれはユーザーが列/行セクションに文字列を入力することができないようにする必要がある番号を入力しないですることができます。私はその後、私はのように、今、彼らはもはや機能しなかったのか分からないこれらの作業の両方を持っていた - 彼はEDITこの私が

  2. の保存を考えると、ゲームをロードする固定値ASCIIと私は何かを考えていました。私はセーブゲームファイルを呼び出すためにここでは知りません。

これは、AQAレベルのスケルトンコードです。彼らはあなたにそれを(それは違法ではない!)助けてください!

Sub GetRowColumn(ByRef Row As Integer, ByRef Column As Integer) 
     Dim validColumn, validRow As Boolean ' These are currently set for the user to define them 
     Do 
      Try 
       Do 
        Console.Write("Please enter column: ") 
        Column = Console.ReadLine() 
        If Column < 0 Or Column > 9 Then 
         Console.WriteLine(" That is an Invalid Input") 
        End If 
        validColumn = True  'Sets value to true if the input is valid 
        Console.WriteLine() 
       Loop Until Column < 10 And Column >= 0 
      Catch Ex As Exception 'If the Exception code is run then the value is set to false and the code loops. 
       validColumn = False 
       Console.WriteLine("Enter number from 0 to 9") 
      End Try 
     Loop Until validColumn = True 'Code will loop until the ValidCol = True 
     ' Below is the exact same code, but for the row. 
     Do 
      Try 
       Do 
        Console.Write("Please enter row: ") 
        Row = Console.ReadLine() 
        If Row < 0 Or Row > 9 Then 
         Console.WriteLine(" That is an invalid Input") 
        End If 
        validRow = True 'Sets value to true if the input is valid 
        Console.WriteLine() 
       Loop Until Row < 10 And Row >= 0 'This code above will loop intil row is below than 10 
      Catch Ex As Exception 'If the Exception code is run then the value is set to false and the code loops 
       validRow = False 
       Console.WriteLine() 
       Console.WriteLine("Enter number from 0 to 9") 
       Console.WriteLine() 
      End Try 
      'Code will loop until the ValidRow = True 
     Loop Until validRow = True 
    End Sub 

その他のコード事前に

'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 earlire 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 (" & Column & "," & Row & "). 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, (" & Column & "," & Row & ") is a miss.") Board(Row, Column) = "m" Else Console.WriteLine("Hit at (" & Column & "," & Row & ").") 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 " & 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 > 10 Then 
     Return False 
    ElseIf Orientation = "h" And Column + Ship.Size > 10 Then 
     Return False 
    Else 
     If Orientation = "v" Then 
      For Scan = 0 To Ship.Size - 1 
       If Board(Row + Scan, Column) <> "-" Then 
        Return False 
       End If 
      Next 
     ElseIf (Orientation = "h") Then 
      For Scan = 0 To Ship.Size - 1 
       If Board(Row, Column + Scan) <> "-" 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(" " & Column & " ") 
    Next 
    Console.WriteLine() 
    For Row = 0 To 9 
     Console.Write(Row & " ") 
     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 <> 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 <> "1" And Choice <> "2" And Choice <> "9" And Choice <> "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:\" & 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 

おかげで、コードのあなたの最初のスニペットの場合

+0

見て...あなたはその数値を知っていれば、整数とのwithingあるチェックとして、それをキャストあなたの許容範囲 – Mych

+0

これはコードのどの部分ですか?私は数字の部分が働いたと思った。 – user6240009

+0

あなたは言った... 1)だけでなく、ユーザーが番号を入力しないようにすることはできません。私は、列/行セクションに文字列を入力することができないようにする必要があります。 - 私はASCII値と何かを考えていましたが、2度目に私はそれを読んだことがあります。ユーザーが数字や文字列を入力していない場合は、何が入力されているのですか? – Mych

答えて

1

、ASCIIとなぜトラブル自分で?それは時代遅れだと

Dim validCol As Boolean = False 
    Dim column As Integer 
    While validCol = False 
     Console.Write("Please enter column: ") 
     Dim columnValue As String = Console.ReadLine 

     If (Integer.TryParse(columnValue, column)) Then 
      If column >= 0 AndAlso column < 10 Then 
       validCol = True 
      Else 
       Console.WriteLine("Number must be between 0 and 9") 
      End If 
     Else 
      Console.WriteLine("This is not a number.") 
     End If 
    End While 

    'Do whatever with column 

回避することができInteger.TryParseは、それが失敗した場合、あなたの取得します、Integer型の中に、ユーザが指定した文字列を解析しようとします「これは数ではありません。」メッセージが表示されます。それ以外の場合は、番号が希望の範囲内にあるかどうかがチェックされます。

+0

私は私の編集したものをチェックし、それはすでに手紙と間違った数字のために働いている。それが正しいのですか、それとも私はまだこれを必要としていますか? – user6240009

+0

これは、プログラムの実際の実装ではなく、ASCIIを避ける方法を示すためのものです。 現在、範囲を正しく確認していませんか?私はあなたの編集コードを見てみましょう – p3tch

+0

今私はそれを変更しました私は問題があるかどうか、またはそれが大丈夫かどうかはわかりません。 – user6240009

0

あなたのあなたの負荷のゲームが

Using FileReader As StreamReader = New StreamReader("C:\" & Filename) 

それはあなたのゲームがCに保存されていない可能性が高いですんが、サブパス

SaveGameWrite = New StreamWriter("TEST.txt", True) 

を指定していないゲームのセーブ:\が、これらにはプロジェクトフォルダ内のディレクトリ。あなたはどちらか、Cへのパスを指定する必要があります:\またはApplication.CommonAppDataPathにファイル保存する(それはドライブのルートにプログラムデータを保存するために良いではありません) - だから今になり、あなたのコード内の2行を..

SaveGameWrite = New StreamWriter(Application.CommonAppDataPath & "TEST.txt", True) 
IsNumeric関数(のmyString)...文字列が数値であるかどうかをチェックするための簡単な方法で

Using FileReader As StreamReader = New StreamReader(Application.CommonAppDataPath & Filename)