|  Игровая программа, таймер и генерация звука | 
 ПРАВИЛА РАЗДЕЛА!!!
 ПРАВИЛА РАЗДЕЛА!!!1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE] 
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали! 
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
 
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!
|   | 
|  Игровая программа, таймер и генерация звука | 
| Rocket |  9.03.2009 22:56 
				 Сообщение
					#1				
			 | 
|  Знаток     Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация:  0    | Доброго времени суток, уважаемые форумчане!    Мне нужно написать программу, которая перед началом игры произвольно устанавливает невидимую на экране метку и видимый символ "*", который перемещается по экрану с помощью стрелок. При движении символа генерируются звуковые колебания, частота которых зависит от расстояния до невидимой метки. Если метка не найдена за 4 секунды, метка перемещается в другую точку. Мне очень эта программа напоминает металлоискатель : ) Пока что я сделал только перемещение символа "*" с помощью букв w,s,a,d. 
 Не могу понять, почему "вверх" не срабатывает с первого раза? приходится повторно нажимать "w", в результате мы поднимаеся не на одну позицию, а на две... И как сделать какую-нибудь очистку экрана? чтоб очищать консоль и на экран выводился только один символ "*" . | 
| volvo |  9.03.2009 23:46 
				 Сообщение
					#2				
			 | 
| Гость  | Цитата И как сделать какую-нибудь очистку экрана? чтоб очищать консоль и на экран выводился только один символ "*".Функция 06h прерывания 10h (прокрутка окна вверх) - задаешь окно, равное всему экрану, и число строк для сдвига = 0 - окно прокручивается полностью, и очищается... Цитата Не могу понять, почему "вверх" не срабатывает с первого раза? приходится повторно нажимать "w", в результате мы поднимаеся не на одну позицию, а на две...Твоя программа у меня только грузит процессор на 25% и больше ничего, ВООБЩЕ ни на что не реагирует, так что тебе еще повезло, что ты хоть КАК-ТО можешь двигать звездочку. | 
| Rocket |  10.03.2009 0:33 
				 Сообщение
					#3				
			 | 
|  Знаток     Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация:  0    | Функция 06h прерывания 10h (прокрутка окна вверх) - задаешь окно, равное всему экрану, и число строк для сдвига = 0 - окно прокручивается полностью, и очищается... Твоя программа у меня только грузит процессор на 25% и больше ничего, ВООБЩЕ ни на что не реагирует, так что тебе еще повезло, что ты хоть КАК-ТО можешь двигать звездочку. Так, вот добавил очистку экрана...и проблема с двойным "вверх" ушла сама собой) но мне не понятно почему она у Вас не работает... Вот что у меня сейчас: 
 Вроде никаких хитростей нет, почему не запускается не понятно. Просто сейчас начинается реально трудная вещь, которую я ума не приложу как делать, то есть генерация звука определённой частоты, которая зависит от расстояния до невидимой точки... как вообще эту точку произволно-то ставить? в ассеблере есть что-то вроде рандома? | 
| andriano |  10.03.2009 8:31 
				 Сообщение
					#4				
			 | 
| Гуру      Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация:  28    | 1. Звук генерится посредством 53 таймера, причем его прохождение на динамик еще надо разрешить. Конкретных номеров портов навскидку не помню - давно не программировал под DOS. 2. х86 процессор не имеет аппаратных средств для генерации случайных чисел. Это ответ на твой вопрос - есть ли в ассемблере рандом. Но можно сделать программно генератор псевдослучайных чисел. Например, конгруэнтный. А инициализировать его (аналог randomize) чем-то, связанным с текущим временем. Хотя бы содержимым ячейки 0040:006c. | 
| TarasBer |  10.03.2009 14:50 
				 Сообщение
					#5				
			 | 
|  Злостный любитель      Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация:  62    | 2. х86 процессор не имеет аппаратных средств для генерации случайных чисел. Это ответ на твой вопрос - есть ли в ассемблере рандом. Но можно сделать программно генератор псевдослучайных чисел. Например, конгруэнтный. А инициализировать его (аналог randomize) чем-то, связанным с текущим временем. Хотя бы содержимым ячейки 0040:006c. Я приведу дельфийскую реализацию рандома. 
 Это для 32х-разрядного проца. Смысл в том, что число RandSeed умножается на спец.константу $08088405, и увеличивается на 1. Так получается новое число RandSeed. А для того, чтобы из этого рандсида извлечь число, этот рандсид умножается на границу. И то, что вылезло за пределы 32 бит (оно автоматически пихается в регистр EDX) - и выдаётся как результат функции. Для 16-битного проца, думаю, можно сделать аналогично, надо только знать, куда команда MUL пихает результат, а куда - то, что вылезло за пределы. И какова спец.константа для 16-битного случая - я не знаю. -------------------- | 
| TarasBer |  10.03.2009 16:00 
				 Сообщение
					#6				
			 | 
|  Злостный любитель      Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация:  62    | А турбо-паскальный рандом такой же. Я не нашёл менее порнушного способа перемножить два 32-битных числа на 16-битном асме, так что вот, процедура оформлена по-паскалевски, но оформите её по-асмовски сами. 
 RS - это RandSeed При сравнении со стандартным рандомом получилось только одно отклонение - для очень больших w стандартный рандом почему-то даёт на 1 больше, чем мой. Сообщение отредактировано: TarasBer - 10.03.2009 16:01 -------------------- | 
| volvo |  10.03.2009 20:06 
				 Сообщение
					#7				
			 | 
| Гость  | По поводу генерации звуков - когда-то 7in на одном из форумов приводил вот такие процедуры: Цитата(7in) ; Процедура Sound: генерация звука | 
| Rocket |  12.03.2009 21:32 
				 Сообщение
					#8				
			 | 
|  Знаток     Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация:  0    | По поводу генерации звуков - когда-то 7in на одном из форумов приводил вот такие процедуры: У него же были и Randomize + Random, но поскольку кое-что тебе уже подсказали по поводу случайных чисел, то повторяться не буду... Использую эту процедуру в программе, динамик издаёт однократный треск. А как сделать именно дискретное "пиканье" через всё выполнение программы? и чтоб частота этого "пиканья" зависела от расстояния до невидимой точки...? | 
| andriano |  12.03.2009 21:52 
				 Сообщение
					#9				
			 | 
| Гуру      Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация:  28    | Использую эту процедуру в программе, динамик издаёт однократный треск. А как сделать именно дискретное "пиканье" через всё выполнение программы? и чтоб частота этого "пиканья" зависела от расстояния до невидимой точки...? Повесить на прерывание таймера (кажется 1с) управление режимом генерации звука. Основная программа вычисляет параметры (например, интервал между "бипами" в "тиках", т.е. в 1/18.2 сек), а вызываемая по таймеру процедура в нужные моменты включает и выключает динамик. | 
| Rocket |  14.05.2009 20:26 
				 Сообщение
					#10				
			 | 
|  Знаток     Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация:  0    | После долго перерыва возвращаюсь к выполнению этого задания (с COM портами вроде разобрался   ) Решил систематизировать эту задачку,т.к. довольно она для меня трудоёмкая, сложная и значимая. Так вот, что нужно: 1. Произвольно ставить невидимую точку; 2. Перемещать курсор (значок *); 3. Генерировать звук определённой частоты; 4. Каждые 4 сек менять положение невидимой точки. План минимум, да и вообще основной - это первые три пункта... 2-ой я реализовал- вроде как перемещаю. Начну с randoma. Уже была дана реализация: 
 Как задать интервал для случайных чисел, минимальное и максимальное значение? Что означает переменная RS (RandSeed) и w? | 
| volvo |  15.05.2009 0:33 
				 Сообщение
					#11				
			 | 
| Гость  | Цитата Как задать интервал для случайных чиселКак обычно: функция генерации случайного числа от 0 до W у тебя есть, вот и напиши еще одну - для генерации числа в интервале A .. B: (Rnd(B - A + 1) + A) даст тебе число в интервале этом интервале. Цитата Что означает переменная RS (RandSeed)Это значение, которое используется для инициализации генератора псевдослучайных чисел. При инициализации одним и тем же числом, получишь одинаковые последовательности ПСЧ. | 
| Rocket |  15.05.2009 15:49 
				 Сообщение
					#12				
			 | 
|  Знаток     Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация:  0    | Как обычно: функция генерации случайного числа от 0 до W у тебя есть, вот и напиши еще одну - для генерации числа в интервале A .. B: (Rnd(B - A + 1) + A) даст тебе число в интервале этом интервале. Это значение, которое используется для инициализации генератора псевдослучайных чисел. При инициализации одним и тем же числом, получишь одинаковые последовательности ПСЧ. Оформил функцию под ассемблер: 
 Вывожу значения с помощью процедуры writeDec. Всё время выводится одно и тоже число: 4298, и оно явно не лежит в интервале от 0 до 80... С чем это связано? Как исправить? | 
| Rocket |  16.05.2009 0:13 
				 Сообщение
					#13				
			 | 
|  Знаток     Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация:  0    | В интернете как-то мало материала по этой теме, так что необходимо разобраться в данной реализации random'а на ассемблере... Что не правильно в реализации Rand в предыдущем сообщении? Пожалуйста подскажите. | 
| Rocket |  18.05.2009 20:29 
				 Сообщение
					#14				
			 | 
|  Знаток     Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация:  0    | Что-то вопрос о random'е намертво забуксовал... Перейду к другой части задачи: генерация звука определенной частоты. Вот программы, в которой я передвигаю курсор, а его движение сопровождается нотой до (я эту ноту могу часами держать(с) )  
 Как сделать "пиканье"? то есть, что бы звук включался и отключался в определенные моменты, а так же ускорялся, либо замедлялся | 
| volvo |  22.05.2009 12:16 
				 Сообщение
					#15				
			 | 
| Гость  | Цитата Что-то вопрос о random'е намертво забуксовал...Ничего не забуксовало... Просто до ассемблера надо еще добраться... Вот тут есть пример работающего Random-а, только что проверил: Random Values (см. последнюю вставку кода, вызывать - так: start: ) | 
| volvo |  22.05.2009 14:44 
				 Сообщение
					#16				
			 | 
| Гость  | Цитата Как сделать "пиканье"? то есть, что бы звук включался и отключался в определенные моментыВероятно, в те моменты, когда звук не нужен, его надо отключать, используя NoSound, который ты написал, а зачем - непонятно... Цитата а так же ускорялся, либо замедлялсяКто "ускорялся" или "замедлялся"? Звук? Он не может замедляться и ускоряться. Он может только быть или нет. Может быть, тебе надо более высокие звуки при приближении к цели? Или просто уменьшить интервалы между выключением звука и его следующим включением... | 
| Rocket |  22.05.2009 15:36 
				 Сообщение
					#17				
			 | 
|  Знаток     Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация:  0    | Вероятно, в те моменты, когда звук не нужен, его надо отключать, используя NoSound, который ты написал, а зачем - непонятно... Кто "ускорялся" или "замедлялся"? Звук? Он не может замедляться и ускоряться. Он может только быть или нет. Может быть, тебе надо более высокие звуки при приближении к цели? Или просто уменьшить интервалы между выключением звука и его следующим включением... Да, мне нужно уменьшать или увеличивать интервалы между включением\отключением звука. Делать это нужно через программирование таймера? Ещё есть варианты? | 
| volvo |  22.05.2009 15:58 
				 Сообщение
					#18				
			 | 
| Гость  | Цитата Ещё есть варианты?Сомневаюсь... Какие ж варианты еще? А что не нравится с программированием таймера? | 
| Rocket |  22.05.2009 16:06 
				 Сообщение
					#19				
			 | 
|  Знаток     Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация:  0    | |
| volvo |  22.05.2009 16:23 
				 Сообщение
					#20				
			 | 
| Гость  | Очень просто... Вот тут есть пример практически того, что тебе надо: Accelerating the Clock | 
|   | 
|   | Текстовая версия | 31.10.2025 10:56 |