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

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

 
 

Привет всем на прошлом уроке мы создали внешнюю оболочку игры крестики-нолики небольшим кодом. Теперь же нам предстоит сделать игру более умную. У каждой компьютерной игры должно быть два стремления: Не дать выиграть сопернику (данном случаи человеку) и стремиться выиграть самому. Начнем по порядку

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

х

 

 

0

 

 

х

 

 

х

 

 

х

 

 

0

 

 

х

 

 

 

0

 

 

 

х

х

 

 

 

х

 

 

 

0

 

 

 

х

х

0

 

 

 

 

 

 

х

0

х

 

 

 

 

 

 

 

 

 

х

0

х

 

 

 

 

 

 

0

х

х

 

И.т.д

 

Пишем алгоритм:

Sub comp_hod2()

If okno(1, 1).Text = "x" And okno(1, 2).Text = "x" And okno(1, 3).Text = "" Then

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Else

comp_hod1() 'если не одно из вышестоящих условий компьютер не обнаруживает то переходит к первой процедуре

End If

End Sub

 

Теперьпоясним:

 

If okno(1, 1).Text = "x" And okno(1, 2).Text = "x" And okno(1, 3).Text = "" Then

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

Если в ячейке okno(1, 1) и в ячейке okno(1, 2) записан X, а ячейка okno(1, 3) пуста, то в ячейку okno(1, 3) записать “0”

х

 

 

х

 

 

0

 

 

Если же этого условия программа не обнаруживает то переходит к следуйшей строке условий. Если же не одно из условий программа не обнаруживает то переходит к первой процедуре comp_hod1() и ставит “0” в любом пустом месте. А работу процедуры comp_hod1() мы видели на прошлом уроке http://vbbook.ru/igra-krestiki-noliki--chast1/

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

0

 

 

0

 

 

0

 

 

0

 

 

0

 

 

0

 

 

0

 

 

 

0

 

 

 

0

0

 

 

 

0

 

 

 

0

 

 

 

0

0

0

 

 

 

 

 

 

0

0

0

 

 

 

 

 

 

 

 

 

0

0

0

 

 

 

 

 

 

0

0

0

 

И.т.д

Фактически аналогично с второй процедурой с единственной разницей на месте двух X тут два “0”. Следовательно, и алгоритм игры будет почти такой же

Sub comp_hod3()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Else

comp_hod2() 'если не обнаруживает не одного выше стоящего сочетания то переходит к второй процедуре

End If

End Sub

 

Тут все точно так же программа проверяет строчку за строкой. Однако обратите внимание не обнаружив ни одно из условий программа переходит не к первой а к второй процедуре comp_hod2() Вы наверно заметили что процедуры одна в другой как матрешки так оно и есть. На первом месте стоит “попытка выиграть” на втором “помешать выиграть сопернику” и на третьем месте “произвольный ход из первой процедуры”. К примеру если же ход за компьютером и перед компьютером будет выбор выиграть самому или помешать выиграть человеку то программа выберет первое. Стремление победить должно быть приоритетным и на место comp_hod1() в процедуре OknoClickдолжна стоять comp_hod3(). Вот так:

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

If OKNO.text = "" Then

OKNO.text = "x"

hod = hod + 1

comp_hod3()

End If

End Sub

 

Ну вот теперь можно сказать что игра завершена. Так же можно в игру добавить процедуру определяющую кто выиграл кто проиграл, здесь я эту процедуру приводить не стал так как к логике игры она отношения особого не имеет но вы можете ее просмотреть в исходнике к полной версии игры. Вот здесь http://vbbook.ru/1378185324/


Есть вопросы? Спроси на нашем форуме!!
Нет комментариев

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




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