Генерилка судоку

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Volkova
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 10.12.2007 (Пн) 13:03

Генерилка судоку

Сообщение Volkova » 16.12.2007 (Вс) 1:26

Есть 9 текстовых полей. В каждое случайно вписывается число от 1 до 9. Как сделать, чтобы числа не повторялись? Обьясняйтд пожалуйста с примерами кода.

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 16.12.2007 (Вс) 3:03

Можно сделать массив из 9 элементов и при генерации каждого нового значения в цикле проверять на равенство другим элементам...
И дублировать посты совсем не обязательно...
Подпись проходит рефакторинг

Volkova
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 10.12.2007 (Пн) 13:03

Сообщение Volkova » 16.12.2007 (Вс) 13:05

Я не специально 2 темы создала. Даж не знаю как у мдня так вышло)). Я новичок в программировании. Массив то я создала, а как элементы на равенство проверять не знаю, в мануалах найти не могу(( напишите пожалуйста код с каммемтами или хоть на пальцах обьясните. Ссылки а особенно на исходники не предлагать. Я с мобилки сижу(

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Сообщение Invader » 16.12.2007 (Вс) 14:16

для сравнения можно использовать операторы IF
if s1 =s2 or s1=s3 ... or s1=s9 then 'далее объявляем пользователю
что значение s1 уже занято и предлогаем вести новое значение ...
с таким уровнем вопроса а тем более ответа, рекомендую найти время, зайти в интернет www.google.ru , найти книгу по vb написать десяток простеньких програм закрепив материал...

а также настоятельно рекомендую прочесть тему: "Если у вас сессия или домашнее задание" в данном форуме
умён и жаден,
характер отсуствует

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Сообщение Debugger » 16.12.2007 (Вс) 17:32

Советую поучиться на более простых примерах. Например, хотяб Hello World сделать
Код: Выделить всё
Sub Main()
    Randomize
    Dim a(9) As Byte
    Dim c As Integer
    Dim c2 As Integer
    Dim b As Boolean
    For c = 0 To 9
        b = False
        Do While b = False
            b = True
            a(c) = Rnd() * 9
            For c2 = 0 To c - 1
                If a(c) = a(c2) Then b = False
            Next
        Loop
    Next
   
    Dim s As String
    For c = 0 To 9
        s = s & " " & a(c)
    Next
    MsgBox s
End Sub

Код тормозющий, но зато рабочий.

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Сообщение Invader » 16.12.2007 (Вс) 21:30

Debugger молодца расписал, скоро форум перейдёт в платный,
а там глядишь будем отвечать на вопросы типа :"что такое rnd, а возможно, где искать клавишу ESC :("


модераторы АУ!!! тема сообщения о чём то говарит?????
умён и жаден,
характер отсуствует

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Сообщение Debugger » 16.12.2007 (Вс) 22:22

Да, с этим надо бороться. Сделать "Форум для начинающих", или написать (разжувать) подробно, что как делать.

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 16.12.2007 (Вс) 22:37

Была уже когда-то попытка сделать такое. Ничем хорошим не обернулась...
Может быть кто-нить ещё помнит предупреждение о 120 постингах и раздел для профессионалов?
Подпись проходит рефакторинг

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

Сообщение Хакер » 16.12.2007 (Вс) 22:49

Раздел для профессионалов помнят все, он существует до сих пор. Правило 23315 тоже многие помнят.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Volkova
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 10.12.2007 (Пн) 13:03

Сообщение Volkova » 17.12.2007 (Пн) 2:26

Вижу меня ни разу не поняли( пополню траффик выложу свои жалкие попытки. Кстати это не домашнее задание; проги типа хелло ворд я уже проехала. Развиваться хочеца вот и ставлю сложные задачи. Это лишь маленький кусочек проги, просто я запуталась, знаний нд хватает а в мануалах найти нд могу

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Сообщение Proxy » 17.12.2007 (Пн) 6:17

Поищи исходники СУДОКУ и СУМДОКУ в сети. Я встречал исходники на Delphi, но общее представление об алгаритме генерации поля (что скажу я не так уж и просто), Проверка совпадений в столбце, строке и сегменте, вполне можно получить.
PS. Начни с чего-нибудь по проще. И старайся лучше сделать что-нибудь оригинальное, чем просто передрать чужие исходники или кирпичи.

Volkova
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 10.12.2007 (Пн) 13:03

Сообщение Volkova » 17.12.2007 (Пн) 11:34

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

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.12.2007 (Пн) 11:43

Volkova, покажи фрагмент, на котором застряла и что пыталась сделать.
Lasciate ogni speranza, voi ch'entrate.

Volkova
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 10.12.2007 (Пн) 13:03

Сообщение Volkova » 17.12.2007 (Пн) 13:06

Создается массив на 8 элементов. На формд 81 текстовое поле, 9 переменных от а1 до а9 на каждый квадрат(3х3) каждому текст полю присваевается по переменной. Каждая переменная равна случайному элементу массива. Mаss(0)=1 ... Mаss(8)=9. Я нд могу понять как сделать, когда каждая переменная становится равной элементу масива, чтоб каждаю пер. Равнялась тока 1 элементу то есть чтоб в квадрате числа нд повторялось

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.12.2007 (Пн) 13:12

Присваивай значения не непосредственно.
Для каждого квадрата создавай массив из возможных чисел.
Затем выбирай из этого массива 9 случайных элементов.
Чтобы числа никогда не повторялись, после того, как элемент будет выбран, удаляй его из массива (сдвигай остаток массива вниз и делай ReDim Preserve).
После того, как один квадрат будет заполнен числами, повтори процедуру для другого квадрата (снова создавай массив из возможных чисел и т.д.).
Lasciate ogni speranza, voi ch'entrate.

Volkova
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 10.12.2007 (Пн) 13:03

Сообщение Volkova » 17.12.2007 (Пн) 14:23

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

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 17.12.2007 (Пн) 14:45

Код: Выделить всё
Dim mas()

Sub DeleteIndex(Index as Long)
Dim x as Long
    For x=Index to UBound(mas) - 1
        mas(x) = mas(x+1)
    Next
    Redim Preserve mas(x)
End Sub
Если размер элемента массива постоянен, то можно и побыстрее...
Код: Выделить всё
CopyMemory mas(Index), mas(Index+1), len(mas(0)) * (UBound(mas) - Index)
Redim Preserve mas(UBound(mas) - 1)
Обожаю CopyMemory 8)
Лучший способ понять что-то самому — объяснить это другому.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 17.12.2007 (Пн) 14:52

Товарищи, а зачем массив то ? :shock: :shock: :shock:
Не зря же коллекции придумали ? Из них же удобнее удаять элементы вроде ? :shock:

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.12.2007 (Пн) 15:09

Коллекции не работают со скалярными типами.
Lasciate ogni speranza, voi ch'entrate.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 17.12.2007 (Пн) 15:09

ALX_2002 писал(а):Товарищи, а зачем массив то ? :shock: :shock: :shock:
Не зря же коллекции придумали ? Из них же удобнее удаять элементы вроде ? :shock:

В данном случае массив пошустрее и попроще будет.
З.Ы. Насчет удаления элементов из массива на www.vbstreets.ru хорошая статья ANDLL есть.
Весь мир матрица, а мы в нем потоки байтов!

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 17.12.2007 (Пн) 16:41

2 alibek: Виноват, но на счёт скалярных типов не понял. Как они тут используются ? :oops: Вроде же нужно числа от 1 до 9 хранить ?

2 Viper: А сравним ли выйгрыш в скорости с выйгрышем в удостве программирования и простоте кода в этом случае ?

Мне кажется автору топика лучше код по проще :)

P.S Могу быть не прав. Всем людям свойственно ошибаться. :roll:

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.12.2007 (Пн) 16:43

Это значит, что ты не можешь добавлять в коллекцию число или строку. Надо добавлять Variant.
Lasciate ogni speranza, voi ch'entrate.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 17.12.2007 (Пн) 18:20

alibek писал(а):Это значит, что ты не можешь добавлять в коллекцию число или строку. Надо добавлять Variant.


Виноват. Прошу разъяснения :)

Код: Выделить всё

Dim NewCollection As New Collection
Private Sub Form_Load()
    NewCollection.Add 1, "1"
    NewCollection.Add 2, "2"
    NewCollection.Add 3, "3"
    NewCollection.Add 4, "4"
    NewCollection.Add 5, "5"
    MsgBox NewCollection(5)
End Sub


Добавляю в коллекцию числовые значения с текстовыми ключиками.
Что должно мешать ? :roll:

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.12.2007 (Пн) 18:21

Попробуй сделать

Dim V As Long
colValues.Add V

или

Dim V As Long
V = colValues.Item(2)
Lasciate ogni speranza, voi ch'entrate.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 17.12.2007 (Пн) 18:24

Код: Выделить всё
Dim NewCollection As New Collection

Private Sub Form_Load()
   
    Dim V As Long
   
    For V = 1 To 100
        NewCollection.Add V, CStr(V)
    Next

    MsgBox NewCollection(5)
End Sub


Я явно чего то не фтыкаю. :oops: Сделал V as long и напихал сотню значений в коллекцию. Не так делаю ? :oops:

(Добавлено)

Проверил - Даж без указания Key тож работает :)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.12.2007 (Пн) 18:38

Хм... Ну тогда попробуй For Each использовать.
Lasciate ogni speranza, voi ch'entrate.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 17.12.2007 (Пн) 18:54

alibek писал(а):Хм... Ну тогда попробуй For Each использовать.


Код: Выделить всё


Dim NewCollection As New Collection

Private Sub Form_Load()
   
    Dim V As Long
   
    For V = 1 To 3
        NewCollection.Add V
    Next
   
    For Each Element In NewCollection
        MsgBox Element
    Next
End Sub



Предполагаю, что рекомендацию понял не совсем верно ? :roll:

Но так - работает.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 17.12.2007 (Пн) 19:52

Добавлять в коллекцию можно любой тип кроме своего, а для for each только variant.
Лучший способ понять что-то самому — объяснить это другому.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 17.12.2007 (Пн) 20:21

А если их в Class модуль запихать ? :)

Чего то я так и не понял - чем коллекция неудобна. Гениальное изобретение программистов. А уж Scripting.Dictionary вообще мегаудобен помоему :)

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 17.12.2007 (Пн) 22:57

А на счёт генерации неповторяющихся элементов. Вот что пришло в голову по предложению alibek-а. :idea: :roll: Постарался с подробными "каментами".

Код: Выделить всё

Private Sub Form_Activate()
    '/// Создаём новую коллекцию
    Dim MyCollection As New Collection
 
    '/// Заполняем коллекцию от 1 до 9
    For N = 1 To 9
        MyCollection.Add N
    Next
   
    '/// По желанию можно добавить и произвольные текстовые значения
    'MyCollection.Add "A"
    'MyCollection.Add "B"
    'MyCollection.Add "C"
    'MyCollection.Add "Что захочется"
   
    '/// Запускаем цикл генерации
    Do
        '/// Инициализирует датчик случайных чисел.
        Randomize
        '/// Получаем номер произвольного элемента. Значение должно быть от 1 до размера массива-1. Т.к коллекция начинается с первого элемента
        RandomElement = CLng(Rnd * (MyCollection.Count - 1)) + 1
        '/// Выводи значение произвольного элемента коллекции
        Print MyCollection(RandomElement)
        '/// Удаляем его из коллекции. Удаление элемента приводит к смещению индексации коллекции.
        '/// Например при удалении третьего элемента, четвёртый становится третьим, а пятый четвёртым и т.п
        MyCollection.Remove RandomElement
        '/// Прокручиваем цикл до тех пор, пока в коллекции не останется элементов
    Loop Until MyCollection.Count <= 0
End Sub

След.

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

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

Сейчас этот форум просматривают: Google-бот и гости: 21

    TopList