AQA AS 考试级别 - COMP 1 VB
Posted
技术标签:
【中文标题】AQA AS 考试级别 - COMP 1 VB【英文标题】:AQA AS Exam Level - COMP 1 VB 【发布时间】:2016-08-15 21:27:27 【问题描述】:我的程序似乎无法正常运行,我很难理解我做错了什么。
我需要以下帮助:
除了不允许用户输入数字之外,我还需要它不允许用户在列/行部分输入字符串。我正在考虑与他的 ASCII 值有关编辑我认为已修复的问题
保存和加载游戏 - 我有这两个工作,然后我不知道我做了什么,因为现在它们不再工作了。我不知道在这里调出游戏存档文件。
这是 AQA As Level 的框架代码。他们给你(这不违法!)请帮帮我!
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
提前致谢,
【问题讨论】:
看看 IsNumeric(myString)...它是检查字符串是否为数字的简单方法...一旦您知道它的数字,将其转换为整数并进行检查你可以接受的范围 那么这将用于代码的哪一部分?我认为数字部分有效。 你说... 1) 除了不允许用户输入数字之外,我还需要它不允许用户在列/行部分输入字符串。 - 我在想与他的 ASCII 值有关.. 现在我第二次读到它我很困惑......如果用户没有输入数字或字符串,他们输入的是什么...... 您真的应该将每个问题作为一个单独的问题发布 - 这样,如果多个用户各自解决一个问题,他们都可以获得声誉。如果您在一个问题中有所有问题,而多个用户回答了不同的问题,则您只能将一个问题标记为已回答。干杯。 另外,当你说保存游戏不起作用时,你应该包括你遇到的意外行为。从您的问题来看,您已经看过How to Ask,但错过了那一点:) 【参考方案1】:对于您的第一个sn-p 代码,为什么要麻烦自己使用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 将尝试将用户提供的字符串解析为整数,如果失败,您将得到“这不是数字”。消息,否则它将继续检查数字是否在您想要的范围内。
【讨论】:
我检查了我编辑的一个,现在它已经适用于字母和错误的数字了。这是对的还是我还需要这个? 这只是为了向您展示一种避免 ASCII 的方法,而不是您程序的实际实现。您的问题是它现在没有正确检查范围吗?我看看你编辑的代码 现在我已经更改了,我看不出我是否有任何问题,或者是否还可以。【参考方案2】:您的保存游戏子没有指定路径
SaveGameWrite = New StreamWriter("TEST.txt", True)
当你的游戏加载时
Using FileReader As StreamReader = New StreamReader("C:\" & Filename)
您的游戏很可能没有保存到 C:\ ,而是保存到项目文件夹中的目录。您应该指定 C:\ 的路径(将程序数据保存到驱动器的根目录是不好的)或将文件保存到 Application.CommonAppDataPath
- 所以您的代码中的两行现在将是 ..
SaveGameWrite = New StreamWriter(Application.CommonAppDataPath & "TEST.txt", True)
和
Using FileReader As StreamReader = New StreamReader(Application.CommonAppDataPath & Filename)
【讨论】:
以上是关于AQA AS 考试级别 - COMP 1 VB的主要内容,如果未能解决你的问题,请参考以下文章
应用级别内联网用户的 Windows 身份验证(带有 VB 的 ASP.NET)
`levels<-`(`*tmp*`, value = as.character(levels)) 中的错误:因子级别 [3] 重复