VB.net - Создание тестов 2 (+XML)
Продолжаем тему с различными тестами.
Тест - вопрос в виде текста (+XML) |
|
XML с вопросами |
|
Тест - вопрос в виде картинки (+XML +JPG) |
|
XML с вопросами |
|
Картинки (Rar) |
|
В последнее время классический тест - вопрос и 4 варианта ответа - заменяется на задания такого типа. вопрос и набор букв, из которых складывается ответ.
Сегодня я продемонстрирую ее создание.
В этой части мы создадим программу, где вопрос будет представлен в виде текста, а затем - дополним ее таким образом, что бы вопрос был картинкой и текстом.
Вопросы и ответы будем брать из файла XML
На форму помещаем текстовое поле - в него будет выводится вопрос,
3 кнопки - начать, очистить поле ответов и проверка.
кнопка начать - запускает выполнение заданий сначала.
кнопка очистить - очищает поля для ответа, если необходимо исправить.
Проверка - отвечает за проверку правильности ответа, и если он верен, запуск следующего вопроса.
В автоматическом режиме будут созданы 20 кнопок с буквами.
Как вариант, можно сделать несколько уровней сложности (чем меньше "левых" букв, тем проще)
А также кнопки для ответа - их будет столько же сколько и букв в слове-ответе.
А теперь переходим к коду.
Подключаем библиотеку для работы с файлами XML.
Imports System.Xml 'библиотека для работы с ХМЛ
Объявляем переменные
'объявляем переменные
Dim r As New Random 'случайное число
'ярлыки-кнопки для букв
Const wtykBukv = 20 'определяем колво объектов
Const wtykOtv = 15 'определяем колво объектов
Dim cmdN(wtykBukv) As Button 'массив кнопок заданного размера
Dim cmdOtv(wtykOtv) As Button 'массив кнопок заданного размера
Dim wir = 45 'ширина ярлыка
Dim H = 35 'высота ярлыка
Dim interv = 1 'интервал между соседями
Dim Lefts = -25 'положение по горизонтали
'вопрос-ответ инфа
Dim fileName = "test.xml" 'файл с вопросами и ответами
Dim otvetPrav As String 'правильный ответ
Dim maxId_ ' общее колво вопросов
Dim a = 1 'номер вопроса
Dim otvNamb = 1 'для удаления букв из ответа
Dim slovoDlina = 1
'Переменные для перемешивания
Dim massCh As String() = {"а", "б", "в", "г", "д", "е", "ж", "з", "и", "й", "к", "л", "м", "н", "о", "п", "р", "с", "т", "у", "ф", "х", "ц", "ч", "ш", "щ", "ъ", "ы", "ь", "э", "ю", "я"}
Dim mass20(19)
Dim chislo As Byte 'колво выводимых букв
Dim element1, element2, x, y
Первая подпрограмма разбивает слово на буквы, а также добавляет случайные буквы до их общего колва 20.
После буквы перемешиваются и записываются в массив.
а затем из массива записываются в кнопки.
'слова в буквы + рандомные буквы
Sub Str2char(s As String)
'слова в буквы
Randomize() 'функция генерации случайных чисел
chislo = 19 ' от 0 до 19=20 букв
Dim ak = 0 'случайное число
slovoDlina = s.Length - 1 'колво букв
'заполняем массив буквами из слова
For i = 0 To s.Length - 1
mass20(i) = s.Chars(i)
Next
'в оставшееся место случайные буквы
For i = s.Length To chislo
ak = r.Next(1, 31) 'создание случ числа
mass20(i) = massCh(ak)
Next
'перемешивание массива букв
Randomize()
For i = 0 To 10000
x = Int(Rnd() * chislo) 'Определили случайный элемент массива с номером х
y = Int(Rnd() * chislo) 'Определили случайный элемент массива с номером y
element1 = mass20(x) 'Запомнили значение случайного х-элемента массива
element2 = mass20(y) 'Запомнили значение случайного y-элемента массива
mass20(y) = element1 'Присвоили случайному x элементу значение y элемента
mass20(x) = element2 'Присвоили случайному y элементу значение x элемента
Next
For i = 1 To wtykBukv 'от 1 до последнего элемента
'пишем текст
cmdN(i).Text = mass20(i - 1)
cmdN(i).Enabled = True
Next
End Sub
Следом идут 2 подобных подпрограммы - для создания кнопок для случайных букв и для ввода ответа.
Основные их свойства - размеры, тип шрифта - одинаковы.
Отличаются они только положение по оси у - одни выше других.
'создаем кнопки для букв
Sub knopki()
Dim Tops = 210 'положение по вертикали
'располагаем наши кнопки на форме
For i = 1 To wtykBukv 'от 1 до последнего элемента
cmdN(i) = New Button 'каждый элемент массива - новая кнопка
'размеры
cmdN(i).Height = H
cmdN(i).Width = wir
'положение на форме
If i < 11 Then
cmdN(i).Left = Lefts + i * (interv + wir)
cmdN(i).Top = Tops
Else
cmdN(i).Left = Lefts + (i - 10) * (interv + wir)
cmdN(i).Top = Tops + H
End If
'выравниваем текст по центру
cmdN(i).TextAlign = ContentAlignment.MiddleCenter
cmdN(i).Font = New System.Drawing.Font("Arial", 15) 'задаем шрифт
'пишем текст
cmdN(i).Text = i 'mass20(i - 1)
cmdN(i).Visible = True 'делаем видимыми
Me.Controls.Add(cmdN(i)) 'добавляем на форму
'кликаем - получаем индекс элемента
AddHandler cmdN(i).Click, AddressOf cmdNClick
Me.Controls.AddRange(Me.cmdN)
'ЭНД --- кликаем - получаем индекс
Next
End Sub
'кнопки для ответа
'создаем 15 шт, но делаем все невидимые
Sub knopkiOtv()
Dim Tops = 145 'положение по вертикали
'располагаем наши кнопки
For i = 1 To wtykOtv 'от 1 до последнего элемента
cmdOtv(i) = New Button 'каждый элемент массива - новый ярлык
'размеры
cmdOtv(i).Height = H
cmdOtv(i).Width = wir
'положение на форме
cmdOtv(i).Left = Lefts + i * (interv + wir)
cmdOtv(i).Top = Tops
'выравниваем текст по центру
cmdOtv(i).TextAlign = ContentAlignment.MiddleCenter
cmdOtv(i).Font = New System.Drawing.Font("Arial", 15) 'задаем шрифт
'пишем текст
cmdOtv(i).Text = ""
cmdOtv(i).Visible = False 'делаем НЕвидимыми
Me.Controls.Add(cmdN(i)) 'добавляем на форму
'кликаем - получаем индекс элемента
AddHandler cmdOtv(i).Click, AddressOf cmdOtvClick
Me.Controls.AddRange(Me.cmdOtv)
'ЭНД --- кликаем - получаем индекс
Next
End Sub
Конечно, можно их было сделать и одной подпрограмме, но тогда понадобилось бы вводить дополнительные условия для обработки нажатий.
А так, у нас получилось для каждого набора кнопок - свой обработчик событий.
для букв-вопросов - по нажатию на кнопку, кнопка становится не активной, а ее текст переносится в свободную кнопку ответа.
для букв-ответа - будет выполнятся только одно событие - очистка ответа от всех букв.
Добавляем обработчики нажатий для каждого набора букв.
'кликаем - получаем индекс
'при щелчке на кнопку - буква помещается в след кнопку ответ
Private Sub cmdNClick(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim i As Integer
'Если надо узнать именно индекс в массиве,
'то ищем объект sender
i = Array.IndexOf(cmdN, sender)
'-------------
If otvNamb <= slovoDlina + 1 Then
cmdOtv(otvNamb).Text = cmdN(i).Text
cmdN(i).Enabled = False
'cmdOtv(otvNamb).Tag = i
otvNamb += 1
End If
End Sub
'кликаем - получаем индекс
'убираем все буквы из ответа
Private Sub cmdOtvClick(ByVal sender As System.Object, ByVal e As System.EventArgs)
clearW()
End Sub
Подпрограмма очистки ответа от букв.
'очищаем ответ от букв
Sub clearW()
'очищаем кнопки ответов от текста
For j = 1 To wtykOtv
cmdOtv(j).Text = ""
Next
'все кнопки с буквами делаем активными
For i = 1 To wtykBukv
cmdN(i).Enabled = True
Next
otvNamb = 1
End Sub
Подпрограмма получения общего кол-ва вопросов - короткий вариант.
' (1) Получение общего колва вопросов
Sub maxIDxml()
Dim xdoc As XDocument = XDocument.Load(fileName)
Me.Text = xdoc.Element("Table").Elements("vprs").Count
End Sub
Подпрограмма вывода нового вопроса.выводим в текст вопрос, делаем видимыми нужное колво букв для ответа.
Выводим все полученные буквы и увеличиваем номер следующего вопроса на 1, если он не больше чем общ колво вопросов.
' (2) показывает текст по номеру ID - вопрос и ответы
Sub elements(nnn As Integer)
otvNamb = 1
maxIDxml()
maxId_ = Val(Me.Text)
'загрузка документа
Dim xdoc As XDocument = XDocument.Load(fileName)
For Each xe As XElement In xdoc.Element("Table").Elements("vprs")
If xe.Element("id").Value = nnn Then
txtVopros.Text = xe.Elements("text").Value
otvetPrav = xe.Elements("otvet").Value
End If
Button3.Text = a ' номер вопроса
slovoDlina = otvetPrav.Length
'убираем все буквы ответа
For j = 1 To wtykOtv
cmdOtv(j).Visible = False
cmdOtv(j).Text = ""
Next
'делаем видимыми необходимое колво букв
For j = 1 To slovoDlina
cmdOtv(j).Text = ""
cmdOtv(j).Visible = True
Next
'разбиваем слово на буквы+лишние буквы
Str2char(otvetPrav)
Next
'если номер вопроса меньше общ колва вопросов
If a < maxId_ Then
a += 1
End If
End Sub
Структура элементов вопроса будет короче.
номер вопроса, текст вопроса, ответ.
<?xml version="1.0" encoding="utf-8"?>
<Table>
<vprs>
<id>1</id>
<text>вопрос1</text>
<otvet>ответ1</otvet>
</vprs>
<vprs>
<id>2</id>
<text>вопрос2</text>
<otvet>ответ2</otvet>
</vprs>
</Table>
Подпрограмма проверка.
Sub proverka(mm As Integer)
'Буквы в слово
Dim vam = ""
For j = 1 To wtykOtv
vam += cmdOtv(j).Text
Next
'дальнейшее действие - новый вопрос
If vam <> otvetPrav Then
MsgBox("error")
Else
elements(a)
End If
End Sub
сравниваем полученное слово с верным.
Если все ок, тогда след вопрос, иначе - ошибка.
С подпрограммами мы закончили, идем дальше.
При загрузке формы мы находим общ колво вопросов в файле, строим оба набора кнопок, и выводим 1 вопрос.
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
maxIDxml()
knopki()
knopkiOtv()
elements(a)
End Sub
Кнопка начать - выводит 1 вопрос.
'начать заново
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
a = 1
elements(a)
End Sub
Кнопка проверка.
Если мы дошли до последнего вопроса, показывает нам, что мы выиграли.
Иначе запускает новый вопрос.
'проверка (тк а уже увеличена а-1)
Private Sub Button4_Click_1(sender As Object, e As EventArgs) Handles Button4.Click
If Val(Button3.Text) = maxId_ Then
txtVopros.Text = "ПОБЕДА"
Button4.Enabled = False
Button3.Enabled = True
Button3.Text = "Начать"
' PictureBox1.Image = Image.FromFile(pctwin)
For j = 1 To wtykOtv
cmdOtv(j).Visible = False
Next
For i = 1 To wtykBukv
cmdN(i).Text = ""
cmdN(i).Enabled = True
Next
MsgBox("win")
Else
proverka(a - 1)
End If
End Sub
Последняя кнопка - очистка - запускает подпрограмму очистки.
'очищаем ответ от букв
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
clearW()
End Sub
Кроме текстового вопроса можно использовать вопрос-картинку, для этого нам необходимо добавить PictureBox, а также внести пару строк в код.
Добавим в переменные
'для картинки 'pct+
Dim pctPach = Application.StartupPath + "\xgamesfoto\n" 'путь до папки с картинками
Dim pctName = "" 'номер картинки - задаем в месте с вопросом
Dim pctEx = ".jpg" 'расширение картинок
'путь к картинке ПОБЕДА
Dim pctwin = Application.StartupPath + "\xgamesfoto\win.jpg"
Вывод ответа - целиком (изменения выделил жирным)
' (2) показывает текст по номеру ID - вопрос и ответы
Sub elements(nnn As Integer)
otvNamb = 1
maxIDxml()
maxId_ = Val(Me.Text)
'загрузка документа
Dim xdoc As XDocument = XDocument.Load(fileName)
For Each xe As XElement In xdoc.Element("Table").Elements("vprs")
If xe.Element("id").Value = nnn Then
'pct+
'при переводе из инт в стринг появляется лишний пробел,
'удаляем его
pctName = LTrim(Str(nnn))
'полный путь к файлу
Dim pctFulNam = pctPach & pctName & pctEx
'размещение файла в пикчер бокс
PictureBox1.Image = Image.FromFile(pctFulNam)
'pct+----end
txtVopros.Text = xe.Elements("text").Value
otvetPrav = xe.Elements("otvet").Value
End If
Button3.Text = a
slovoDlina = otvetPrav.Length
For j = 1 To wtykOtv
cmdOtv(j).Visible = False
cmdOtv(j).Text = ""
Next
For j = 1 To slovoDlina
cmdOtv(j).Text = ""
cmdOtv(j).Visible = True
Next
Str2char(otvetPrav)
Next
If a < maxId_ Then
a += 1
End If
End Sub
Так же можем украсить нашу программу. по нажатию на картинку она будет увеличиваться.
Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click
If PictureBox1.Width = 600 Then
PictureBox1.Width = 300
PictureBox1.Height = 150
Else
PictureBox1.Width = 600
PictureBox1.Height = 300
End If
End Sub
Я использовал картинки размером 600Х300. так что в своей программе вы должны задать размеры исходя из своих картинок.
На сегодня это все.
Оценивайте это видео, изучайте статью и делитесь ими в соц сетях.
Смотреть видео
В начало
|