Крестики - Нолики (опять)

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Winitar
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 224
Зарегистрирован: 06.07.2006 (Чт) 20:45
Откуда: Астана

Крестики - Нолики (опять)

Сообщение Winitar » 06.08.2007 (Пн) 20:32

Я решил сделать игру крестики - нолики, думал все так просто, но нет, оказалось сложновато, прошу дать пару советов.....
Я как то уже выкладывл такую статью, и получил неплохой совет использовать массивы и прогресс пошёл! Но теперь опять притормозил. Я выложил исходник с комментариями. Прошу дать несколько советов.
Вложения
Крестики Нолики.rar
Крестики - Нолики
(2.55 Кб) Скачиваний: 165

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 06.08.2007 (Пн) 21:52

1) Ставлю крестик - компьютер ставит нолик. Жму на этом нолике - он превращается в крестик. Великолепно...

2) Отступы в коде делаются с помощью клавишы Tab (можно выделить сразу несколько строк и нажать Tab, чтобы увеличить отступ).

Код: Выделить всё
x = 0
st = 0
  For i = 0 To 2
    For i1 = 0 To 2
      rd(i1, i) = x
      x = x + 1
    Next
  Next


Сам цикл For не требует оступа. Отступ должен быть у "содержимого" цикла. Поэтому строку For i = 0 To 2 надо писать на том же уровне, что и st = 0.

Код процедуры тоже должен иметь отступ. Т.е.
Код: Выделить всё
Sub a
      ' отступ
      ' отступ
End sub


3)

Код: Выделить всё
30  hd1 = Int((2 - 0 + 1) * Rnd + 0) ' случайные координаты от 0 до 2 (по формуле Int((MaxVal - MinVal + 1) * Rnd + MinVal)
     hd2 = Int((2 - 0 + 0) * Rnd + 0)

        If Kn(rd(hd1, hd2)).Caption = "." Then ' если нет крестика, то ставим нолик
           Kn(rd(hd1, hd2)).Caption = "0"
        Else
        GoTo 30
        End If


goto 30... Фу... Циклы рулят.

4) Int((2 - 0 + 1) * Rnd + 0)

Что это ещё? (и почему тебе не пришла идея расписать двойку как 1+1-1-30+60-30+1 ?

5) Ещё раз,
Dim x As Integer, i1 As Integer, i As Integer

x = 0
st = 0
For i = 0 To 2
For i1 = 0 To 2
rd(i1, i) = x
x = x + 1
Next
Next


    а) x = 0. Ты думаешь, там будет что-то другое? (VB то всё равно твои лишнии строки уберёт).
    б) Убожество. Держать двухмерный массив, забивать в него числа, чтобы таким образом преобразовывать пару i:j к i+j*3+1
    в) Если переменная i уже используется в выше-стоящем цикле, обычно используют j (а не i1), а потом k (а не i2).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Winitar
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 224
Зарегистрирован: 06.07.2006 (Чт) 20:45
Откуда: Астана

Сообщение Winitar » 07.08.2007 (Вт) 17:34

Хакер, спасибо, конечно за комментарий кода. Но я имел в виду советы о дальнейшем написании программы... И вообще об этих всех правилах я только из книжек знаю, т.к. в школе у нас информатику не преподавали(учителя нормального не было), поэтому программирование я изучаю сам, с помощью одних только книг! Так что твоя критика...

Я бы хотел получить несколько советов о дальнейших шагах(первые два вроде и так работают).

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 07.08.2007 (Вт) 17:44

И вообще об этих всех правилах я только из книжек знаю, т.к. в школе у нас информатику не преподавали(учителя нормального не было), поэтому программирование я изучаю сам, с помощью одних только книг! Так что твоя критика...


Я тоже изучал программированию сам, и без школы, и без книг, прикинь, да?

Так что моя критика...

Я бы хотел получить несколько советов о дальнейших шагах(первые два вроде и так работают).

Логика работы приложения не верна. Делить весь процесс игры на шаги и писать код для каждого - не есть гуд. Должен быть единый код для анализа ситуации, принимающий решение об оптимальном "поступке".

ADDED:
И ещё.
По поводу "моей критики". Критика - слишком громкое слово для написанного мной.

Это не критика.
Я это пишу не для того чтобы сказать, - смотрите! этот балбес Winitar нифига не умеет! Ха-ха!

Я пишу для того, чтобы ты посмотрел и подчерпнул что-то для себя. И в следующий раз не допустил этих же ошибок.

Раз уж ты ощущаешь пробел в знаниях, вызванный отсутствием хорошего учителя информатики в школе, пусть это сообщение его (пробел) заполнит ну хоть частично.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 07.08.2007 (Вт) 22:43

У нас информатику преподавали нормально, но я не припомню чтобы нас учили нормальному программированию... Если не считать языка Интал и то писали такие "программы", что о выравнивании кода и т. п. не могло быть и речи... :)

По сабжу:
Хакер прав, тебе надо сделать одну процедуру обработки ситуации и нахождения верного хода. Вот примерно что надо делать (хотя может я ошибаюсь):
1) Определяем не победил ли пользователь
2) Далее пробуем подставлять на свободные места знак, которым играет юзер (например крестик) и проверяем выйгрышность ситуации, если ситуация выйгрышная, то ставим туда свой знак (например нолик)
3) Если юзер не выйграл и нам ничего не угражает, то выбираем место. При этом, я думаю, нужно в первую очередь выбирать центральную клетку (если она свободна), потом угловые клетки, а потом уже остальные..[/list]
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

Winitar
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 224
Зарегистрирован: 06.07.2006 (Чт) 20:45
Откуда: Астана

Сообщение Winitar » 08.08.2007 (Ср) 7:52

Хакер, ну ладно, убедил! Спасибо.

burik писал(а):...тебе надо сделать одну процедуру обработки ситуации и нахождения верного хода. Вот примерно что надо делать (хотя может я ошибаюсь):
1) Определяем не победил ли пользователь
2)...[/list]


Я опять представляю это как попало... Например вот что приходит мне в голову - если, например юзер выиграл по диагонали,то такой код, по моему, слишком длинный:

Код: Выделить всё
if kn(2)="X" and kn(4)="X" and kn(6)="X" then
MsgBox "Вы победили!"


Я и сам считаю, что это ерунда, т.к. победных расположений может быть много...
Каким ещё способом можно это сделать?


:idea: А на счёт шагов: разве нельзя начать анализ с третьего шага, ведь неважно как будет ходить Комп в первые два хода?

AntonGV
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 24.05.2006 (Ср) 12:10
Откуда: г. Пермь

Сообщение AntonGV » 08.08.2007 (Ср) 9:55

http://algolist.ru/games/fiveinarow.php алгоритм оценочной функции для игры крестики-нолики
Если долго мучиться, что-нибудь получится

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.08.2007 (Ср) 10:10

Когда однажды на ACM-контесте нужно было запрограммировать крестики-нолики 3x3, то я, не мудрствуя лукаво, на бумажке расписал все возможные ходы (их всего-то ничего), и написал всю программу одним большим и развесистым If-ом.

Пусть не масштабируемо, зато гарантированно безбажно.
Изображение

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 08.08.2007 (Ср) 10:18

Winitar писал(а):А на счёт шагов: разве нельзя начать анализ с третьего шага, ведь неважно как будет ходить Комп в первые два хода?


Если первый ходит юзер, то он сделает 3 хода а комп - 2 и третий ход компа вероятно будет уже не нужен.. :)

Ну а если первым ходит прога, тогда первые два хода - центр и какой-нить угол.
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

Winitar
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 224
Зарегистрирован: 06.07.2006 (Чт) 20:45
Откуда: Астана

Сообщение Winitar » 08.08.2007 (Ср) 19:25

burik писал(а):
Winitar писал(а):А на счёт шагов: разве нельзя начать анализ с третьего шага, ведь неважно как будет ходить Комп в первые два хода?


Если первый ходит юзер, то он сделает 3 хода а комп - 2 и третий ход компа вероятно будет уже не нужен.. :)

Ну а если первым ходит прога, тогда первые два хода - центр и какой-нить угол.


:idea: Я имею в виду начать анализ на третьем шагу, до того, как кто нибудь походит.
Последний раз редактировалось Winitar 08.08.2007 (Ср) 19:27, всего редактировалось 1 раз.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 08.08.2007 (Ср) 19:27

Я бы всё же написал универсальный для определение "как надо сходить".

Я вообще сторонник универсализма во всём :)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Winitar
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 224
Зарегистрирован: 06.07.2006 (Чт) 20:45
Откуда: Астана

Сообщение Winitar » 08.08.2007 (Ср) 19:31

Хакер писал(а):Я бы всё же написал универсальный для определение "как надо сходить".


Можно и так, но зачем менять то что уже начато? Ведь так тоже можно...

:)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 08.08.2007 (Ср) 19:33

где то на RSDN была статья "Ваш код отстой, если ...". Очень хорошая статься, мне понравилось.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Winitar
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 224
Зарегистрирован: 06.07.2006 (Чт) 20:45
Откуда: Астана

Сообщение Winitar » 08.08.2007 (Ср) 19:45

где то на RSDN была статья "Ваш код отстой, если ...". Очень хорошая статься, мне понравилось.

Хм... Интересно было бы почитать...

Pasha47
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 22.07.2007 (Вс) 18:29

Сообщение Pasha47 » 08.08.2007 (Ср) 20:49

Про отстойные коды я тоже читал...
:roll:

http://www.rsdn.ru/article/philosophy/w ... .xml?print

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 08.08.2007 (Ср) 22:35

Вот набросал по-быстрому. Winitar, думаю тебе нечто подобное нужно. Хотя, конечно там недочеты есть, но это ты и сам доделаешь.. :)
Вложения
КН.RAR
Крестики-Нолики
(2.05 Кб) Скачиваний: 160
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Majestic-12 [Bot], Yandex-бот и гости: 15

    TopList