forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=13)
-   -   Массивы (http://forum.boolean.name/showthread.php?t=7860)

HolyDel 27.02.2009 18:41

Ответ: Массивы
 
вот смотри...
ты меняеш ячейку 1 и 2. координаты i1,j1 у первой и i2,j2 у второй.
тогда эти ячейки рядом если abs(i1-i2)<2 and abs(j1-j2)<2

Petrofan 27.02.2009 20:23

Ответ: Массивы
 
Твоя формула у меня звучит так
c=map(sx,sy)
map(sx,sy)=map(sx1,sy1)
map(sx1,sy1) = c
как к ней прикрепить запрет?

HolyDel 27.02.2009 20:36

Ответ: Массивы
 
уууу!!!
Код:

if abs(sx-sx1)<2 and abs(sy-sy1)<2
  c=map(sx,sy)
  map(sx,sy)=map(sx1,sy1)
  map(sx1,sy1) = c
endif

причем ячейки по диагонали тож являются соседними.

Petrofan 27.02.2009 20:37

Ответ: Массивы
 
Вот для наглядности забабахал код без ресурсов
Код:

Graphics 800,600,32,0
SetBuffer BackBuffer()
SeedRnd MilliSecs()

Dim Map_Grid(8,8)
For I=0 To 8
For J=0 To 8
Map_Grid(I,J)=Rnd(1,2)
Next
Next


While KeyDown(1)=0
Cls
For j=0 To 7
For i=0 To 7
    If Map_Grid(i,j)=1 Then Color 0,200,200
    If Map_Grid(i,j)=2 Then Color 200,200,0
    Rect 317+i*48,113+j*48,46,46
Next
Next


For j=0 To 7
For i=0 To 7
Color 0,0,0
        If Map_Grid(i,j)>0                               
        If i=sx1 And j=sy1 And selectst=1
        Rect 317+i*48,113+j*48,46,46
        EndIf
        EndIf       
Next
Next


sx=(MouseX()-318)/48
sy=(MouseY()-113)/48
        If sx>7 Then sx=7
        If sx<0 Then sx=0
        If sy>7 Then sy=0
        If sy<0 Then sy=7
       
       
       
If MouseHit(1)
FlushMouse()
If selectst=1
       
       
c=Map_Grid(sx,sy)
Map_Grid(sx,sy)=Map_Grid(sx1,sy1)
Map_Grid(sx1,sy1) = c       



selectst=2                       
EndIf       
        If selectst=0
                        sx1=sx
                        sy1=sy
                        selectst=1
        EndIf
                If selectst=2 Then selectst=0
       
EndIf
Flip 1
Wend
End


Petrofan 27.02.2009 20:46

Ответ: Массивы
 
Получаться что здесь перемещать можно вокруг стоящих, а надо вверх вниз влево вправо

HolyDel 27.02.2009 20:51

Ответ: Массивы
 
Код:

Graphics 800,600,32,2
SetBuffer BackBuffer()
SeedRnd MilliSecs()

Dim Map_Grid(8,8)
For I=0 To 8
For J=0 To 8
Map_Grid(I,J)=Rand(1,5)
Next
Next


While KeyDown(1)=0
Cls
For j=0 To 7
For i=0 To 7
    If Map_Grid(i,j)=1 Then Color 0,200,200
    If Map_Grid(i,j)=2 Then Color 200,200,0
    If Map_Grid(i,j)=3 Then Color 200,0,0
    If Map_Grid(i,j)=4 Then Color 0,200,0
    If Map_Grid(i,j)=5 Then Color 0,0,200
   
    Rect 317+i*48,113+j*48,46,46
Next
Next


For j=0 To 7
For i=0 To 7
Color 0,0,0
        If Map_Grid(i,j)>0                               
        If i=sx1 And j=sy1 And selectst=1
        Rect 317+i*48,113+j*48,46,46
        EndIf
        EndIf       
Next
Next


sx=(MouseX()-318)/48
sy=(MouseY()-113)/48
        If sx>7 Then sx=7
        If sx<0 Then sx=0
        If sy>7 Then sy=0
        If sy<0 Then sy=7
       
       
       
If MouseHit(1)
FlushMouse()
If selectst=1
       
byside = 1

If Abs(sx-sx1)<2 And Abs(sy-sy1)<2
If (byside) And (Abs(sx-sx1)<>Abs(sy-sy1)) ;by side
c=Map_Grid(sx,sy)
Map_Grid(sx,sy)=Map_Grid(sx1,sy1)
Map_Grid(sx1,sy1) = c       
EndIf
EndIf


selectst=2                       
EndIf       
        If selectst=0
                        sx1=sx
                        sy1=sy
                        selectst=1
        EndIf
                If selectst=2 Then selectst=0
       
EndIf
Flip 1
Wend
End


Taugeshtu 28.02.2009 13:51

Ответ: Массивы
 
Код:

if (abs(sx-sx1)<2 and sy=sy1) Or (sx=sx1 and abs(sy-sy1)<2)
  c=map(sx,sy)
  map(sx,sy)=map(sx1,sy1)
  map(sx1,sy1) = c
endif

Догадайся с трех раз что делает первая строка и чем она отличается от предложенного ранее примера.
//ЗЫ, ты выбрал какой-то неправильный метод освоения программирования, тебе нужна удочка, а ты все время клянчишь рыбу.

Petrofan 02.03.2009 16:47

Ответ: Массивы
 
Как сделать перебор массива и найти три или больше одинаковых значений и удалить их?

NitE 02.03.2009 18:49

Ответ: Массивы
 
for i=1 to 100
if mass(i)=5 then mass(i)=0
next

HolyDel 02.03.2009 19:30

Ответ: Массивы
 
способ 1. Без дополнительного массива. примерно квадратичная сложность.
Код:

for i = 1 to n
 cnt = 0

 if a(i)<>0
  for j = i+1 to n step -1
  if a(j) = a(i) then cnt = cnt +1
  next
 endif

 if cnt >= 3
  val = a(i)
  for j=n to i
  if a(j) = a(i) then a(j)=0
  next
 endif

next

писал в браузере - мог где нибудь накосячить

если число значений элементов массива не слишком большое. например 0..10, то можно использовать спецмассив (массив временных значений)

Способ 2. С дополнительным массивом. примерно линейная сложность.
Код:

for i = 1 to cntvals
tempcnt(i) = 0
next

for i = 1 to n
tempcnt(a(i)) = tempcnt(a(i)) + 1
next

for i = 1 to cntvals
 if tempcnt(i) >=3
  for j = 1 to n
  if a(j) = i then a(j)=0
  next
 endif
next

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

Petrofan 02.03.2009 20:14

Ответ: Массивы
 
Что получаться надо заводить новый массив (одномерный)
Или я что то не понял?

HolyDel 02.03.2009 20:24

Ответ: Массивы
 
см. предыдущий пост.

Petrofan 02.03.2009 20:33

Ответ: Массивы
 
Откуда берется а() ? Объясни мне не образованному! С этими массивами я чета так притупел.

HolyDel 02.03.2009 20:38

Ответ: Массивы
 
ну у тебя будет не a() а идентификатор_твоего_массива(). неужели я на самом деле так криво объясняю? да и вообще - забей на названия переменных. они не выжны. самое главное - попытайся понять алгоритм. он очень прост!

Petrofan 02.03.2009 20:50

Ответ: Массивы
 
Я подставлял Map_Grid(i) вилазит ошибка типа недостаточно параметров


Часовой пояс GMT +4, время: 18:10.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot