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

 环境,WinXP/Win7  Perl 5.16

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

 

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

 

  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 ...............**......................

 

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

上一篇:教你如何用PS快速打造专题气氛的堆叠投影文字效果


下一篇:很实用的HTML5+CSS3注册登录窗体切换效果