Игра Simon (HP 50g, 49, 48)

| рубрика «Программы» | автор st
Метки: , ,

Игра 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
    "  st@arbinada.com" 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
»