Игра крестики нолики на vb
В этом уроке мы напишем игру крестики-нолики на VB.
В данном уроке мы разберём, как использовать массивы в VB, вложенные циклы в VB и создание собственных процедур в VB. Игра должна начинаться при нажатии кнопки «Играть». Если какой-либо из игроков победил, то должно выводиться соответствующее сообщение.
Алгоритм игры крестики-нолики на VB
Поле разбито на 9 полей, каждому полю соответствует своя кнопка и свой элемент массива. В этот массив записывается состояние поля. Если элемент массива равен нулю, то соотвествующее поле пустое, если мы ставим крестик, то выбранный нами элемент массива приравнивается к единице, если ставим нолик, то элементу массива присваивается значение 2. При каждой постановке крестика или нолика ход передаётся другому игроку. Так продолжается до тех пор, пока игровое поле не заполнится, или какой-либо из игроков не победит. Победа одного из игроков проверяется при каждом нажатии кнопки. Если какой-либо игрок победил, то все кнопки очищаются и блокируются, и выводится сообщение «Игрок победил!». Затем можно опять нажать «Играть» и начать новую игру.
Создаём интерфейс программы игры крести нолики на vb. Чтобы приведённый нами ниже код работал, лучше начните размещать кнопки построчно сверху вниз.
Введём глобальную переменную hod, отвечающую за то, какой игрок ходит в данный момент. Введём глобальный массив field(4, 4), отвечающий за состояние каждого поля, первый индекс массива отвечает за номер строки выбранного поля, второй индекс отвечает за номер столбца выбранного поля. Наше поле для игры в крестики-нолики будет размером 3×3 клетки. При задании массива мы должны написать максимальные значения для каждого индекса, но стоит помнить, что отсчёт индексов начинается с нуля, то есть в массиве array(2) будет 3 элемента (array(0), array(1), array(2)), так как отсчёт индексов начинается с нуля. Далее по ходу урока мы объясним, почему мы вводим массив с максимальными значениями индексов 4.
Чтобы обработать нажатие каждой кнопки на каждый элемент кнопки нажимаем два раза и переходим в функцию, работающую при нажатии на эту кнопку.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
…
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
…
End Sub
…
Private Sub Button10_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button10.Click
…
End Sub
Когда мы нажимаем на любую кнопку, то должно проверяться, кому принадлежит ход, и занято ли выбранное поле. Напишем условие, если поле не занято, то рисуется текущий ход и ход передаётся другому игроку. Для проверки используем условный оператор if. В условии проверяется свободно ли данное поле field(0, 0) = 0 и чей ход
If field(0, 0) = 0 And hod = 1 Then
Если поле совбодно, то оно заполняется текущим ходом, для этого элементу массива присваивается значение текущего хода и надпись на кнопке меняется. Ход переходит к другому игроку.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If field(0, 0) = 0 And hod = 1 Then
field(0, 0) = 1
Button1.Text = "X"
hod = 2
End If
If field(0, 0) = 0 And hod = 2 Then
field(0, 0) = 2
Button1.Text = "O"
hod = 1
End If
End Sub
Аналогичные действия проводятся при нажатии каждой кнопки, только меняются индексы массива, отвечающие за положение клетки. Чтобы игроки не могли нажимать на кнопки до того, как начинается игра, напишем процедуру для блокировки кнопок. Кнопки будут блокироваться при загрузке программы. За блокировку кнопок отвечает процедура Button.Enabled = True / False, где True – доступная кнопка, а False – заблокированная кнопка. Всего кнопок, нужных для игры – 9, поэтому нам нужно заблокировать их все. Процедура будет выглядеть так.
Public Sub block()
Button1.Enabled = False
Button2.Enabled = False
Button3.Enabled = False
Button4.Enabled = False
Button5.Enabled = False
Button6.Enabled = False
Button7.Enabled = False
Button8.Enabled = False
Button9.Enabled = False
End Sub
Чтобы кнопки блокировались при загрузке формы, нажмём на форму (на пустое место) два раза, и поместим туда процедуру.
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
block()
End Sub
При нажатии кнопки «Играть» поле должно очищаться, кнопки должны включаться, а ход должен переходить к первому игроку. Для этого нужно заменить весь текст в кнопках на «-», значения массивов для каждого индекса должны приравниваться нулю, а переменную hod приравнять к номеру игрока (1 – первый игрок, 2 – второй игрок). Чтобы приравнять все значения массива к нулю, будем перебирать каждый индекс с помощью вложенных циклов For. Текст в кнопках можно поменять с помощью команды ButtonN.Text = “-”. Процедура будет выглядеть следующим образом.
Private Sub Button10_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button10.Click
For i = 0 To 2
For j = 0 To 2
field(i, j) = 0
Next j
Next i
Button1.Enabled = True
…
Button1.Text = "-"
…
hod = 1
End Sub
Теперь напишем функцию проверки поля после сделанного хода. Если какой-либо из игроков победил, то выводится сообщение «Игрок победил!». Мы должны проверить все варианты для определения победил ли игрок.
Стоит помнить, что первый индекс массива field(i, j) отвечает за номер строки поля, а второй за номер столбца поля. Сначала мы разберем случай, когда никто из игроков не победил. Для этого нужно проверить, чтобы какое-либо поле не было заполнено, либо все поля заполнены, и больше вариантов для хода нет, в последнем случае игроки должны будут нажать кнопку «Играть», чтобы начать новую игру. Для этого мы должны перебрать все элементы массива поля Нам не нужно писать функцию проверки на ничью в конце, так как при каждом нажатии кнопки будет выводиться сообщение «Ничья!», а если по итогу игры будет реальная ничья, то сообщение не поменяется. Условия таковы: если какое-либо из полей не заполнено, то выводится сообщение «Ничья!». Знак не равно в VB - <>. Часть кода будет выглядеть таким образом.
For i = 0 To 2
For j = 0 To 2
If field(i, j) <> 1 Or field(i, j) <> 2 Then
Label1.Text = "Ничья!"
End If
Next j
Next i
Теперь напишем проверку на выигрыш. Всего есть три случая выигрыша. Первый – когда все крестики или нолики располагаются по горизонтали, второй - по вертикали, третий - по диагонали. В первом случае мы должны проверить все поля на каждой строке. Для этого мы к каждому значению массива прибавляем по единице и двойке, чтобы проверялись сразу все значения строк. Для этого мы и вводили массив field(4, 4) с максимальными значениями индексов 4, так как если бы ввели массив с максимальными значениями 2 (field(2, 2)), то программа при выполнении приведённой ниже части кода выдала бы ошибку, так как при проверке истинности условия мы бы вышли за пределы индексов массива. Стоит помнить, что номер игрока X – 1, а номер игрока O – 2. Поэтому при проверке условия мы должны проверять, равняется ли это поле значению какого-либо игрока. То есть, если все условия равны единице, то победил игрок X, а если условия равны двум, то победил игрок O. В итоге проверка условия для победы первого игрока будет выглядеть так.
If field(i, j) = 1 And field(i + 1, j) = 1 And field(i + 2, j) = 1 Then
block()
Label1.Text = "Игрок X победил!"
End If
Чтобы проверить победу игрока O, нужно заменить в условии единицу на двойку.
Во втором случае мы должны проверить все столбцы сразу. Для этого вместо добавления значений к строкам, прибавим их к столбцам.
For i = 0 To 2 Step 1
For j = 0 To 2 Step 1
If field(i, j) = 1 And field(i, j + 1) = 1 And field(i, j + 2) = 1 Then
block()
Label1.Text = "Игрок X победил!"
End If
Next j
Next i
В третьем случае нужно проверить индексы по диагонали.
If field(0, 0) = 1 And field(1, 1) = 1 And field(2, 2) = 1 Then
block()
Label1.Text = "Игрок X победил!"
End If
Назовём всю процедуру check(), в итоге получается следующий код процедуры.
' функция проверки выигрыша и ничьи
Public Sub check()
' ничья
For i = 0 To 2
For j = 0 To 2
If field(i, j) <> 1 Or field(i, j) <> 2 Then
Label1.Text = "Ничья!"
End If
Next j
Next i
' по горизонтали
For i = 0 To 2 Step 1
For j = 0 To 2 Step 1
If field(i, j) = 1 And field(i + 1, j) = 1 And field(i + 2, j) = 1 Then
block()
Label1.Text = "Игрок X победил!"
End If
Next j
Next i
For i = 0 To 2 Step 1
For j = 0 To 2 Step 1
If field(i, j) = 2 And field(i + 1, j) = 2 And field(i + 2, j) = 2 Then
block()
Label1.Text = "Игрок O победил!"
End If
Next j
Next i
' по вертикали
For i = 0 To 2 Step 1
For j = 0 To 2 Step 1
If field(i, j) = 1 And field(i, j + 1) = 1 And field(i, j + 2) = 1 Then
block()
Label1.Text = "Игрок X победил!"
End If
Next j
Next i
For i = 0 To 2 Step 1
For j = 0 To 2 Step 1
If field(i, j) = 2 And field(i, j + 1) = 2 And field(i, j + 2) = 2 Then
block()
Label1.Text = "Игрок O победил!"
End If
Next j
Next i
' по диагонали слева направо
If field(0, 0) = 1 And field(1, 1) = 1 And field(2, 2) = 1 Then
block()
Label1.Text = "Игрок X победил!"
End If
If field(0, 0) = 2 And field(1, 1) = 2 And field(2, 2) = 2 Then
block()
Label1.Text = "Игрок O победил!"
End If
' по диагонали справа налево
If field(0, 2) = 1 And field(1, 1) = 1 And field(2, 0) = 1 Then
block()
Label1.Text = "Игрок X победил!"
End If
If field(0, 2) = 2 And field(1, 1) = 2 And field(2, 0) = 2 Then
block()
Label1.Text = "Игрок O победил!"
End If
End Sub
Чтобы проверять победу при каждом нажатии кнопки, поместите эту процедуру в обработку нажатия кнопки. Ниже приведён пример для одной из кнопок.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If field(0, 0) = 0 And hod = 1 Then
field(0, 0) = 1
Button1.Text = "X"
hod = 2
End If
If field(0, 0) = 0 And hod = 2 Then
field(0, 0) = 2
Button1.Text = "O"
hod = 1
End If
check()
End Sub
Полный код программы на vb крестики нолики
Public Class Form1
Dim hod As Integer
Dim field(4, 4) As Integer
' функция блокировки всех кнопок
Public Sub block()
Button1.Enabled = False
Button2.Enabled = False
Button3.Enabled = False
Button4.Enabled = False
Button5.Enabled = False
Button6.Enabled = False
Button7.Enabled = False
Button8.Enabled = False
Button9.Enabled = False
End Sub
' функция проверки выигрыша и ничьи
Public Sub check()
' ничья
For i = 0 To 2
For j = 0 To 2
If field(i, j) <> 1 Or field(i, j) <> 2 Then
Label1.Text = "Ничья!"
End If
Next j
Next i
' по горизонтали
For i = 0 To 2 Step 1
For j = 0 To 2 Step 1
If field(i, j) = 1 And field(i + 1, j) = 1 And field(i + 2, j) = 1 Then
block()
Label1.Text = "Игрок X победил!"
End If
Next j
Next i
For i = 0 To 2 Step 1
For j = 0 To 2 Step 1
If field(i, j) = 2 And field(i + 1, j) = 2 And field(i + 2, j) = 2 Then
block()
Label1.Text = "Игрок O победил!"
End If
Next j
Next i
' по вертикали
For i = 0 To 2 Step 1
For j = 0 To 2 Step 1
If field(i, j) = 1 And field(i, j + 1) = 1 And field(i, j + 2) = 1 Then
block()
Label1.Text = "Игрок X победил!"
End If
Next j
Next i
For i = 0 To 2 Step 1
For j = 0 To 2 Step 1
If field(i, j) = 2 And field(i, j + 1) = 2 And field(i, j + 2) = 2 Then
block()
Label1.Text = "Игрок O победил!"
End If
Next j
Next i
' по диагонали слева направо
If field(0, 0) = 1 And field(1, 1) = 1 And field(2, 2) = 1 Then
block()
Label1.Text = "Игрок X победил!"
End If
If field(0, 0) = 2 And field(1, 1) = 2 And field(2, 2) = 2 Then
block()
Label1.Text = "Игрок O победил!"
End If
' по диагонали справа налево
If field(0, 2) = 1 And field(1, 1) = 1 And field(2, 0) = 1 Then
block()
Label1.Text = "Игрок X победил!"
End If
If field(0, 2) = 2 And field(1, 1) = 2 And field(2, 0) = 2 Then
block()
Label1.Text = "Игрок O победил!"
End If
End Sub
' блокировка всех кнопок при запуске программы
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
block()
End Sub
' действия при нажатии на кнопки
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If field(0, 0) = 0 And hod = 1 Then
field(0, 0) = 1
Button1.Text = "X"
hod = 2
End If
If field(0, 0) = 0 And hod = 2 Then
field(0, 0) = 2
Button1.Text = "O"
hod = 1
End If
check()
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
If field(1, 0) = 0 And hod = 1 Then
field(1, 0) = 1
Button2.Text = "X"
hod = 2
End If
If field(1, 0) = 0 And hod = 2 Then
field(1, 0) = 2
Button2.Text = "O"
hod = 1
End If
check()
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
If field(2, 0) = 0 And hod = 1 Then
field(2, 0) = 1
Button3.Text = "X"
hod = 2
End If
If field(2, 0) = 0 And hod = 2 Then
field(2, 0) = 2
Button3.Text = "O"
hod = 1
End If
check()
End Sub
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
If field(0, 1) = 0 And hod = 1 Then
field(0, 1) = 1
Button4.Text = "X"
hod = 2
End If
If field(0, 1) = 0 And hod = 2 Then
field(0, 1) = 2
Button4.Text = "O"
hod = 1
End If
check()
End Sub
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
If field(1, 1) = 0 And hod = 1 Then
field(1, 1) = 1
Button5.Text = "X"
hod = 2
End If
If field(1, 1) = 0 And hod = 2 Then
field(1, 1) = 2
Button5.Text = "O"
hod = 1
End If
check()
End Sub
Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
If field(2, 1) = 0 And hod = 1 Then
field(2, 1) = 1
Button6.Text = "X"
hod = 2
End If
If field(2, 1) = 0 And hod = 2 Then
field(2, 1) = 2
Button6.Text = "O"
hod = 1
End If
check()
End Sub
Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click
If field(0, 2) = 0 And hod = 1 Then
field(0, 2) = 1
Button7.Text = "X"
hod = 2
End If
If field(0, 2) = 0 And hod = 2 Then
field(0, 2) = 2
Button7.Text = "O"
hod = 1
End If
check()
End Sub
Private Sub Button8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button8.Click
If field(1, 2) = 0 And hod = 1 Then
field(1, 2) = 1
Button8.Text = "X"
hod = 2
End If
If field(1, 2) = 0 And hod = 2 Then
field(1, 2) = 2
Button8.Text = "O"
hod = 1
End If
check()
End Sub
Private Sub Button9_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button9.Click
If field(2, 2) = 0 And hod = 1 Then
field(2, 2) = 1
Button9.Text = "X"
hod = 2
End If
If field(2, 2) = 0 And hod = 2 Then
field(2, 2) = 2
Button9.Text = "O"
hod = 1
End If
check()
End Sub
' кнопка "Играть"
Private Sub Button10_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button10.Click
For i = 0 To 2
For j = 0 To 2
field(i, j) = 0
Next j
Next i
Button1.Enabled = True
Button2.Enabled = True
Button3.Enabled = True
Button4.Enabled = True
Button5.Enabled = True
Button6.Enabled = True
Button7.Enabled = True
Button8.Enabled = True
Button9.Enabled = True
Button1.Text = "-"
Button2.Text = "-"
Button3.Text = "-"
Button4.Text = "-"
Button5.Text = "-"
Button6.Text = "-"
Button7.Text = "-"
Button8.Text = "-"
Button9.Text = "-"
hod = 1
End Sub
End Class
Поделиться:
Нет комментариев. Ваш будет первым!