设为首页 收藏本站
查看: 2267|回复: 0

[经验分享] [Win32::Console]Perl终端版生命游戏

[复制链接]
累计签到:21 天
连续签到:1 天
发表于 2015-12-27 09:04:19 | 显示全部楼层 |阅读模式
  环境,WinXP/Win7  Perl 5.16
  默认循环1000次,按ESC提前退出
  
DSC0000.jpg
  



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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-156810-1-1.html 上篇帖子: perl面对对象编程实例1 下篇帖子: Perl Summary from Camel Book
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表