init
						commit
						e18dbf8455
					
				| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
dragonruby-macos
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
3.1.2
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,5 @@
 | 
			
		|||
## Sample of Conways life
 | 
			
		||||
 | 
			
		||||
copy main.rb to dragonruby and run it
 | 
			
		||||
 | 
			
		||||
absolute just got it running version
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,159 @@
 | 
			
		|||
class Game
 | 
			
		||||
  attr_reader :map, :round
 | 
			
		||||
 | 
			
		||||
  def initialize(max_x,max_y,input)
 | 
			
		||||
    @map = []
 | 
			
		||||
    @max_x = max_x
 | 
			
		||||
    @max_y = max_y
 | 
			
		||||
    @round = 0
 | 
			
		||||
 | 
			
		||||
    max_x.times do |i|
 | 
			
		||||
      col = []
 | 
			
		||||
      max_y.times do |j|
 | 
			
		||||
        if input.include? [i,j]
 | 
			
		||||
          col << 1
 | 
			
		||||
        else
 | 
			
		||||
          col << 0
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
      map << col
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def tick
 | 
			
		||||
    @round += 1
 | 
			
		||||
    calculate
 | 
			
		||||
 | 
			
		||||
    return map
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  private
 | 
			
		||||
 | 
			
		||||
  attr_reader :max_x, :max_y
 | 
			
		||||
 | 
			
		||||
  def calculate
 | 
			
		||||
    new_map = []
 | 
			
		||||
    max_x.times do |x|
 | 
			
		||||
      col = []
 | 
			
		||||
      max_y.times do |y|
 | 
			
		||||
        new_cell_value = check_cell(x,y,map)
 | 
			
		||||
        col << new_cell_value
 | 
			
		||||
      end
 | 
			
		||||
      new_map << col
 | 
			
		||||
    end
 | 
			
		||||
    @map = new_map
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def check_cell(x,y,map)
 | 
			
		||||
    adjacent_count =  cell_value(map,x+1,y+1) +
 | 
			
		||||
                      cell_value(map,x+1,y) +
 | 
			
		||||
                      cell_value(map,x+1,y-1) +
 | 
			
		||||
                      cell_value(map,x,y+1) +
 | 
			
		||||
                      cell_value(map,x,y-1) +
 | 
			
		||||
                      cell_value(map,x-1,y+1) +
 | 
			
		||||
                      cell_value(map,x-1,y) +
 | 
			
		||||
                      cell_value(map,x-1,y-1)
 | 
			
		||||
 | 
			
		||||
    is_live_cell = map[x][y] == 1
 | 
			
		||||
 | 
			
		||||
    if is_live_cell
 | 
			
		||||
      return adjacent_count == 2 || adjacent_count == 3 ? 1 : 0
 | 
			
		||||
    else # dead_cell
 | 
			
		||||
      return adjacent_count == 3 ? 1 : 0
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def cell_value(map,x,y)
 | 
			
		||||
    return 0 if x > max_x - 1 || x < 0
 | 
			
		||||
    return 0 if y > max_y - 1 || y < 0
 | 
			
		||||
 | 
			
		||||
    map[x][y]
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def print_map
 | 
			
		||||
    puts "\n--- the map ---"
 | 
			
		||||
    max_y.times do |y|
 | 
			
		||||
      max_x.times do |x|
 | 
			
		||||
        char = map[x][y] == 1 ? "#" : "."
 | 
			
		||||
        print char
 | 
			
		||||
      end
 | 
			
		||||
      print "\n"
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
MAX_X = 40
 | 
			
		||||
MAX_Y = 24
 | 
			
		||||
 | 
			
		||||
BLOCK_SIZE = (1280/MAX_X).round
 | 
			
		||||
 | 
			
		||||
INPUT = [
 | 
			
		||||
  [9,9],
 | 
			
		||||
  [10,10],
 | 
			
		||||
  [9,11],
 | 
			
		||||
  [11,11],
 | 
			
		||||
  [9,12],
 | 
			
		||||
  [11,12],
 | 
			
		||||
  [13,13],
 | 
			
		||||
  [14,13],
 | 
			
		||||
  [15,13],
 | 
			
		||||
  [16,13],
 | 
			
		||||
  [16,15],
 | 
			
		||||
  [16,16],
 | 
			
		||||
  [17,17],
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
SPEED = 0.3 # every second
 | 
			
		||||
TICK_FOR_STEP = (SPEED * 60).round
 | 
			
		||||
 | 
			
		||||
def tick args
 | 
			
		||||
 | 
			
		||||
  args.outputs.labels  << [640, 500, 'Conways game of life', 5, 1]
 | 
			
		||||
  # args.outputs.labels  << [640, 460, 'Go to docs/docs.html and read it!', 5, 1]
 | 
			
		||||
  # args.outputs.labels  << [640, 420, 'Join the Discord! https://discord.dragonruby.org', 5, 1]
 | 
			
		||||
  # args.outputs.sprites << [576, 280, 128, 101, 'dragonruby.png']
 | 
			
		||||
  game = args.state.game
 | 
			
		||||
  if game.nil?
 | 
			
		||||
    game = Game.new(MAX_X,MAX_Y,INPUT)
 | 
			
		||||
    args.state.game = game
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  args.outputs.solids << [
 | 
			
		||||
    0, 
 | 
			
		||||
    0,   
 | 
			
		||||
    MAX_X*BLOCK_SIZE,     
 | 
			
		||||
    MAX_Y*BLOCK_SIZE,   
 | 
			
		||||
    164,   
 | 
			
		||||
    212,    
 | 
			
		||||
    220,   
 | 
			
		||||
    128]
 | 
			
		||||
 | 
			
		||||
  if args.state.tick_count % TICK_FOR_STEP == 0
 | 
			
		||||
    game.tick
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  MAX_X.times do |x|
 | 
			
		||||
    MAX_Y.times do |y|
 | 
			
		||||
      live_cell = game.map[x][y] == 1 ? true : false
 | 
			
		||||
      args.outputs.solids << [
 | 
			
		||||
        x*BLOCK_SIZE, 
 | 
			
		||||
        y*BLOCK_SIZE,   
 | 
			
		||||
        BLOCK_SIZE,     
 | 
			
		||||
        BLOCK_SIZE,   
 | 
			
		||||
        219, 
 | 
			
		||||
        163, 
 | 
			
		||||
        211,
 | 
			
		||||
        255] if live_cell
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  args.outputs.labels  << [640, 600, "Round ##{game.round}", 5, 1]
 | 
			
		||||
  # args.outputs.labels  << [640, 700, "Tick count ##{args.state.tick_count}", 5, 1]
 | 
			
		||||
  # args.outputs.labels << [10, 710, "framerate: #{args.gtk.current_framerate.round}"]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  # render
 | 
			
		||||
  #  X    Y  WIDTH  HEIGHT  RED  GREEN  BLUE  ALPHA
 | 
			
		||||
 | 
			
		||||
end
 | 
			
		||||
		Loading…
	
		Reference in New Issue