The Self Defense gem in action

The example below demonstrates how Bob the Martial Artist can defend himself 10 times in 30 seconds before adopting a different strategy.

require 'self-defense'

class MartialArtist
  
  def initialize()

  end

  def defend(manoeuvre={})
    action = ''
    strategy = lambda do |defense|

      coping_with_it = []
      coping_with_it << defense.sustained?(duration: '30s', hit_limit: 10)

      action = coping_with_it.all? ? 'blocked' : 'stop hitting me'
    end

    SelfDefense.new(&strategy) 
    puts Time.now.to_s + ': ' + action.to_s
  end
end


bob = MartialArtist.new

Time.now #=> 2013-08-16 18:42:43 +0100

bob.defend against: :kick  #=> 2013-08-16 18:42:43 +0100: blocked
sleep 5

bob.defend against: :punch #=> 2013-08-16 18:42:48 +0100: blocked
bob.defend against: :kick  #=> 2013-08-16 18:42:48 +0100: blocked
sleep 5

bob.defend against: :push  #=> 2013-08-16 18:42:53 +0100: blocked
bob.defend against: :punch #=> 2013-08-16 18:42:53 +0100: blocked
bob.defend against: :kick  #=> 2013-08-16 18:42:53 +0100: blocked
sleep 5

bob.defend against: :punch #=> 2013-08-16 18:42:58 +0100: blocked
bob.defend against: :kick  #=> 2013-08-16 18:42:58 +0100: blocked
bob.defend against: :kick  #=> 2013-08-16 18:42:58 +0100: blocked
bob.defend against: :punch #=> 2013-08-16 18:42:58 +0100: blocked
sleep 5

bob.defend against: :push  #=> 2013-08-16 18:43:03 +0100: stop hitting me
Time.now #=> 2013-08-16 18:43:03 +0100
sleep 25

bob.defend against: :kick  #=> 2013-08-16 18:43:28 +0100: stop hitting me
sleep 5

bob.defend against: :push  #=> 2013-08-16 18:43:35 +0100: blocked
bob.defend against: :push  #=> 2013-08-16 18:43:40 +0100: blocked

Rapid defense

require 'self-defense'

class Mar

tialArtist

def initialize()

  end

  def defend(manoeuvre={})
    action = ''
    strategy = lambda do |defense|

      coping_with_it = []
      coping_with_it << defense.rapid?(2)

      action = coping_with_it.all? ? 'blocked' : 'stop hitting me'
    end

    SelfDefense.new(&strategy) 
    puts Time.now.to_s + ': ' + action.to_s
  end
end


bob = MartialArtist.new

bob.defend against: :kick  #=> 2013-08-16 19:40:58 +0100: blocked
sleep 1
bob.defend against: :kick  #=> 2013-08-16 19:40:59 +0100: stop hitting me
sleep 2
bob.defend against: :punch #=> 2013-08-16 19:41:01 +0100: blocked
sleep 1
bob.defend against: :push  #=> 2013-08-16 19:41:02 +0100: stop hitting me
sleep 0.5
bob.defend against: :kick  #=> 2013-08-16 19:41:02 +0100: stop hitting me
sleep 0.5
bob.defend against: :punch #=> 2013-08-16 19:41:03 +0100: stop hitting me
sleep 2
bob.defend against: :kick  #=> 2013-08-16 19:41:05 +0100: blocked
sleep 2
bob.defend against: :kick  #=> 2013-08-16 19:41:07 +0100: blocked
sleep 2.5
bob.defend against: :punch #=> 2013-08-16 19:41:09 +0100: blocked
sleep 2
bob.defend against: :push  #=> 2013-08-16 19:41:11 +0100: blocked
sleep 0.5
bob.defend against: :punch #=> 2013-08-16 19:41:12 +0100: stop hitting me

Sustained and rapid defense together

req

uire 'self-defense'

class MartialArtist
  
  def initialize()

  end

  def defend(manoeuvre={})
    action = ''
    strategy = lambda do |defense|

      coping_with_it = []
      coping_with_it << defense.rapid?(1)
      coping_with_it << defense.sustained?(duration: '30s', hit_limit: 7)

      action = coping_with_it.all? ? 'blocked' : 'stop hitting me'
    end

    SelfDefense.new(&strategy) 
    puts Time.now.to_s + ': ' + action.to_s
  end
end

bob = MartialArtist.new

bob.defend against: :kick  #=> 2013-08-16 19:51:58 +0100: stop hitting me
sleep 1
bob.defend against: :kick  #=> 2013-08-16 19:51:59 +0100: blocked
sleep 2
bob.defend against: :punch #=> 2013-08-16 19:52:01 +0100: blocked
sleep 1
bob.defend against: :push  #=> 2013-08-16 19:52:02 +0100: blocked
sleep 0.5
bob.defend against: :kick  #=> 2013-08-16 19:52:03 +0100: stop hitting me
sleep 0.5
bob.defend against: :punch #=> 2013-08-16 19:52:03 +0100: stop hitting me
sleep 2
bob.defend against: :kick  #=> 2013-08-16 19:52:05 +0100: blocked
sleep 2
bob.defend against: :kick  #=> 2013-08-16 19:52:07 +0100: blocked
sleep 2.5
bob.defend against: :punch #=> 2013-08-16 19:52:10 +0100: stop hitting me
sleep 2
bob.defend against: :push  #=> 2013-08-16 19:52:12 +0100: stop hitting me
sleep 0.5
bob.defend against: :punch #=> 2013-08-16 19:52:14 +0100: stop hitting me

Tags:
Source:
2000hrs.txt
Published:
16-08-2013 20:00