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

descrizione

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!"