0
Вид для печати
0
Есть волшебная команда restore n где n - строка с данными которые будут считываться по команде read. :)
Нет. В текстовых строках "тэги" цвета входят в общую строку.
Если нужно выводить цветные буквы из строки, организуй второй массив, цифры в котором будут означать цвет. На каждую букву - по цифре :)
Можно создать двумерный массив, прочитать всё в него, затем ходить по нему =)
если делать в том стиле как ты задумал надо:
10 DATA 1,7, 2,6, 3,5, 4,4, 5,3, 6,2, 7,1
30 READ B
40 READ P
50 BORDER B, PAPER P, CLS
60 READ B,P: GOTO 50
Данные для бордера и бумаги хранятся парами, друг за другом.
Проще делать это, вычисляя "полное" значение ink+paper+bright+flash. И места будет занимать будет меньше и "глобально" меняет одним оператором poke m,n в системных переменных. Для цвета border также актуально..
Еще вопрос, есть заполненная DATA, как через PRINT вызвать допустим по счету третью запись в DATA не чередовая READ с начала?
если типа так:
9999 DATA 1,2,3,4,5
и ты хочешь сразу 3 получить, то по-простому никак. возможно какие-нить POKE в сист. переменные что-то и решат.
Расписать каждое значение (или группу) в свой оперетор data пронумеровав строки, допустим через 10. А потом вызывать их через restore n подставляя номер нужной записи (с соотв. приращением и шагом).
Вариант с хранением данных непосредственно в памяти (операторами poke\peek) более "экономичный", но геморный если понадобится что-нить поменять местами или "глобально" изменить в данных.
23639/23640 "DATADD" - адрес последнего считанного оператором READ объекта данных в операторах DATA.
То есть навскидочку можно, наверное, читать первый элемент, извлекать его адрес PEEKом из этой переменной, а потом, изменив нужным образом, POKEать обратно. Числовые данные занимают по 5 байт каждое число, символы по одному. Надо поиграться, в общем ;)
---------- Post added at 18:38 ---------- Previous post was at 18:34 ----------
То есть вру, пять байт числового значения идут после записи того же числа в символах, то есть одна позиция числовых данных (с одним разрядом) занимает: байт символа + 5 байт числа + байт запятой, итого семь. А символ, соответственно, два байта (считая запятую). Так, что ли?..
перед 5 байт числа еще 0E. гиблый способ.
Проще хранить и читать прямо в памяти POKE/PEEK. Читай элемент какой тебе заблагорассудится.
Через массив DIM n[$](m[, m1, m2, .. mx]) где n - имя переменных массива, $ - необязательный параметр (только для строковых переменных), m - количество переменных в массиве (если массив многомерный, добавляются параметры m1, m2, .. mx).
На практике, это может выглядеть так:
При этом дав команду go to 20, массив (в данном случае) заполниться уже другими значениями.Цитата:
...
10 DIM A (10) ; задаем массив из 10 элементов
20 FOR I = 1 TO 10 ; организуем цикл
30 LET A (I) = RND ; заносим данные в массив
40 NEXT I ; конец цикла
...
---------- Post added at 15:39 ---------- Previous post was at 15:37 ----------
Можно узнать, откуда будут браться данные для заполнения в первом и во втором случае? Если вы храните в DATA-строке глобальные переменные (положение окон, начальные данный, карты уровней и т.п.) не вижу сложности в том, что будет несколько однотипных строк, для выборки данных из которых делаем RESTORE n (где n - адрес строки с данными), а потом READ a, b, .. x. В данном случае при разных значениях n, данные a, b, .. x будут разными.
А заменять программным способом значения в троках DATA - это какой-то "китайский коммунизм"! :) Все можно организовать намного проще. Например, вот как я организовывал хранение данных об окнах в DATA-строках (см. вложение - игра сапер). Со строки 7000 идут блоки микропрограмм с параметром "выбора окна" (строка RESTORE n), подпрограмма для работы с данными начинается со строки 9500, сами данные расположены со строки 9900.
Через ту же связку restore n, read n, data n. Как альтернатива, если числа целые, через PEEK n [+256*PEEK (n+1) - если число "двухбайтное"], но их нужно, все равно, предварительно как-то загрузить в память (вручную, через data-строки или с кассеты\диска).
---------- Post added at 16:09 ---------- Previous post was at 16:05 ----------
Только, числовые переменные (и массивы, как частный случай числовой переменной) в бейсике "сьедают" много памяти..
Тогда можно использовать массив DIM A (x, n), где x - зависит от того сколько одинаковых x-наборов будет у вас, а n-количество чисел для "выборки".
---------- Post added at 16:11 ---------- Previous post was at 16:09 ----------
Внес кое-какие изменения в 19 сообщение - перечитайте, на всякий случай..
---------- Post added at 16:11 ---------- Previous post was at 16:09 ----------
В соседней ветке увидел новую игру, анонсированную вами. Возможно ошибаюсь, но не для нее ли вы искали алгоритм хранения данных?!
Рассмотрев листинг, пришел к выводу, что данные хранятся, несколько "неоптимально". Как массив, так и DATA-строки можно было оформить в виде символьный переменных. Тогда перенос лабиринта из строки DATA в массив можно было бы выполнить "целой строкой" READ d$: LET a$ (t)=d$, где t - это "строка", а не счетчик очередного элемента лабиринта.
В смысле, "код" нажатой клавиши (число от 32 до 164-255)? Либо, с помошью "конструкции" LET n = CODE INKEY$, либо через переменную last_k (23560), не забывая "обнулять" ее после процедуры обработки нажатия клавиши. Например так:
----Код:..
10 poke 23560,0 ; "обнуляем" переменную
20 let n = peek 23560 ; присваиваем значение
30 if not n then goto 20 ; "ждем" нажатия
40 if n = 32 then print "press space" ; обработка факта нажатия space
42 if n = 13 then print "press enter" ; обработка факта нажатия enter
50 goto 10 ; завершение "цикла"
..
Важно!
Таким способом можно "опрашивать" только нажатие одной клавиши. Т.е., при одновременном зажатии нескольких клавиш ни одна из них, не будет "распознана".
Скрытый текст
Не обязательно.. данная программа проверяет нажатие двух клавиш и выводит надпись о факте их нажатия. У вас это может быть реакция для управления спрайтом\курсором и т.п.
Допустим, вам нужно определить нажатие одной из пяти клавиш (например 67890). Коды этих клавиш можно поместить в массив (или ячейки памяти) и сравнивать с ними так:
----Код:for i = 1 to 5 : read k(i) : next i
data 54, 55, 56, 58, 48
..
if n = k(1) then..
if n = k(2) then...
if n = k(3) then...
if n = k(4) then...
if n = k(5) then...
..
Хотя, более компактно, при использовании массива хранить значения для клавиш в "символьном" виде. Занимает меньше места в памяти и позволяет "на лету" менять "управляющие" клавиши. ;)
При этом для смены управляющий клавиш в программе, достаточно присвоить переменной k$ другую символьную последовательность, например let k$ = "qaopm".Код:let k$ = "67890"
..
if chr$ n = k$(1) then..
if chr$ n = k$(2) then..
if chr$ n = k$(3) then..
if chr$ n = k$(4) then..
if chr$ n = k$(5) then.. ; либо так if n = code k$(5) then..
..
[свернуть]
---------- Post added at 20:53 ---------- Previous post was at 20:40 ----------
Для "высвечивания" только кода нажатой клавиши можно поступить намного проще: :)
Обьясните, подробно, для чего вам нужен код нажатой клавиши?Код:10 print at 0, 0; code inkey$ ;" " : goto 10
Не совсем понял? Речь о чем-то типа "програмного буфера" ввода с клавиатуры? Нэ?!
----
Если что - вся "таблица" клавиш есть в конце книжки ZX Spectrum для пользователей и прграммистов..