Lezione del 30/4/2014¶
Classe plot ascii
File plot_ascii.rb
1PX_ON = '*'
2PX_OFF = ' '
3
4class PlotAscii
5
6 attr_reader :nrow, :ncol
7
8 # Inizializza il plot ascii, con spazi bianchi
9 def initialize(n_righe, n_colonne)
10 @nrow = n_righe
11 @ncol = n_colonne
12 @righe = Array.new(n_righe)
13 @righe.collect!{|r| PX_OFF*n_colonne}
14 end
15
16 # cancello schermo
17 def clean
18 @righe.collect! { PX_OFF*@ncol }
19 end
20
21 # accendere un pixel x = colonna, y = riga
22 def pixel_on(x, y)
23 @righe[y][x] = PX_ON if x >=0 and x < @ncol and y >= 0 and y < @nrow
24 end
25
26 def pixel_off(x,y)
27 @righe[y][x] = PX_OFF if x >=0 and x < @ncol and y >= 0 and y < @nrow
28 end
29
30 def pixel_reverse(x,y)
31 if x >=0 and x < @ncol and y >= 0 and y < @nrow then
32 @righe[y][x] = @righe[y][x] == PX_ON ? PX_OFF : PX_ON
33 end
34 end
35
36 def pixel?(x,y)
37 if x >=0 and x < @ncol and y >= 0 and y < @nrow then
38 return true if @righe[y][x] == PX_ON
39 end
40 return false
41 end
42
43 def print
44 puts "+"+("-"*@ncol)+"+"
45 @righe.reverse.each{|line| puts "|"+line+"|" }
46 puts "+"+("-"*@ncol)+"+"
47 end
48
49 def copy( scr )
50 for i in 0...@ncol do
51 for j in 0...@nrow do
52 if scr.pixel?(i,j) then
53 pixel_on(i,j)
54 else
55 pixel_off(i,j)
56 end
57 end
58 end
59 end
60
61 def reverse
62 for i in 0...@ncol do
63 for j in 0...@nrow do
64 pixel_reverse(i,j)
65 end
66 end
67 end
68end
69
70#pl = PlotAscii.new(24, 80)
71#pl.pixel_on(10,30)
72#pl.pixel_on(23,11)
73#pl.print
Gioco vita di Convey
File vita.rb
1load 'plot_ascii.rb'
2
3#
4# inizializzo 2 istanze della classe PlotAscii
5#
6scr1 = PlotAscii.new( 24, 80 );
7scr2 = PlotAscii.new( 24, 80 );
8
9# inizializazione della popolazione iniziale
10# con max 300 "abitanti"
11(0..400).each do
12 j = Random.rand(24)
13 i = Random.rand(80)
14 scr1.pixel_on(i,j)
15end
16
17# loop
18for k in 0..100 do
19 # stampa
20 puts "Popolazione N. #{k}"
21 scr1.print
22
23 # aggiorna schermo
24 for j in 0...scr1.nrow do
25 for i in 0...scr1.ncol do
26 # conto i primi vicini "vivi"
27 nlive = 0
28 nlive += 1 if scr1.pixel?(i+1,j-1)
29 nlive += 1 if scr1.pixel?(i+1,j)
30 nlive += 1 if scr1.pixel?(i+1,j+1)
31
32 nlive += 1 if scr1.pixel?(i,j-1)
33 nlive += 1 if scr1.pixel?(i,j+1)
34
35 nlive += 1 if scr1.pixel?(i-1,j-1)
36 nlive += 1 if scr1.pixel?(i-1,j)
37 nlive += 1 if scr1.pixel?(i-1,j+1)
38
39 # logica di Convey vivo/morto
40 if scr1.pixel?(i,j) then
41 if nlive == 2 or nlive == 3 then
42 scr2.pixel_off(i,j)
43 else
44 scr2.pixel_on(i,j)
45 end
46 else
47 if nlive == 3 then
48 scr2.pixel_on(i,j)
49 else
50 scr2.pixel_off(i,j)
51 end
52 end
53 end
54 end
55
56 # copio la schermata di scr2 in scr1
57 scr1.copy(scr2) ;
58
59 # aspetta un "return" da tastiera
60 gets
61end
62
63puts "FINE!"