Игра крестики нолики на vb

5 ноября 2018 - Администратор

В этом уроке мы напишем игру крестики-нолики на 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

 Вернуться к содержанию

Поделиться:

 
Комментарии (0)

Нет комментариев. Ваш будет первым!