Игра Simon (HP 50g, 49, 48)
Игра Simon тренирует память путем запоминания нот мелодии или соответствующего им расположения кнопок. Последний вариант пригоден не только для лишенных музыкального восприятия, но и для людей с нарушениями слуха.
Если ваш программируемый калькулятор обладает встроенным динамиком, как, например, ПМК серии HP 48/49/50, то портативный вариант Simon вполне может заменить программа.
Хотя игре уже более 30 лет, но она до сих пор производится в разных вариантах: от настольных до карманных.
Фото настольного варианта игрушки из википедии (© 2005 Larry D. Moore)
Правила совсем несложные. После запуска программы калькулятор начинает "придумывать" мелодию, пользуясь всего четырьмя нотами и упорядоченным образом расположенными кнопками. За каждый ход к мелодии добавляется одна нота и соответствующая ей кнопка. Задача игрока - пользуясь кнопками, воспроизводить мелодию с самого начала на каждом новом шаге. Счетчик правильных повторений выводится в центре.
При ошибке программа предлагает начать новую игру или завершить. Также игру можно прервать на любом шаге клавишами "Q" или "F2", а переиграть - "R" или "F6".
Программистам, использующим звуковые эффекты, может быть интересна таблица соответствия частот музыкальным нотам, составленная авторами французской википедии. Автор был немало удивлен, не обнаружив столь полезную информацию в русском варианте статьи, где половина текста посвящена религиозной версии происхождения нотной записи. Но цифры понятны всем, поэтому чтение таблицы французской редакции не должно составить труда.
Программа получилась очень компактной: несмотря на сервисный блок и заставки, сам код занимает порядка 100 байт, а остальные 5 Кб ушли под графику.
О принципах показа графики в программах на UserRPL мы уже знаем на примере разработки динамического симулятора лунолета. Они использованы и здесь. Для редактирования растровой графики большую помощь оказал редактор Calculator Picture Editor, работающий не только с форматами ПМК HP 50/49/48, но и серией TI-8x, а также с обычными bitmap.
Видео, демонстрирующее игру.
Исходный текст программы.
«
PUSH
DEG
@ Const
GROB 64 64 0000008FF1000000000008FFFF10000000000FFFFFF000000000CF700EF300000000F70000EF0000000CF000000F3000000E3000000C7000000F10000008F000008700000000E10000C300000000C70000E100000000870000F300000000CF0008F700000000EF100CBF00000000FD300E1F10000008F8700E0E3000000C70700F0C7000000E30F00708F000000F10E08300F100008F00C18300E30000C700C1C100C70C30E30083C1008F8FF1F10083C1000FFFFFF00083E0000EF3CF700007E0000C700E300007E0000C300C300007E0000C100830000770000E000070000E70000E000070000E70000F0000F0000E7000070000E0000E7000070000E0000E7000070000E0000E7000070000E0000E70000F0000F0000E70000E000070000E70000E000070000EE0000C1008300007E0000C300C300007E0000C700E300007E0000EF3CF700007C1000FFFFFF00083C1008F8FF1F10083C100C70C30E300838300E30000C700C18300F100008F00C10708F000000F10E00F0C7000000E30F00E0E3000000C70700E1F10000008F8700CBF00000000FD3008F700000000EF1000F300000000CF0000E100000000870000E300000000C300008700000000E100000F10000008F000000E3000000C7000000CF000000F30000000F70000EF00000000CF700EF3000000000FFFFFF00000000008FFFF1000000000008FF1000000
'picbase' STO
GROB 64 64 0000008FF1000000000008FFFF10000000000FFFFFF000000000CF700EF300000000F78FF1EF0000000CF8FFFF1F3000000E3FFFFFFC7000000FDFF7EFFBF0000087EFF7EFF7E10000CBFFFBDFFFD70000EDFFFBDFFFB70000FBFFFDBFFFDF0008F7FFFEBFFFEF100CBFEFFE7FF7FD300E1FDF7FFEFBF8700E0EBF7FFEFD70700F0C7F300CFE30F00708FEFFFF7F10E08300FDFFFFBF00C18300EBF3CFD700C1C100C77C3EE30083C1008F8FF1F10083C1000FFFFFF00083E0000EF3CF700007E0000C700E300007E0000C300C300007E0000C100830000770000E000070000E70000E000070000E70000F0000F0000E7000070000E0000E7000070000E0000E7000070000E0000E7000070000E0000E70000F0000F0000E70000E000070000E70000E000070000EE0000C1008300007E0000C300C300007E0000C700E300007E0000EF3CF700007C1000FFFFFF00083C1008F8FF1F10083C100C70C30E300838300E30000C700C18300F100008F00C10708F000000F10E00F0C7000000E30F00E0E3000000C70700E1F10000008F8700CBF00000000FD3008F700000000EF1000F300000000CF0000E100000000870000E300000000C300008700000000E100000F10000008F000000E3000000C7000000CF000000F30000000F70000EF00000000CF700EF3000000000FFFFFF00000000008FFFF1000000000008FF1000000
GROB 64 64 0000008FF1000000000008FFFF10000000000FFFFFF000000000CF700EF300000000F70000EF0000000CF000000F3000000E3000000C7000000F10000008F000008700000000E10000C300000000C70000E100000000870000F300000000CF0008F700000000EF100CBF00000000FD300E1F10000008FA700E0E3000000C77700F0C7000000EB7F00708F000000FDFE08300F100008FEFD18300E30000C7FFD1C100C70C30EBFFB3C1008F8FF1FDFFB3C1000FFFFFFEFFB3E0000EF3CF7FFF77E0000C700EBFFF77E0000C300CBFFF77E0000C1008B7FF7770000E000077CFFE70000E0000773FFE70000F0000F6FEFE7000070000E6F9FE7000070000E6F7EE7000070000E6F7EE7000070000E6F9FE70000F0000F67EFE70000E000077BFFE70000E000077CFFEE0000C1008B7FF77E0000C300CBFFF77E0000C700EBFFF77E0000EF3CF7FFF77C1000FFFFFFEFFB3C1008F8FF1FDFFB3C100C70C30EBFFB38300E30000C7FFD18300F100008FEFD10708F000000FDFE00F0C7000000EB7F00E0E3000000C77700E1F10000008FA700CBF00000000F53008F700000000EB1000F300000000CF0000E100000000870000E300000000C300008700000000E100000F10000008F000000E3000000C7000000CF000000F30000000F70000EF00000000CF700EF3000000000FFFFFF00000000008FFFF1000000000008FF1000000
GROB 64 64 0000008FF1000000000008FFFF10000000000FFFFFF000000000CF700EF300000000F70000EF0000000CF000000F3000000E3000000C7000000F10000008F000008700000000E10000C300000000C70000E100000000870000F300000000CF0008F700000000EF100CBF00000000FD300E1F10000008F8700E0E3000000C70700F0C7000000E30F00708F000000F10E08300F100008F00C18300E30000C700C1C100C70C30E30083C1008F8FF1F10083C1000FFFFFF00083E0000EF3CF700007E0000C700E300007E0000C300C300007E0000C100830000770000E000070000E70000E000070000E70000F0000F0000E7000070000E0000E7000070000E0000E7000070000E0000E7000070000E0000E70000F0000F0000E70000E000070000E70000E000070000EE0000C1008300007E0000C300C300007E0000C700E300007E0000EF3CF700007C1000FFFFFF00083C1008F8FF1F10083C100C77C3EE300838300EBF3CFD700C18300FDFFFFBF00C10708FEFFFF7F10E00F0C7F300CFE30F00E0EBF7FFEFD70700E1FDF7FFEFBF8700CBFEFFE7FF7FD3008F7FFFEBFFFEF1000FBFFFDBFFFDF0000EDFFFBDFFFB70000EBFFFBDFFFD3000087EFF7EFF7E100000FDFF7EFFBF000000E3FFFFFFC7000000CF8FFFF1F30000000F78FF1EF00000000CF700EF3000000000FFFFFF00000000008FFFF1000000000008FF1000000
GROB 64 64 0000008FF1000000000008FFFF10000000000FFFFFF000000000CF700EF300000000F70000EF0000000CF000000F3000000E3000000C7000000F10000008F000008700000000E10000C300000000C70000E100000000870000F300000000CF0008F700000000EF100CBF00000000FD300E5F10000008F8700EEE3000000C70700FED7000000E30F007FBF000000F10E08BF7F100008F00C18BFFE30000C700C1CDFFD70C30E30083CDFFBF8FF1F10083CDFF7FFFFFF00083EEFFFEF3CF700007EEFFFD700E300007EEFFFD300C300007EEFFED10083000077FF3EE000070000E7FFCEE000070000E7F7F6F0000F0000E7F9F670000E0000E77EF670000E0000E77EF670000E0000E7F9F670000E0000E7F7E6F0000F0000E7FFDEE000070000E7FF3EE000070000EEEFFED1008300007EEFFFD300C300007EEFFFD700E300007EEFFFEF3CF700007CDFF7FFFFFF00083CDFFBF8FF1F10083CDFFD70C30E300838BFFE30000C700C18BF7F100008F00C107FBF000000F10E00FED7000000E30F00EEE3000000C70700E5F10000008F8700CBF00000000FD3008F700000000EF1000F300000000CF0000E100000000870000E300000000C300008700000000E100000F10000008F000000E3000000C7000000CF000000F30000000F70000EF00000000CF700EF3000000000FFFFFF00000000008FFFF1000000000008FF1000000
4 \->LIST 'pics' STO
@{130.81, 146.83, 164.81, 174.61} 'freq' STO
{261.63, 293.66, 329.63, 349.23} 'freq' STO
0.5 'delay' STO
0 'debugmode' STO
«
CLLCD
{ {} {} {} {} {} {"Next" « » } } TMENU
"Simon game" 1 DISP
FONT\->
FONT6 \->FONT
"v.1.0" 3 DISP
"(c)1978 Milton Bradley" 5 DISP
"(c)2013" 6 DISP
" Serguei TARASSOV" 7 DISP
" pmk.arbinada.com" 8 DISP
" [email protected]" 9 DISP
"This software is" 10 DISP
"under GNU GPL" 11 DISP
\->FONT
-1 WAIT DROP
CLLCD
"Keyboard shortcuts" 1 DISP
FONT\->
FONT7 \->FONT
"Q or F2: Quit" 3 DISP
"F6: Restart game" 4 DISP
"Arrows: replay melody" 5 DISP
\->FONT
-1 WAIT DROP
» 'ShowHelp' STO
@ Global vars
«
0 'reprod' STO @ Number of reproduced notes
{} 'melody' STO
{} 'answer' STO
» 'InitVars' STO
« @ Pie number is on stack
{#32d #0d}
\-> pienum p0
«
PICT p0 pics pienum GET GOR
freq pienum GET delay BEEP
delay 2 / WAIT
reprod answer SIZE MAX 'reprod' STO
PICT p0 picbase REPL
PICT IF reprod 10 < THEN {#62d #28d} ELSE {#60d #28d} END
reprod R\->I 3 \->GROB REPL
IF debugmode 1 ==
THEN
{#0d #10d} melody 1 ShowText
{#0d #20d} answer 1 ShowText
END
»
» 'ShowAndPlayNote' STO
«
RAND 4 * 1 + IP melody OBJ\-> 1 + \->LIST 'melody' STO
» 'AddNote' STO
« @ Answer (pie number) is on the stack
DUP answer OBJ\-> 1 + \->LIST 'answer' STO
IF DUP IP melody DUP SIZE answer SIZE - 1 + GET IP ==
THEN
ShowAndPlayNote
ELSE
DROP
IF "Reproduced: " reprod R\->I \->STR +
{{"Replay?" 1}} 1 CHOOSE
THEN
DROP
InitVars
ERASE {#0d #0d} PVIEW
ELSE
1 'tostop' STO
END
END
» 'AddAnswer' STO
«
melody OBJ\-> DROP
WHILE DEPTH 0 >
REPEAT
ShowAndPlayNote
END
» 'Replay' STO
«
\->GROB PICT UNROT REPL
» 'ShowText' STO
InitVars
IF debugmode 0 == THEN ShowHelp END
0 131 XRNG
0 64 YRNG
ERASE
{#0d #0d} PVIEW
DO
CLEAR
0 'tostop' STO
IF melody SIZE answer SIZE ==
THEN
{} 'answer' STO
AddNote
1 WAIT
Replay
ELSE
WHILE KEY
REPEAT
\-> k
«
CASE
k 25 == THEN 1 AddAnswer END
k 34 == k 24 == OR THEN 4 AddAnswer END
k 35 == THEN 3 AddAnswer END
k 36 == k 26 == OR THEN 2 AddAnswer END
k 12 == k 51 == OR THEN 1 'tostop' STO END
k 16 == k 52 == OR THEN InitVars ERASE END
END
»
END
END
UNTIL
tostop 1 ==
END
{ 'debugmode',
'delay', 'freq',
'answer', 'melody', 'reprod',
'picbase', 'pics',
'tostop',
'AddNote', 'AddAnswer',
'InitVars',
'Replay',
'ShowAndPlayNote',
'ShowHelp',
'ShowKeys',
'ShowText'
} PURGE
POP
»
blog comments powered by Disqus