forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=109)
-   -   id клетки (http://forum.boolean.name/showthread.php?t=11411)

G.A.D 11.12.2009 21:05

id клетки
 
Создаю поле 20x20
как мне для каждой клетке создать свою номер(id)
Цитата:

Type terrain
Field id
Field x, y
Field status:Int
Function Create()
For i = 1 To size
For j = 1 To size
v:terrain = New v
v.id = (как?)
v.x = i * 128
v.y = j * 128
v.status = 0
Next
Next
End Function

NitE 11.12.2009 21:15

Ответ: id клетки
 
например (не точно но суть ясна)
v.id$=int(str(i)+str(j))

G.A.D 11.12.2009 21:24

Ответ: id клетки
 
не понимаю(
зачем тут str?

Hurrit 11.12.2009 21:47

Ответ: id клетки
 
Вот попробуй так
V.id=j+(i-1)*size

G.A.D 11.12.2009 21:53

Ответ: id клетки
 
в таком случае обратный вопрос!
Какой формулой(законом) вы руководствуетесь?

Hurrit 11.12.2009 21:57

Ответ: id клетки
 
Я ведь программист, я всё придумываю сам, ТАРАМ-ПАМ-ПАМ. Так что мыслим и думаем товарищи

jimon 11.12.2009 22:10

Ответ: id клетки
 
G.A.D
тут бесконечное количество вариантов, по-сути ты хочешь от нас некую функцию z = f(x,y), которых может сколько угодно много

как вариант использовать перевод двух индексов 2д массива в 1 индекс 1д массива, те Z = Y * array_width_size + X (по-сути это и происходит с двумя индексами когда ты обращаешься к 2д массиву, потому что 2д массив в памяти это 1д массив и компилятор просто переводит 2 индекса в 1 индекс)

DStalk 13.12.2009 21:56

Ответ: id клетки
 
G.A.D: Такие вещи лучше массивом сразу делать и с типом не париться...

Hurrit 13.12.2009 22:26

Ответ: id клетки
 
Ага, и создавать НЕСКОЛЬКО массивов чтобы загнать все необходимые свойства ОДНОГО объекта. Это конечно же во много раз легче, чем создать ОДИН тип. Спасибо Капитан Легкий Путь, вы нам помогли

DStalk 13.12.2009 23:24

Ответ: id клетки
 
Нафига тут несколько массивов? Тут как раз одним все обходится..
У него же не присваивается каждой клеточке уникальное имя.. Карту (или поверхность) как раз удобнее описывать через массив! А в другом случае, с разными типами данных уже лучше использовать тип.. Я не прав?)))

moka 14.12.2009 03:20

Ответ: id клетки
 
Массив, может хранить хэндлы на элементы из класса. Для этого, изучите функции Handle и Object.
Инфа по этим функциям, на этом форуме обсуждалась многократно.

G.A.D 23.01.2010 15:58

Ответ: id клетки
 
Спасибо!
У меня есть массив
Код:

massiv:int=[1,0,0,1,..
1,0,0,1,..
0,1,1,0]
file:TStream = WriteFile("map.n")
For b:Int = EachIn massiv
file.WriteString(b)
EndIf

как мне записать содержимое в файл?
притом не в одну строку?
а примерно так
1,0,0,1
1,0,0,1
0,1,1,0

Illidan 23.01.2010 16:16

Ответ: id клетки
 
как в блицу можно, командами
Writeline Readline

G.A.D 23.01.2010 16:26

Ответ: id клетки
 
Я наверное не так сформулировал задачу
надо чтоб в каждой строчке было по 4 символа как в массиве)
затем следующая строка по 4 символа
т.е
1,1,1,1,
0,1,1,0
1,1,1,1
а не 1,1,1,1,0,1,1,0,1,1,1,1

moka 23.01.2010 16:37

Ответ: id клетки
 
А зачем? Храни всё в битах, первым, запиши размер массива:
WriteInt(file,mwidth)
Затем высоту:
WriteInt(file,mheight)
Замет циклом:
For y=0 to mwidth-1
For x=0 to mheight-1
WriteByte(file,massive[x,y])
Next
Next
Читать также, сперва читаешь размер, потом вычитываешь данные.
При этом, хранить всё в бинарном виде, а не в строках, намного лучше, и защищённей.. (да и со строками медленно работать)

G.A.D 23.01.2010 16:44

Ответ: id клетки
 
Для карты нужно)
Local stream:TStream = WriteStream("map.n")
Local LevMap:Int[] =[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ..
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, ..
1, 0, 0, 0, 0, 0, 0, 0, 0, 1, ..
1, 0, 0, 0, 0, 0, 0, 0, 0, 1, ..
1, 0, 0, 0, 0, 0, 0, 0, 0, 1, ..
1, 0, 0, 0, 0, 0, 0, 0, 0, 1, ..
1, 0, 0, 0, 0, 0, 0, 0, 0, 1, ..
1, 0, 0, 0, 0, 0, 0, 0, 0, 1, ..
1, 0, 0, 0, 0, 0, 0, 0, 0, 1, ..
1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
Local mwidth = 10
stream.WriteInt(mheight)
stream.WriteInt(mwidth)
For y = 0 To mwidth - 1
For x=0 to mheight-1
stream.WriteByte(levmap[x, y])
Next
Next
К сожалению не работает(

moka 23.01.2010 17:06

Ответ: id клетки
 
Конечно не будет работать, я псевдо код написал.. :lol:
Исходя из вопроса, а теперь более убеждённый ответом, рекомендую, ознакомиться с базовыми знаниями самого языка, а затем отдельно, с функциями по работе с файлами (и потоками).

G.A.D 23.01.2010 17:10

Ответ: id клетки
 
хД я базовые знаю)
тьфу мне и не понятно как записать не в строчку а в столбик)
и так у меня есть массив 10 на 10
он заполнен никими цифрами
мне надо записать чтоб было
на каждой строчке по 10 цифр из массива
кажется понял пока сообщение писал)

moka 23.01.2010 17:14

Ответ: id клетки
 
На самом деле просто, на расшифровывать будет не просто.
Записывается функцией WriteLine, но строку, нужно сделать как стринг.
При чтении, тебе придётся этот стринг разбивать, и переносить в числа, впихивая в массив.
Поэтому я предложил нормальный вариант выше.

G.A.D 23.01.2010 17:20

Ответ: id клетки
 
П.с похоже базовые не знаю(
смотря что под ними понимать?

moka 23.01.2010 17:48

Ответ: id клетки
 
Работа с файлами - это база :)
Относительно типов данных, и как они хранятся в файлах, и что из себя представляют. Что такое строка в файле на самом деле. И как строки реализованы в самих языках программирования. Процессор не умеет хранить строк ;)
Строка - это массив, содержащий набор char (символ по ASCII, номер символа от 0 до 256). В файле, в котором записана строка, идёт вроде подобного: сперва записывается длина строки (int число), затем считываются int'ы несколько раз (исходя из длины строки), и вводятся в массив, по очерёдности, далее, функции работы со строками, и вообще как таковой строка, в BlitzMax, очень удобно реализована. Поэтому если узнать суть того как она работает, и как хранятся данные в файлах, ты избавишься от идеи, хранить строками. Это удобно если нужен доступ к файлу, из блокнота, но не практично, ни по скорости загрузки, ни по сохранности данных, т.к. блокнотом можно будет менять всё.
А если записывать не строками, тогда всё будет каракулями в блокноте, и информация будет более сохранна, а скорость загрузки и удобства тоже вырастут многозначно.
Попробуй с простой задачки: создай массив int'ов длинной в 10, запиши в файл, длину массива, и затем запиши все значения, по порядку.
Далее, напиши загрузчик, который прочтёт файл, вычтет длину предполагаемого массива, и создаст его, заполнив данными вычтенными из файла. И естественно на проверку - в дебаглог выведи всё, чтобы убедиться если всё правильно. :) Реализовав это, уже многое будет понятно, как с файлами работать.

G.A.D 23.01.2010 18:11

Ответ: id клетки
 
Может кому понадобятся)
Function readmap(file_in$)
Local file = ReadFile(file_in)
Local dim:Int[]
Local dlin = ReadInt(file)
Print dlin
For i = 0 To dlin - 1
dim[i] = ReadInt(file)
Print dim[i]
Next
For b:Int = EachIn dim
Print b
Next
CloseFile(file)
End Function
Function writemap(file_out$,dlina:int,array:int[])
Local dim:Int[] =array
Local file = WriteFile(file_out$)
Local dlin = dlina
WriteInt(file, dlin)
For i = 0 To dlin - 1
WriteInt(file, dim[i])
Next
CloseFile(file)
End Function
что-то не понимаю как можно эти ф-ии,которые я написал приминить к карте(

moka 23.01.2010 18:39

Ответ: id клетки
 
Код:

Function readmap(file_in$)
 Local file = ReadFile(file_in)
 Local width = ReadInt(file)
 Local height = ReadInt(file)
 Print width+","+height
 Local dim:Int[width,height]
 For y = 0 To height - 1
  For x = 0 To width - 1
  dim[x,y] = ReadInt(file)
  Print dim[x,y]
  Next
 Next
 For b:Int = EachIn dim
  Print b
 Next
 CloseFile(file)
End Function

Код:

Function writemap(file_out$,width%,height%,array:int[])
 Local file = WriteFile(file_out$)
 WriteInt(file, width)
 WriteInt(file, height)
 For y = 0 To height - 1
  For x = 0 To width - 1
  WriteInt(file, array[x,y])
  Next
 Next
 CloseFile(file)
End Function

Редактировал в броузере, поэтому може где ошибка есть, но не должно быть.
Вот 2д массив тебе сохраняется, и загружается.

G.A.D 23.01.2010 18:41

Ответ: id клетки
 
Спасибо!Но странно у меня не работает может я не правильно массив создаю.

G.A.D 24.01.2010 16:30

Ответ: id клетки
 
Global LevMap:Int[] =[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ..
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, ..
1, 0, 0, 0, 0, 0, 0, 0, 0, 1, ..
1, 0, 0, 0, 0, 0, 0, 0, 0, 1, ..
1, 0, 0, 0, 0, 0, 0, 0, 0, 1, ..
1, 0, 0, 0, 0, 0, 0, 0, 0, 1, ..
1, 0, 0, 0, 0, 0, 0, 0, 0, 1, ..
1, 0, 0, 0, 0, 0, 0, 0, 0, 1, ..
1, 0, 0, 0, 0, 0, 0, 0, 0, 1, ..
1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

writemap("d.ng", 10, 10, LevMap)
readmap("d.ng")
Error:Incorect array dimension
Я так понимаю ,что я не указал второе измерение ,но не пойму где?
получается что Levmap 1d массив.
как его преобразовать в 2d?

moka 24.01.2010 16:48

Ответ: id клетки
 
Код:

Global LevMap:Int[10,10]
For Local y%=0 to 9
 For Local x%=0 to 9
  If x=0 or x=9 or y=0 or y=9
  If x<>9 and y<>1
    LevMap[x,y]=1
  EndIf
  EndIf
 Next
Next

Этот цикл, сделает такую же карту, как ты описал.

G.A.D 24.01.2010 17:29

Ответ: id клетки
 
Мне не надо делать карту автоматом
levmap надо записать)

moka 24.01.2010 18:15

Ответ: id клетки
 
Для этого делается редактор :)
Можно использовать DefData, чтобы "записывать" карту.

G.A.D 24.01.2010 20:35

Ответ: id клетки
 
Ясно,спасибо!
П,С все вопросы выше касались редактора,жаль сразу про defdata не сказал

G.A.D 25.01.2010 17:29

Ответ: id клетки
 
а есть какое нибудь другое решение?(если не Defdata)

moka 25.01.2010 21:12

Ответ: id клетки
 
Написать свой визуальный редактор. :)

G.A.D 25.01.2010 22:51

Ответ: id клетки
 
Самый первый мой вопрос про запись в файл был для создания редактора.
(визуального)
карту лучше хранить в массиве,а зачем ты мне тогда defdata порекомендовал?

moka 25.01.2010 23:53

Ответ: id клетки
 
Ты хотел для начала сразу назначить массив. Я предложил вариант как это сделать :)
Используя DefData, можно в самом исходнике хранить тестовые данные. :)
А насчёт редактора - я тебя к нему и вёл :)

G.A.D 25.01.2010 23:56

Ответ: id клетки
 
Я видно не так объяснил и ты меня не так понял)
И так в чём мне лучше карту хранить?
В массиве как я предложил или в Defdata?
Моя идея редактора была такова
1)Записать всё данные из массива в файл
2)Сохранить его
3) В самой игре считать данные и занести в массив
4)Построить карту из данных в массиве
На 2 пункте у меня и возник вопрос как массив сохранить в файл

NitE 26.01.2010 00:00

Ответ: id клетки
 
делай как тебе удобно, эти мелкие формальности на результат не повлияют (есои правильно сделаешь) храни всё в текстовых файлах - если нравится. а вот как написать редактор и принцип его работы придумай и реализуй сам.

moka 26.01.2010 02:55

Ответ: id клетки
 
Цитата:

Сообщение от G.A.D (Сообщение 134752)
Я видно не так объяснил и ты меня не так понял)
И так в чём мне лучше карту хранить?
В массиве как я предложил или в Defdata?
Моя идея редактора была такова
1)Записать всё данные из массива в файл
2)Сохранить его
3) В самой игре считать данные и занести в массив
4)Построить карту из данных в массиве
На 2 пункте у меня и возник вопрос как массив сохранить в файл

Всё правильно.
Поясню: я предложил DefData заместо этого (что ты хотел):
Код:

Global LevMap:Int[] =[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ..
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, ..
1, 0, 0, 0, 0, 0, 0, 0, 0, 1, ..
1, 0, 0, 0, 0, 0, 0, 0, 0, 1, ..
1, 0, 0, 0, 0, 0, 0, 0, 0, 1, ..
1, 0, 0, 0, 0, 0, 0, 0, 0, 1, ..
1, 0, 0, 0, 0, 0, 0, 0, 0, 1, ..
1, 0, 0, 0, 0, 0, 0, 0, 0, 1, ..
1, 0, 0, 0, 0, 0, 0, 0, 0, 1, ..
1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

Хранение самого уровня в массиве естественно. Лучше всего, если каждая клетка имеет много информации, тогда массив будет содержать ссылки на элементы (класс), которые тоже нужно будет продумать, разработать, научиться их создавать, сохранять и загружать.
Короче говоря, я то понял, но тебя не многа с толку сбил. DefData я предложил как уже сказал, как тестовый момент. Его вообще не используй в будущем.

Напиши 2 программки, в одной можно будет мышкой менять массив. А в другой кодом определённый массив (как тут уже было выше расписано), научись сохранять, и загружать.
Далее совмести :)

Nite, сказал не о чём.. (нефтему)

jimon 26.01.2010 12:44

Ответ: id клетки
 

4 байтовый int содержащий только 0 и 1, до чего доросло текущее поколение, да, а intel пыхтит, а intel старается, а тут такое

G.A.D 28.01.2010 20:12

Ответ: id клетки
 
Moka,
в смысле много информации?
первое написал
с сохранением опять проблемы.
как обозначают класс Blitzmax?
в С++ class

moka 29.01.2010 04:10

Ответ: id клетки
 
Посмотри примеры исходников, в поставке с бм. "Type"


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

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