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)

Petrofan 18.02.2009 16:42

Массивы
 
Кто нибуть помогире разобратся с массивами какие они сужествуют? Хочу сделать игру 2d логическую суть игры находить 3 или больше одинаковых фигурки тогда они исчезают например стоит 2 алмаза а третий на 1 клетку выше, перемищаем ее в низ происходит обмен фигурок и все 3 удаляються а сверху появляються другие и будто под действием гравитации смещаются ниже. Я думаю что 50 процентов пользователей форума играли в подобную игру. Может кто знает учебник с хорошым разеснением массивов когда поделитесь пожалуйста. Жду от всех помощи!

HolyDel 18.02.2009 16:52

Ответ: Массивы
 
существуют двумерные массивы.

NitE 18.02.2009 17:20

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

Arrays are created using the standard BASIC 'Dim' statement, and may be of any number of dimensions. For example:

Dim arr(10)

Creates a one dimensional array called 'arr' with 11 elements numbered 0...10.


Arrays may be of any basic type, or a custom type.

The type of an array is specified using a type tag. For example:

Dim Deltas#(100)

Creates an array called 'Deltas' of 101 floating point elements.

If the type tag is omitted, the array defaults to an integer array.

An array may be dimensioned at more than one point in a program, each time an array is dimensioned, it's previous contents are discarded. Arrays may be dimensioned inside functions, but a corresponding 'Dim' statement of the same array must also appear somewhere in the main program. For example:

Dim test(0,0)

Function Setup( x,y )

Dim test(x,y)

End Function


Petrofan 18.02.2009 18:06

Ответ: Массивы
 
Вложений: 1
For a=1 To 8
For b=1 To 8
DrawImage img,-12+b*64,-24+a*64
Next
Next

Я таким способом заполнил карту, а как сделать хаотическое заполнение разными картинками и обращение к ним?


Вот скрин что получилось

HolyDel 18.02.2009 18:24

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

dim el(8,8)
dim img(4)

for i = 1 to 4
img(i)=loadimage(i+".bmp")
next
For a=1 To 8
For b=1 To 8
El(i,j)=rand(1,4);
Next
Next

For a=1 To 8
For b=1 To 8
DrawImage img(El(i,j)),-12+b*64,-24+a*64
Next
Next


NitE 18.02.2009 18:33

Ответ: Массивы
 
ещё rnd() и select

Petrofan 18.02.2009 18:58

Ответ: Массивы
 
Почему все заполняется одной картинкой?
И откуда в єтой строке El(i,j)=Rand(1,5) берется j

HolyDel 18.02.2009 19:03

Ответ: Массивы
 
тьфу. у тебя же a,b а не i,j соответственно.

Petrofan 19.02.2009 11:44

Ответ: Массивы
 
Graphics 800,600,16,0
SetBuffer BackBuffer()
SeedRnd MilliSecs()
Font=LoadFont("",19,0,0,0)
SetFont Font

Dim el(8,8)
Dim img(5)

While KeyDown(1)=0
Cls

For a=1 To 8
For b=1 To 8
;Text -12+b*65,-24+a*65,a
Text 20+b*65,-44+a*65,b
Next
Next

Flip
Wend
End

Вот я попробовал сделать текстом чтобы увидеть что происходит если розкоментировать текст который выводит переменую а и закоментировать текст ... b то видно как заполняется масив.
Вопрос:
Как теперь обращатся к этим ячейкам по имене или числу? Откуда узнать курсору где какая ячейка типа x1y1, x2y1,x3y1..(это я себе так думаю)?

NitE 19.02.2009 15:43

Ответ: Массивы
 
обращятса просто - например
dim shit(2)
shit(1)=15
shit(2)=30

Petrofan 19.02.2009 16:00

Ответ: Массивы
 
В массиве 64 элемента.
Как в коде назначить каждому элементу имя.
---------------------------------------------
Массивами я никогда не пользовался и пока понятия не имею как с ними работать, просто 1-хочу научится с ними работать, 2- моей жене нравятся игры такого рода и эту игру я хочу сделать для неё. Пожалуйста помогите!

IGR 19.02.2009 16:38

Ответ: Массивы
 
Цитата:

В массиве 64 элемента.
Как в коде назначить каждому элементу имя.
сам елемент массива может быть у тебя именем !! если неуказовать тип масива то он по умолчанию он целочисленый !!
Код:

dim mydim$(8,8) - строковый
dim mydim#(8,8) - с запятой

For a=1 To 8
For b=1 To 8
mydim(a,b)=str("mycellname"+(a+b)); здесь записуем имя ячейки которая есть ее номером
Next
Next

если нада что бы было и имя и еще номер или сама картинка для каждого елемента масива, то создаем свой тип даных:

Код:

type mytype
field cellname$
field cellnuber%
;.... заносим все что нужно - в елементи списка
end type

теперь создаем масив типа mytype:
Код:

dim mydim.mytype(8,8)
и заполняем !!

avel 19.02.2009 17:07

Ответ: Массивы
 
просвещайсо на здоровье: http://blitzetc.blitzmax.ru/index.ph...дартный_подход

Petrofan 19.02.2009 17:27

Ответ: Массивы
 
Почему на сайте http://blitzetc.blitzmax.ru
пишет Создание В чем проблема?

NitE 19.02.2009 19:13

Ответ: Массивы
 
кодировка не та - Windows-1251

Petrofan 19.02.2009 19:22

Ответ: Массивы
 
Вложений: 1
Я уже такого налепил. Со всех примеров натыкал. Кто хочет может посмотреть сбрасываю архив. Может поможет разобраться с этой задачей, а то я сам ну никак не могу.

NitE 20.02.2009 01:18

Ответ: Массивы
 
если неможешь массивами - делай типами

avel 20.02.2009 03:33

Ответ: Массивы
 
да нафиг тут типы? тут же все элементарно... к тому же с типами ИМХО разобраться тем более сложнее...

Petrofan 20.02.2009 11:55

Ответ: Массивы :SOS:
 
Дайте кто нибудь справочник по массивам я уже всю голову сломал,:wallbash: методом научного тыка делаю!

ABTOMAT 20.02.2009 15:41

Ответ: Массивы
 
http://www.gaps.tstu.ru/win-1251/lab...1251/gl47.html
Отсюда и по порядку.
Всё что там - подходит и для Блица

avel 20.02.2009 20:56

Ответ: Массивы
 
Petrofan почитай ту ссыль, что я тебе дал. ам как раз именно то, что ты делаешь. там и вывод и обработка мыши и прочее...

Petrofan 23.02.2009 12:35

Ответ: Массивы
 
Кто то может скопировать текст по этой ссылке http://blitzetc.blitzmax.ru/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_% D1%80%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0 %B0_%D0%BA%D0%B0%D1%80%D1%82%2C_%D0%BD%D0%B5%D1%81 %D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D 1%8B%D0%B9_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4 и вставить в какой не будь документ и выложить здесь.

Taugeshtu 23.02.2009 12:46

Ответ: Массивы
 
Вложений: 1
Держи, просвящайся:
//я б посоветова осилить работу с массивами в "инкубаторе" (простые строки кода с минимальными выводами результатов и возможностью в рантайме менять параметры чтоб въехать чего и как), а не на каком-то проекте

Petrofan 23.02.2009 13:18

Ответ: Массивы
 
Спасибо за документ!
У меня постепенно все получаться но вот и появилась проблема все выходные за компом сидел и так и не понял как решить задачу:
Каким образом в поле 8х8 вычислять есть ли одинаковые 3 или больше картинки (по вертикали и горизонтали) и если есть уничтожать а с верху добавить новые сдвигая все вниз массива?

Petrofan 24.02.2009 11:33

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

jimon 24.02.2009 11:46

Ответ: Массивы
 
Petrofan
для каждого столбца или строки выполняем проход по всем его елементам и делаем что-то типа
Код:

if type = lasttype then
count = count + 1
else
count = 1
endif

if count = 3 then do_something()

(не забываем про первоначальные установки переменных, думаю lasttype сначала надо сделать отличное от всех типов)

смещать елементы можно так, к примеру ищез елементы k (количество) на позиции i в столбце j, считаем что верх столбика это i = 0
тогда прокручиваем цикл
Код:

for z:=0 to i-k
a[z+k] = a[z]
next

for z:= 0 to k
a[z] = newelement()
next

(вроде не ошибся с крайними индексами, пишу утром код в браузере)

идея в том что елементы падают только сверху, потому даже удалая 3 елемента в строке мы должны пройтись по трём столбцам где были эти елементы и сместить там елементы

ps. меня радует что у тебя появляются конкретные проблемы которые тебе не понятны :)
хотя стоит всё же потренироватся на таких чисто логических задачах по работе с матрицами

Petrofan 24.02.2009 13:36

Ответ: Массивы
 
Ты имеешь в виду типы или массивы?
Вот что я сделал (не нуждается в ресурсах)

Код:

Graphics 800,600,32,0
SetBuffer BackBuffer()
SeedRnd MilliSecs()
Font=LoadFont("",32,0,0,0)
SetFont Font

;===========================
Dim Map_Grid(8,8)
Dim Map(8,8)

For I=1 To 8
For J=1 To 8
Map_Grid(I,J)=Rnd(1,4)
Next
Next
;===========================




;===========================
Dim img(5)
For im = 1 To 4
Next
;===========================

While KeyDown(1)=0
Cls

For I=1 To 8
For J=1 To 8
Color 200,0,0
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,200
If Map_Grid(i,j)=3 Then Color 0,200,0
Rect 50+I*51,50+J*51,50,50
Next
Next

i = (MouseX())/52-1
j = (MouseY())/52-1
If (i > 0) And (i<9) And (j > 0) And (j < 9) Then
Color 100,100,100
Rect 50+I*51,50+J*51,50,50

Color 200,200,200
Text 0,0,"Image - "+Map_Grid(I,J)
If MouseHit(1) Then

EndIf
EndIf

Text 110,55,i
Text 75,110,j
Flip 1
Wend
End

Может попробуешь добавить сюда то что ты написал.

Petrofan 24.02.2009 18:30

Ответ: Массивы
 
Ну подскажите хотя бы суть как сделать перебор массива языком Blitz3d чтоб находились 3 или больше ячейки и удалялись с массива и записывались другие ячейки. Как это реализовать???
Помогите чтоб я от вас отстал.

ABTOMAT 25.02.2009 01:50

Ответ: Массивы
 
Перебираешь КАЖДУЮ ячейку двумерного массива.
Проверяешь соседние с ней ячейки (т.е. с индексами -1,0;1,0 и 0,-1;0,1) на совпадение с тем же значением ячейки. Если они все равны - то да, все три одинаковые.
Как спустить всё вниз чтобы заполнить образовавшийся промежуток?
В ту ячейку, в которой образовались одинаковые предметы (т.е. её нада удалить), кладёшь значение вышестоящей ячейки. В вышестоящую - значение ещё вышестоящей. Пока не доберёшься до самого верха.
И так все три ячейки, которые ты хочешь удалить.

Вопросы по каждому конкретному пункту пжлст, а не "как сделать всё сразу?"

Petrofan 26.02.2009 17:26

Ответ: Массивы
 
Как этой формулой обменять местами ячейки?
c=a
a=b
b=c

if mousehit(1) then
...
...
endif

HolyDel 26.02.2009 17:48

Ответ: Массивы
 
с = a(i1,j1)
a(i1,j1) = a(i2,j2)
a(i2,j2) = c

Petrofan 26.02.2009 18:13

Ответ: Массивы
 
(i2, j2)- откуда это?

If MouseHit(1) Then
sel=sel+1
If sel>2 Then sel=1
If sel=1 Then
If sel=2 Then
EndIf

Вот я сделал условия как суда подставить?

HolyDel 26.02.2009 18:21

Ответ: Массивы
 
я хз откуда. тебе надо поменять значения в двух ячейках. массив двумерен. поетому нужно 4 числа. две пары координат.

Petrofan 26.02.2009 18:31

Ответ: Массивы
 
Я уже по всякому пробовал не получаться. Назначить ячейке значение (допустим "1") могу, а поменять а(1,2)=1 на а(2,1)=2 и в итоге получить а(1,2)=2 на а(2,1)=1 не выходит.

HolyDel 26.02.2009 18:33

Ответ: Массивы
 
c = a(1,2)
a(1,2) = a(2,1)
a(2,1) = c

это разве не катит? О_о

Petrofan 26.02.2009 18:53

Ответ: Массивы
 
Не катит. Нужно как то реализовать обмен ко всему массиву через map(i,j)

HolyDel 26.02.2009 19:23

Ответ: Массивы
 
ну ты используй не 1,2 и 2,1 а какие то свои значения, i1,j1 и i2,j2

Taugeshtu 26.02.2009 19:24

Ответ: Массивы
 
Цитата:

Не катит.
Никогда не поверю. Массив доступен как для чтения:
c = a(1,2)
Так и для записи:
a(2,1) = c
Равно как и для одновременного цтения и записи:
a(1,2) = a(2,1)

Значит что-то ты криво вставил, потому что это по определению не работать не может.

IGR 26.02.2009 19:35

Ответ: Массивы
 
Цитата:

Не катит. Нужно как то реализовать обмен ко всему массиву через map(i,j)
непонятно !!
тебе что нада строчки стлобиками заменить ??
нада цикл for? там будут изменятся твои i, j !!

Petrofan 26.02.2009 20:12

Ответ: Массивы
 
Ну как вы не можете понять? есть массив 8х8 заполнен значениями от 1 до 4 (картинки). Требуется при первом щелчке мышки на одной из 64 ячеек куда то записать ее значение при втором щелчке на другую ячейку записать в нее эти значения а ее знач записать в ячейку первого щелчка вот и все.

ABTOMAT 26.02.2009 22:32

Ответ: Массивы
 
Заведи ещё одну переменную отдельно от массива.

IGR 26.02.2009 22:51

Ответ: Массивы
 
нужны указатели на кликнутую и кликаную ячейки массива, а также нужно знать какие в них хранятся картинки !!

Randomize 27.02.2009 02:59

Ответ: Массивы
 
Вложений: 1
Уважаемый Petrofan, сидя в скуке наткнулся на вашу проблему, потом немного поколдовав сделал, используя вашу графику некую игровую программу, не знаю это ли вы хотели получить в своей программе, но я сделал вот такую игру. Быть может код будет хоть както полезен.
Вложение 5456

Petrofan 27.02.2009 16:36

Ответ: Массивы
 
Пацаны у кого есть FastImage (не демо) у меня через опредиленое время вызкакивает сообщение "trial"

Petrofan 27.02.2009 18:13

Ответ: Массивы
 
HolyDel я ошибся все таки катит я взял кое что в примере Randomize плюс твою формулу. Обмен ячеек происходит так как било нужно спасибо всем огромное !!!
А как запретить перемещать ячейку дальше чем можно то есть только с соседними а не менять по всему полю?

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) вилазит ошибка типа недостаточно параметров

HolyDel 02.03.2009 21:01

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

size_x - размер поля по горизонтали
size_y - размер поля по вертикали
a - массив

Код:

n = size_x * size_y
for i = 1 to n
 cnt = 0
 x = i mod size_x
 y = i / size_x

 if a(x,y)<>0
  for j = i+1 to n
  x2 = j mod size_x
  y2 = j / size_x

  if a(x,y) = a(x2,y2) then cnt = cnt +1
  next
 endif

 if cnt >= 3
  val = a(x,y)
  for j=n to i step -1
  x2 = j mod size_x
  y2 = j / size_x

  if a(x2,y2) = a(x,y) then a(x2,y2)=0
  next
 endif

next


avel 03.03.2009 03:48

Ответ: Массивы
 
епть... как все запущенно-то... *многадумаю* надо будет написать туториал по массивам чтоли... да и вообще по основным алгоритмам...

Randomize 03.03.2009 08:28

Ответ: Массивы
 
и по BlitzMax напиши, а то я там много чего недопонял.
хелп там не изобилует примерами.
А примеры хелпом.

Petrofan 03.03.2009 11:18

Ответ: Массивы
 
Все равно не выходит сделать удаление ячеек можно как нибудь с комментариями для того чтоб хотя бы понять что там происходит?


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

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