使用Ruby动画shell输出

时间:2016-02-12 11:43:56

标签: ruby shell

我已经实施了生命游戏

我无法解决的是如何打印shell中单元格数组的每次迭代。我想让输出显示为动画。

这是我的阵列打印代码

def print_board board
  wipe_screen
  board.each_with_index do |row,y|
    row.each_with_index do |cell,x|
      print cell == 1 ? '*' : ' '
    end
    print "\n"
  end
end

这是wipe_screen方法:

def wipe_screen
  Board_Height.each do |_|
    # print "\r"
    # $stdout.write "\e[A\e[2K"
  end
end

你可以在注释掉的位中看到我已经尝试过的东西。

如何在shell中实现动画输出?

编辑:

请允许我用一个例子来澄清。

它只是打印出生命游戏周期的每次迭代):

*  *     * * ** ** 
*** * **  * *  * **
** **** * *  **** * 
** *   **  * **  ** 
*   *  **  *  ***** 
*****  *  **** *   
*****  * * ** *   * 
* ** *** * **   ****
* **  * ** ***** * 
** *  *   * *****   
*            **  * 
**  ****     *** * 
   *** *     *** * 
   *  **     ***** 
      **     ***** 
      **       *   
       **      ****
        **    * * *
     ****   * *****
     *      ****   
*            **  * 
*   ****     *** * 
   *** *     *** * 
      **     ***** 
      **       *** 
      **       *** 
       ***     * **
       * *     ****
     *****  ** ****
     *      ****   
*            **  * 
    ****     *** * 
    ** *     *** * 
      **       *** 
      **       *** 
      **       *** 
       ***     * **
       * *       **
     *****  ***  **
     *      ****   
             **  * 
    ****     *** * 
    ** *       * * 
      **       *** 
      **       *** 
      **       *** 
       ***     ** *
       * *        *
     *****  ****  *
     *      ****   

而我想要的是:

*  *     * * ** ** 
*** * **  * *  * **
** **** * *  **** * 
** *   **  * **  ** 
*   *  **  *  ***** 
*****  *  **** *   
*****  * * ** *   * 
* ** *** * **   ****
* **  * ** ***** * 
** *  *   * ***** 

然后,当它迭代生命周期的游戏时,取而代之的是:

  *      ****   
          **  * 
  ****     *** * 
  ** *       * * 
   **       *** 
   **       *** 
   **       *** 
    ***     ** *
    * *        *
  *****  ****  *
  *      ****  

编辑:

生命游戏gist

1 个答案:

答案 0 :(得分:2)

对于动画效果,请勿擦除屏幕,而是将光标返回原位。至少在bash和tcsh中,你可以用

来实现
print "\033[0;0H]"

然后继续并覆盖更新的单元格内容。 使用页面末尾的STDOUT.flush清空输出缓冲区。