were_wolf 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2bddf36a281f5189a36ae1c65dede53c43f567de
4
- data.tar.gz: d0dae2add604f028fd24ef2fe791a677588f848f
3
+ metadata.gz: a63c18b5139dcf4282bbc79aa18bd08df03b654d
4
+ data.tar.gz: 6ff720629a4862574e3e68f92d151e5f26e2b2f8
5
5
  SHA512:
6
- metadata.gz: 6c2a9ef75b7441395bdb853dd2c3053bf125cb34fcc783ab8801b4844e5723ce9dbf97e60e5cf8e01cd86aefee9f43c03f6b0daaae2ed14edab63ce08144c4d3
7
- data.tar.gz: cb47b1a687f2ebc9c06dff229f33ad5411bcbacda845f753449143d00ee19754b2c7cd400a28b103112e13bb69357b18ca2091f66c32dd0799356b6c4b038137
6
+ metadata.gz: ea4e4bc2cc2102a967d9445f8db83aa330f8023b983bb6ce845c896b44352710f40265139b0ed09da282ebc5f375372a1af096a67252adc709c94ac7a347f5f2
7
+ data.tar.gz: 6b9370e4d9f1c1d7ac869639ed7cb4bf26f274e6e6f3db0d2618f53c221e2c6db6b4a0a7eca634376fbc8318df1b030c9f3ab4f189ed49889874aba48533de47
@@ -31,9 +31,14 @@ private
31
31
  # Cop identifies a person
32
32
  cop = @players.cop
33
33
  cop.identify_a_player(@players) if cop
34
+ saved_people = []
34
35
  # Doctor chooses to save a person
35
36
  doctor = @players.doctor
36
- saved_person = doctor.choose_a_player_to_save(@players)
37
+ saved_people.push(doctor.choose_a_player_to_save(@players)) if doctor
38
+ # Witch chooses to save a person once in the entire game
39
+ witch = @players.witch
40
+ person_saved_by_witch = witch.choose_a_player_to_save(@players) if witch
41
+ saved_people.push(person_saved_by_witch) if witch && person_saved_by_witch
37
42
  # Wolves kill a villager
38
43
  wolves_victim = villagers_alive.sample
39
44
  # Rogue kills a players once in the entire game
@@ -41,12 +46,23 @@ private
41
46
  rogues_victim = rogue.choose_victim(@players) if rogue
42
47
 
43
48
  # Don't kill the person if the doctor saved the person
44
- @players.kill(wolves_victim) unless wolves_victim == saved_person
49
+ @players.kill(wolves_victim) unless saved_people.include?(wolves_victim)
45
50
  # Don't kill the person again, if the wolves have already killed the person
46
- @players.kill(rogues_victim) unless (rogues_victim == saved_person) || (rogues_victim == wolves_victim)
51
+ @players.kill(rogues_victim) unless (saved_people.include?(rogues_victim)) || (rogues_victim == wolves_victim)
47
52
  end
48
53
 
49
54
  def day_mode
55
+ # Witch can kill a player once in the entire game
56
+ witch = @players.witch
57
+ if witch
58
+ witchs_victim = witch.choose_a_player_to_kill(@players)
59
+ if witchs_victim
60
+ @players.kill(witchs_victim) if witchs_victim
61
+ return if over?
62
+ end
63
+ end
64
+
65
+ # Run voting to kick out a player
50
66
  victim = run_voting
51
67
  if victim == DRAW
52
68
  @draw = true
@@ -34,7 +34,8 @@ private
34
34
  players['cops'] = 1
35
35
  players['doctors'] = 1 if @players_count - wolves_count > 1
36
36
  players['rogues'] = 1 if @players_count - wolves_count > 2
37
- players['villagers'] = (@players_count - wolves_count - 3) if @players_count - wolves_count > 3
37
+ players['witches'] = 1 if @players_count - wolves_count > 3
38
+ players['villagers'] = (@players_count - wolves_count - 4) if @players_count - wolves_count > 4
38
39
 
39
40
  probabilities = {}
40
41
  probabilities['wolves_win'] = (100.0*(best_wins[Game::WOLF] || 0)/@no_of_runs)
@@ -1,5 +1,8 @@
1
1
  class Doctor < Villager
2
2
  def choose_a_player_to_save(players)
3
+ # Save myself when ther eare only 2 players,a s the other player
4
+ # should be a wolf
5
+ return self if players.alive_players.count == 2
3
6
  # Assumption: Doctor saves him/her self 50% of the times
4
7
  if rand < 0.5
5
8
  return self
@@ -3,6 +3,7 @@ require_relative 'villager'
3
3
  require_relative 'cop'
4
4
  require_relative 'doctor'
5
5
  require_relative 'rogue'
6
+ require_relative 'witch'
6
7
 
7
8
  class PlayerCollection
8
9
  def initialize(no_of_wolves, no_of_villagers)
@@ -25,6 +26,9 @@ class PlayerCollection
25
26
  elsif i == 3
26
27
  villager = Rogue.new
27
28
  @rogue = villager
29
+ elsif i == 4
30
+ villager = Witch.new
31
+ @witch = villager
28
32
  else
29
33
  villager = Villager.new
30
34
  end
@@ -51,7 +55,9 @@ class PlayerCollection
51
55
  promote_rogue_to_wolf
52
56
  else
53
57
  @cop = nil if player.is_a?(Cop)
58
+ @doctor = nil if player.is_a?(Doctor)
54
59
  @rogue = nil if player.is_a?(Rogue)
60
+ @witch = nil if player.is_a?(Witch)
55
61
  collection = @villagers
56
62
  end
57
63
  collection.delete(player)
@@ -71,6 +77,10 @@ class PlayerCollection
71
77
  @rogue
72
78
  end
73
79
 
80
+ def witch
81
+ @witch
82
+ end
83
+
74
84
  private
75
85
  def promote_rogue_to_wolf
76
86
  return if @wolves.count > 0
@@ -0,0 +1,40 @@
1
+ class Witch < Doctor
2
+ def initialize
3
+ super
4
+ @save_power_used = false
5
+ @kill_power_used = false
6
+ end
7
+
8
+ def choose_a_player_to_save(players)
9
+ return if @save_power_used
10
+
11
+ if choose_to_use_power?(players)
12
+ # Choose a person to save
13
+ @save_power_used = true
14
+ return super(players)
15
+ else
16
+ # Save the save power for a later round
17
+ return nil
18
+ end
19
+ end
20
+
21
+ def choose_a_player_to_kill(players)
22
+ return if @kill_power_used
23
+
24
+ if choose_to_use_power?(players)
25
+ @kill_power_used = true
26
+ return (players.alive_players - [self]).sample
27
+ else
28
+ return
29
+ end
30
+ end
31
+
32
+ private
33
+ def choose_to_use_power?(players)
34
+ # Always use the power if there is only one another player in the game,
35
+ # as the other player should be a wolf
36
+ return true if players.alive_players.count == 2
37
+
38
+ rand < (1.0/(players.alive_wolves.count + 1))
39
+ end
40
+ end
@@ -1,3 +1,3 @@
1
1
  module WereWolf
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: were_wolf
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - BV Satyaram
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-10-19 00:00:00.000000000 Z
11
+ date: 2015-10-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -62,6 +62,7 @@ files:
62
62
  - lib/were_wolf/player/player_collection.rb
63
63
  - lib/were_wolf/player/rogue.rb
64
64
  - lib/were_wolf/player/villager.rb
65
+ - lib/were_wolf/player/witch.rb
65
66
  - lib/were_wolf/player/wolf.rb
66
67
  - lib/were_wolf/version.rb
67
68
  - were_wolf.gemspec