• [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/
    ?
    $//;
     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 ...............**......................
  • 相关阅读:
    OpenACC 数据管理语句
    OpenACC 简单的直方图
    OpenACC 书上的范例代码(Jacobi 迭代),part 2
    OpenACC 书上的范例代码(Jacobi 迭代),part 1
    OpenACC parallel
    OpenCL 归约 1
    OpenCL 双调排序 GPU 版
    OpenCL 双调排序 CPU 版
    OpenCL 图像卷积 3 使用 CPU
    中括号记法
  • 原文地址:https://www.cnblogs.com/paktc/p/3986229.html
Copyright © 2020-2023  润新知