Программирование
Веб программирование

Игра "крестики-нолики". Часть1

 
 

Привет всем сегодня я  покажу первый урок, как сделать игру "крестики-нолики". Создадим  класическую 3x3 игру на языке VB.NET

И так приступим.

Создаем стандартную форму а на ней в свою очередь нужно будет разместить ячейки. для ячеек я выбрал элемент управления Label так как он работает и с текстом и с графикой . Ячейки создадим программным путем при помаши массива.

Public Class Form1

    Dimokno(3, 3) AsLabel  'объявляем массив ячеек 3 на 3

    DimhodAsShort = 0  ‘счетчик ходов человека

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

 

        For i = 1 To 3

            For j = 1 To 3

                okno(i, j) = New Label

                Me.Controls.Add(okno(i, j))

                With okno(i, j)

                    .TextAlign = ContentAlignment.MiddleCenter

                    .BorderStyle = BorderStyle.FixedSingle

                    .Width = 100  даемразмерячейкам

                    .Height = 100

                    .Left = (100 * i) – 100 ‘распологаем по горизонтали

                    .Top = (100 * j) – 100  ‘ и по вертикали

                    .Text = ""

                    .Font = New Font("arial", 42) увеличиваемшрифтвячейках

                    .ForeColor = Color.GreenYellow

                    .BackColor = Color.Navy

                    AddHandler okno(i, j).Click, AddressOf OknoClick адресскроцедуре      

 

                                                            ‘события click для всех ячеек

                EndWith

            Next

        Next

    End Sub

End Class

 

Не оброшайте внимания на то что программа будет ругаться на строку OknoClick это прекратиться тогда, когда мы создадим саму процедуру OknoClick

И так у нас получилась форма с 9 ячейками на ней у, каждой ячейки имеется свое номерное имя

Okno(1,1)

Okno(2,1)

Okno(3,1)

Okno(1,2)

Okno(2,2)

Okno(3,2)

Okno(1,3)

Okno(2,3)

Okno(3,3)

 

Первый ход будет за нами и у нас “X” (английская “x” а не русская “ха” )  у компьютера “0” (цифра «0»)

Логика такова после нашего первого хода в любую ячейку компьютер должен сделать ответный ход в любую другую пустую ячейку в случайном порядке

0

X

0

0

0

0

0

0

0

 Пишем этот алгоритм ответного хода компьютера:

    Sub comp_hod1()

        If hod = 5 Then Exit Sub        

        Dim p As Short

        Randomize()

        p = 8 * Rnd()

        If p = 0 And okno(1, 1).Text = "" Then

            okno(1, 1).Text = "0"

        ElseIf p = 1 And okno(1, 2).Text = "" Then

            okno(1, 2).Text = "0"

        ElseIf p = 2 And okno(1, 3).Text = "" Then

            okno(1, 3).Text = "0"

        ElseIf p = 3 And okno(2, 1).Text = "" Then

            okno(2, 1).Text = "0"

        ElseIf p = 4 And okno(2, 2).Text = "" Then

            okno(2, 2).Text = "0"

        ElseIf p = 5 And okno(2, 3).Text = "" Then

            okno(2, 3).Text = "0"

        ElseIf p = 6 And okno(3, 1).Text = "" Then

            okno(3, 1).Text = "0"

        ElseIf p = 7 And okno(3, 2).Text = "" Then

            okno(3, 2).Text = "0"

        ElseIf p = 8 And okno(3, 3).Text = "" Then

            okno(3, 3).Text = "0"

        Else

            comp_hod1()                                                                                                     

    End Sub

 

Пояснение:   первая строкаIfhod = 5 ThenExitSub  означает что когда человек совершает пятый ход то пустых ячеек уже не остается и процедура прекращает свою работу иначе возникнет конфликт в коде

Три следующих строки для генерирования случайного числа от 0 до 8 в сумме 9. То есть для каждой цифры соответствует одна ячейка.

Вот пример:

   If p = 0 And okno(1, 1).Text = "" Then

   okno(1, 1).Text = "0"

 

если же P=0 и ячейка okno(1, 1) пуста то компьютер вставляет “0” в этой самой ячейке

иначе процедура возврашеться к началу.

       

   Else

        comp_hod1()                                                                                                      

 

 

 И так до тех пор пока не наткнется на число соответствующий пустой ячейке.

 

А теперь создадим процедуру  нажатия на ячейки. В ней собственно и будет все происходить

 

Sub OknoClick(ByVal OKNO As Object, ByVal E As EventArgs)

        If OKNO.text = "" Then

            OKNO.text = "x"

            hod = hod + 1

            comp_hod1()

        End If

End Sub

 

Вторая строка текста условие для того чтоб вы не могли кликать на ячейку уже занятую либо “X” либо “0”. Третья строка ставит “X” на пустую ячейку. Четвертая строка счетчик ходов. Пятая строка, срабатывает та самая процедура о которой мы говорили выше.

 

Вот код целиком

Public Class Form1

    Dim okno(3, 3) As Label

    Dim hod As Short = 0

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

 

        For i = 1 To 3

            For j = 1 To 3

                okno(i, j) = New Label

                Me.Controls.Add(okno(i, j))

                With okno(i, j)

                    .TextAlign = ContentAlignment.MiddleCenter

                    .BorderStyle = BorderStyle.FixedSingle

                    .Width = 100

                    .Height = 100

                    .Left = (100 * i) - 100

                    .Top = (100 * j) - 100

                    .Text = ""

                    .Font = New Font("arial", 42)

                    .ForeColor = Color.GreenYellow

                    .BackColor = Color.Navy

                    AddHandler okno(i, j).Click, AddressOf OknoClick

                End With

            Next

        Next

    End Sub

        

    Sub comp_hod1()

        If hod = 5 Then Exit Sub         

        Dim p As Short

        Randomize()

        p = 8 * Rnd()

        If p = 0 And okno(1, 1).Text = "" Then

            okno(1, 1).Text = "0"

        ElseIf p = 1 And okno(1, 2).Text = "" Then

            okno(1, 2).Text = "0"

        ElseIf p = 2 And okno(1, 3).Text = "" Then

            okno(1, 3).Text = "0"

        ElseIf p = 3 And okno(2, 1).Text = "" Then

            okno(2, 1).Text = "0"

        ElseIf p = 4 And okno(2, 2).Text = "" Then

            okno(2, 2).Text = "0"

        ElseIf p = 5 And okno(2, 3).Text = "" Then

            okno(2, 3).Text = "0"

        ElseIf p = 6 And okno(3, 1).Text = "" Then

            okno(3, 1).Text = "0"

        ElseIf p = 7 And okno(3, 2).Text = "" Then

            okno(3, 2).Text = "0"

        ElseIf p = 8 And okno(3, 3).Text = "" Then

            okno(3, 3).Text = "0"

        Else

            comp_hod1()

        End If

 

    End Sub

        Sub OknoClick(ByVal OKNO As Object, ByVal E As EventArgs)

        If OKNO.text = "" Then

            OKNO.text = "x"

            hod = hod + 1

            comp_hod1()

        End If

    End Sub

End Class

 

Казалось бы, что игра сделана, однако в данном случаи игра лишена всякого интереса так как компьютер делает ходы в произвольном порядке, при этом абсолютно не стремиться помешать выиграть человеку и не стремиться выиграть самому. А как сделать так, что бы компьютер пожелал выиграть  и мешал бы выиграть нам? Это я покажу в следуйшей статье.


Есть вопросы? Спроси на нашем форуме!!
Progers300 [30.08.2013 11:07]

Покопайся в коде Emacs, может там что нибудь найдеш, так как там тоже эта игра есть, но я думаю она на Lisp написана.

Abdurahim190 [30.08.2013 11:54]

Да я уже ее полностью завершил. Я прсто решил уроки поделить на две части чтоб легко было понять. Шас выложу исходник завершеной игры.

Abdurahim190 [30.08.2013 15:03]

Да и к тому же в коде Lisp я едва ли че пойму



Оставлять комментарии можно только зарегистрированным




Предупреждение: Вся информация представлена исключительно в образовательных целях.
Ни авторы, ни администрация не несут ответственности в случае ее использования в противозаконных целях.