помогите

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

помогите

Сообщение dorido » 13.04.2005 (Ср) 6:33

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

Джеффи
Бывалый
Бывалый
 
Сообщения: 256
Зарегистрирован: 06.03.2005 (Вс) 0:26

Сообщение Джеффи » 13.04.2005 (Ср) 11:20

А чем тебе лайнс98 не нравятся, если ты пишешь игру, её уже написали не мучай себя=)

Шурик
Самогонщик
Самогонщик
Аватара пользователя
 
Сообщения: 1657
Зарегистрирован: 30.06.2003 (Пн) 13:27
Откуда: из запоя :))))) Матных сообщений: 972

Сообщение Шурик » 13.04.2005 (Ср) 12:37

в общих чертах:

1. заганяй все в поле в массив (создай его) и "рисуй" в массиве ну а потом на экран то есть значения массива:
-------------------------------------
по идее оно выгледеть должно примерно так:
1 1 2 3 1 1 1 2 3 2
1 1 2 3 1 1 1 2 3 1
1 1 2 3 1 2 1 2 2 2
2 1 2 3 1 1 1 2 3 2
1 1 2 3 1 3 1 2 3 2
2 1 2 3 2 1 1 2 3 1
1 3 2 3 1 1 1 1 3 2
3 1 2 3 1 1 1 2 3 2
1 1 2 3 1 1 1 2 3 1
1 1 2 3 1 1 1 2 3 2
----------------------------------------
Код: Выделить всё
option base 1
dim pole(10,10)
for i=1 to 10
for k=1 to 10
x=int(rnd*3)+1
pole(k,i)=x
next k
next i

1 - синий
2 - красный
3 - зеленый
4 - желтый
2. сделай общую обработку поля, а вней обработку по направлениям:
------------ по горизонтали + вперед
------------ по горизонтали + назад
------------ по вертикали + вперед
------------ по вертикали + назад
если надо по диагонали, то:
------------ (по вертикали + по горизонтали) + вперед
------------ (по вертикали + по горизонтали) + назад
------------ (по вертикали + вперед) + (по горизонтали + назад)
------------ (по вертикали + назад) + (по горизонтали + вперед)
3. если условие срабатывает, то значения массива (пока проверка) меняй на 4

вроде так, вроде понятно накалякал :)

dorido
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 107
Зарегистрирован: 27.02.2005 (Вс) 17:10
Откуда: Angarsk

Сообщение dorido » 13.04.2005 (Ср) 14:09

Я не пишу лайнс,
А такую проверку я делал рекурсией, но уме вылезает то overflow то чёто со стеком(переполнение)
Поэтому, кто-нибудь напишите код, который бы работал

Faust
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 649
Зарегистрирован: 29.12.2003 (Пн) 13:38
Откуда: лаборатория

Сообщение Faust » 13.04.2005 (Ср) 15:41

Должно сработать...
Код: Выделить всё

private Declare Sub ZeroMemory Lib "kernel32.dll" Alias "RtlZeroMemory" (Destination As Any, ByVal Length As Long)
'a() - само поле, значения 1..4
't() - маска заливки 1 - если клетка вошла в область, 0 - если (ещё) не вошла
'b() - массив для хранения текущего и будущего фронтов, ячейки b(0) и b(11) хранят количество клеток в фронте
Dim a(0 to 99) as byte,t(0 to 99) as byte, i as byte, j as byte, k as byte
Dim b(0 to 21) as byte, bi as byte, bc as byte, gc as byte, c as byte
For i=0 to 99
a(i)=CByte(rnd*3+1)
Next i
For i=0 to 99
c=a(i) ' цвет i-ой клетки
If c<4 then
off=0
offn=11
b(0)=1
b(1)=i
gc=1 'количество клеток в области
'вначале фронт состоит из одной клетки
Do
bc=0 'количество клеток в новом фронте
ZeroMemory t(0), 100
For j=1 to b(off)
  t(b(off+j))=1
Next j
For j=1 to b(off)
k=b(off+j)
'проверка клетки сверху
If k>9 then
  If a(k-10)=c then
    If t=0 then
      bc=bc+1
      b(offn+bc)=k-10
    end if
  end if
end if
'проверка клетки снизу
If k<90 then
  If a(k+10)=c then
    If t=0 then
      bc=bc+1
      b(offn+bc)=k+10
    end if
  end if
end if
'проверка клетки слева
If (k mod 10)>0 then
  If a(k-1)=c then
    If t=0 then
      bc=bc+1
      b(offn+bc)=k-1
    end if
  end if
end if
'проверка клетки справа
If (k mod 10)<9 then
  If a(k+1)=c then
    If t=0 then
      bc=bc+1
      b(offn+bc)=k+1
    end if
  end if
end if
gc=gc+bc
'новый фронт заменяет старый
b(offn)=bc
off=11-off
offn=11-offn
Loop Until b(off)=0 'если в новом фронте нет клеток, то прекращаем работу
'если в области больше 2-х клеток, закрашиваем.
If gc>2 then
For j=0 to 99
If t(j) then a(j)=4
next j
end if
next i
Листинги не горят!


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

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

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

    TopList