[Win32::Console]Perl终端版生命游戏

环境,WinXP/Win7  Perl 5.16

默认循环1000次,按ESC提前退出

  1 use strict;
  2 use Term::ReadKey;
  3 use Win32::Console;
  4 use Time::HiRes ‘sleep‘;
  5 use IO::Handle;
  6 STDOUT->autoflush(1);
  7 system("mode con lines=40 cols=100");
  8
  9 our $OUT=Win32::Console->new(STD_OUTPUT_HANDLE);
 10 $OUT->Cursor(20, 20, 99, 0);  #hide cursor
 11
 12 my ($i, $j);
 13 our ($rows, $cols) = (40, 40);
 14 our ($mxrow, $mxcol) = ($rows-1, $cols-1);
 15
 16 # init
 17 our @coord;
 18 my (@h, @n);
 19 my $y = 0;
 20
 21 foreach (<DATA>) {
 22     s/\r?\n$//;
 23     tr/\*\./10/;
 24     @{$h[$y++]} = ( split("", $_) );
 25 }
 26
 27 foreach $i (0 .. $mxrow) {
 28     foreach $j (0 .. $mxcol) {
 29         $coord[$i][$j]{‘x‘} = $j*2;
 30         $coord[$i][$j]{‘y‘} = $i;
 31         $h[$i][$j] = 0 unless (defined $h[$i][$j]);
 32         $n[$i][$j] = 0;
 33     }
 34 }
 35
 36 &Draw(\@n, \@h);
 37 foreach (0..1000) {
 38     sleep 0.05;
 39     @n = ();
 40     &NextBuffer(\@h, \@n);
 41     &Draw(\@h, \@n);
 42     @h = (@n);
 43
 44     &KeyFunc();
 45 }
 46
 47 sub NextBuffer {
 48     my ($ra, $rb) = (shift, shift);
 49     my ($i, $j, $sum);
 50     my ($L, $R, $U, $D);
 51     foreach $i (0 .. $mxrow) {
 52         $U = ($i-1) < 0 ? $mxrow : ($i-1);
 53         $D = ($i+1) > $mxrow ? 0 : ($i+1);
 54         foreach $j (0 .. $mxcol) {
 55             $L = ($j-1) < 0 ? $mxcol : ($j-1);
 56             $R = ($j+1) > $mxcol ? 0 : ($j+1);
 57             $sum = $ra->[$U][$L] + $ra->[$U][$j] + $ra->[$U][$R] +
 58                    $ra->[$i][$L] +        0      + $ra->[$i][$R] +
 59                    $ra->[$D][$L] + $ra->[$D][$j] + $ra->[$D][$R];
 60
 61             if ($sum == 3) {
 62                 $rb->[$i][$j] = 1;
 63             } elsif ($sum == 2) {
 64                 $rb->[$i][$j] = $ra->[$i][$j];
 65             } else {
 66                 $rb->[$i][$j] = 0;
 67             }
 68         }
 69     }
 70 }
 71
 72 sub Draw {
 73     my ($ra, $rb) = (shift, shift);
 74     foreach $i (0 .. $mxrow) {
 75         foreach $j (0 .. $mxcol) {
 76             if ($rb->[$i][$j] != $ra->[$i][$j]) {
 77                 &Point(
 78                     $coord[$i][$j]{‘x‘},
 79                     $coord[$i][$j]{‘y‘},
 80                     $rb->[$i][$j],
 81                 );
 82             }
 83         }
 84     }
 85 }
 86
 87 sub Point {
 88     my ($mx, $my, $light) = (shift, shift, shift);
 89     my $color;
 90     if ($light == 1) {
 91         $color = $FG_WHITE|$BG_GRAY;
 92     } else {
 93         $color = $FG_WHITE|$BG_BLACK;
 94     }
 95     $OUT->Cursor($mx, $my);
 96     $OUT->FillAttr($color, 2, $mx, $my);
 97 }
 98
 99 sub KeyFunc {
100     my $key;
101     $key = ReadKey(-1);
102     return if (not defined $key);
103     if ( ord($key) == 27 ) {
104         exit;
105     }
106 }
107
108
109 __DATA__
110 ......................**...............
111 ......................**...............
112 .......................................
113 .......................................
114 .......................................
115 .......................................
116 .......................................
117 .......................................
118 .......................................
119 .......................................
120 .......................................
121 .......................................
122 .........*..........**...**............
123 .......*.*............***..............
124 ......*.*............*...*.............
125 **...*..*.............*.*..............
126 **....*.*..............*...............
127 .......*.*......*.*....................
128 .........*......**.....................
129 .................*...*.................
130 .....................**......*.........
131 ....................*.*......*.*.......
132 ...............*..............*.*....**
133 ..............*.*.............*..*...**
134 .............*...*............*.*......
135 ..............***............*.*.......
136 ............**...**..........*.........
137 .......................................
138 .......................................
139 .......................................
140 .......................................
141 .......................................
142 .......................................
143 .......................................
144 .......................................
145 .......................................
146 .......................................
147 ...............**......................
148 ...............**......................
时间: 2024-08-02 13:01:28

[Win32::Console]Perl终端版生命游戏的相关文章

学习python:实例3.终端版拼图游戏

代码: # 拼图 from sys import exit from random import shuffle # 游戏胜利 def victory():     print(''' * * * * * * 6 6 6 * *victory* * !!!!! * * * * * *''') # 定义 main def main():     boxs = [' ','1','2','3','4','5','6','7','8']     shuffle(boxs)     while True

日式横版射击游戏《天蓝色ElexiaJ》的资源解包

----------------------------------------------------------------------- !!警告!! 游戏资源所有权,归游戏开发商所有: 以下解包算法仅供学习交流,请勿用于商业与非法用途: 由此产生的一切后果,与博主(我)无关: ----------------------------------------------------------------------- 废话不多说,游戏的封包以 pack 为后缀名,内存布局很简单,首先是一

关于康威生命游戏的学习

 康威生命游戏,又称康威生命棋,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机.它最初于1970年10月在<科学美国人>杂志上马丁·葛登能的"数学游戏"专栏出现. 一个偶然机会发现了这个美妙的生命游戏.于是开始写程序来实现它,其实实现是很简单的,我现在还只能做到这个而已,不过还会继续深究下去的.先用Random来生成随机数,这样就可以在初始的时候在随机位置设定生死细胞了.输出的时候用2个for循环就是了.昨天做的时候遇到的问题是不知道最后该怎么判断了,因为判断

全网独家V25.6版H5游戏 接龙 扫雷 多雷 禁抢 微信登录封装APP赢率智能控制

全网独家V25.6A版H5游戏.牛牛 .接龙. 扫雷. 多雷禁抢. PC.蛋蛋. 微信登录封装APP.赢率智能控制 2018全新源码内核升级打造.更换域名后台简单配置便可,不需要重启和懂技术. 声明:所有代码仅限自我娱乐和学习,禁止用于非法应用,责任自负,本站无关联责任. 我们从不泄露买家隐私,从不监控买家数据和资金充值.流动,更不会将这些数据用于商业用途和推广忽悠.一切为了您的系统安全,防止不必要的风险. 2018-04-16升级日志 1.内置自助提现接口(需要根据要求申请接口秘钥) 2.完善

简易2D横版RPG游戏制作

Unity学习笔记1 简易2D横版RPG游戏制作 http://m.blog.csdn.net/article/details?id=24601905

【转载】【元胞自动机】生命游戏(时间简史)

原帖:http://www.cnblogs.com/lvpengms/archive/2010/02/08/1666095.html 晚上闲着没事干,鉴于前一段时间数学建模中看到了生命游戏 Game of Life,所以用C++实现一下,效果还不错. 本程序是用vs2005 C++编写,有意想要程序和源码的朋友可以给我发邮件. 更新:程序源码可以从这个地址下载:下载元胞自动机源码及程序 =======================================================

生命游戏和随机数之间某种不可言说的秘密

为什么我感觉随便写一个一维生命游戏规则就可以做出一个看起来很随机实际上也蛮随机的随机数生成器.... 这是代码: 1 #include <cstdio> 2 #include <fstream> 3 #include <iostream> 4 5 #include <cstdlib> 6 #include <cstring> 7 #include <algorithm> 8 #include <cmath> 9 10 #i

元胞自动机+生命游戏

元胞自动机 元胞自动机(Cellular Automaton,复数为Cellular Automata,简称CA,也有人译为细胞自动机.点格自动机.分子自动机或单元自动机).是一时间和空间都离散的动力系统.散布在规则格网 (Lattice Grid)中的每一元胞(Cell)取有限的离散状态,遵循同样的作用规则,依据确定的局部规则作同步更新.大量元胞通过简单的相互作用而构成动态系统的演化. 不同于一般的动力学模型,元胞自动机不是由严格定义的物理方程或函数确定,而是用一系列模型构造的规则构成.凡是满

游戏开发(三)——WIN32 黑白棋(三)——游戏画面的现实

整个游戏分3部分介绍. 1.棋局的现实 2.AI的现实 3.游戏画面的现实 提供一下完整项目下载 这是第三部分:画面的显示 这部分其实就比较简单的,说白了就是api的堆砌. 主要了解下windows的消息机制,以及怎么画图 主要是分别封装了下对棋盘,棋子,以及当前轮到谁,当前比分是多少,就是游戏画面上不同的部分的绘制. void DrawReversiBoard(); void DrawReversiPieces(EnumReversiPiecesType type, int row_y, in