首页 > 代码库 > [Win32::Console]Perl终端版生命游戏
[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 ...............**......................
[Win32::Console]Perl终端版生命游戏
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。