6 my $life_cell_pixel_size = 5 ;
\r
7 my $life_cells_per_col = 20 ;
\r
8 my $life_cells_per_row = 20;
\r
13 # Init the life data
\r
17 foreach my $i (0..$life_cells_per_row-1) {
\r
18 foreach my $j (0..$life_cells_per_col-1) {
\r
19 $life_data[$i][$j] = int(rand(2));
\r
23 sub count_neighbors {
\r
28 foreach my $q ( ($i-1)..($i+1)) {
\r
29 foreach my $w ( ($j-1)..($j+1)) {
\r
30 if ( ($q>=0) && ($q<$life_cells_per_row) &&
\r
31 ($w>=0) && ($w<$life_cells_per_col) &&
\r
32 (($q!=$i) || ($w!=$j))
\r
34 if ($life_data[$q][$w]==1) {
\r
44 my $s = new VNC::Server( Port=>2,
\r
46 Caption=>'Game of VNCLife',
\r
47 Width => $life_cell_pixel_size * $life_cells_per_row,
\r
48 Height => $life_cell_pixel_size * $life_cells_per_col,
\r
49 IdleHandler => \&next_turn,
\r
50 KeyEventHandler => \&keyboard,
\r
51 PointerEventHandler => \&pointer,
\r
52 UpdateDisplayHandler => \&updater
\r
55 $s->vnc_server_loop;
\r
58 my ($vnc, $down, $key) = @_ ;
\r
60 #act only on key released
\r
64 if ($key==ord('R') || $key==ord('r')) {
\r
65 foreach my $i (0..$life_cells_per_row-1) {
\r
66 foreach my $j (0..$life_cells_per_col-1) {
\r
67 $life_data[$i][$j] = int(rand(2));
\r
70 $s->update_all_displays;
\r
74 if ($key==ord('C') || $key==ord('c')) {
\r
75 foreach my $i (0..$life_cells_per_row-1) {
\r
76 foreach my $j (0..$life_cells_per_col-1) {
\r
77 $life_data[$i][$j] = 0;
\r
80 $s->update_all_displays;
\r
84 if ($key==ord('Q') || $key==ord('q')) {
\r
89 if ($key==ord('S') || $key==ord('s')) {
\r
94 print "Starting!\n";
\r
102 my ($vnc,$mask,$x,$y) = @_ ;
\r
105 my $i = $x / $life_cell_pixel_size ;
\r
106 my $j = $y / $life_cell_pixel_size ;
\r
108 $life_data[$i][$j] = ($mask==1) ? 1 : 0 ;
\r
110 $s->update_all_displays;
\r
116 my ($vnc, $inc, $x,$y,$w,$h) = @_ ;
\r
117 my $codec = $vnc->{CODEC};
\r
120 my $red_pixel = $codec->encode_pixel(255,0,0);
\r
121 my $white_pixel = $codec->encode_pixel(255,255,255);
\r
123 foreach my $i (0..$life_cells_per_row-1) {
\r
124 foreach my $j (0..$life_cells_per_col-1) {
\r
125 if ($life_data[$i][$j]==1) {
\r
126 push @rects, $codec->encode_rre_subrect( $red_pixel ,$i*$life_cell_pixel_size, $j*$life_cell_pixel_size,$life_cell_pixel_size,$life_cell_pixel_size);
\r
130 my $data = $codec->encode_framebuffer_update( $codec->encode_rre($white_pixel, $x,$y,$w,$h, @rects));
\r
136 #not running, exit immediately
\r
137 return unless ($running);
\r
139 #calculate the next life phase
\r
142 foreach my $i (0..$life_cells_per_row-1) {
\r
143 foreach my $j (0..$life_cells_per_col-1) {
\r
144 $new_life_data[$i][$j] = 0;
\r
148 foreach my $i (0..$life_cells_per_row-1) {
\r
149 foreach my $j (0..$life_cells_per_col-1) {
\r
150 my $current = $life_data[$i][$j];
\r
151 my $count = count_neighbors($i,$j);
\r
154 if ($count<2 || $count>3) {
\r
155 $new_life_data[$i][$j] = 0 ;
\r
157 $new_life_data[$i][$j] = 1 ;
\r
161 $new_life_data[$i][$j] = 1 ;
\r
163 $new_life_data[$i][$j] = 0 ;
\r
168 @life_data = @new_life_data;
\r
170 $s->update_all_displays;
\r