Class: Game
Overview
The game class stores the basic client side logic of hangman. It inherits from client in order to provide greater code clarity.
Instance Method Summary collapse
-
#already_guessed?(guess) ⇒ Boolean
Checks if the users guess has already been guessed.
-
#close ⇒ NilClass
Puts a disconnecting method and disconnects via the superclass method close.
-
#dead? ⇒ Boolean
Checks if the amount of lives left is zero, if it is then puts game over and returns true.
-
#finished ⇒ NilClass
Series of events once the robot sends the finished packet.
-
#guess ⇒ String
Gets a user’s guess and ensures that is it valid.
-
#initialize(ip, port, username = 'ruby', reciever = 'all') ⇒ NilClass
constructor
The initializer of Game takes in a variety of params, all are used to initialize the superclass.
-
#input_guess ⇒ String
Takes a users guess from the console.
-
#recieve_thread ⇒ Thread
Extended the recieve thread from the client to change the states of the game depending on the recieved packet.
-
#run ⇒ NilClass
The run method overrides the superclasses run however uses super to gain most of its functionality.
-
#send_thread ⇒ Thread
The send_thread method overrides the superclasses send_thread method.
-
#valid_guess?(guess) ⇒ Boolean
Checks if the user inputted guess is valid.
-
#wait ⇒ NilClass
Waits for the robot to go back into the guessing state.
Methods inherited from Client
#connect, #exit_threads, #make_threads
Constructor Details
#initialize(ip, port, username = 'ruby', reciever = 'all') ⇒ NilClass
The initializer of Game takes in a variety of params, all are used to initialize the superclass. guesses and lives_left are initialized to their starting states.
28 29 30 31 32 33 34 35 |
# File 'game/game.rb', line 28 def initialize(ip, port, username = 'ruby', reciever = 'all') super(ip, port, username, reciever) @state = GameStates.new(1) @guessing = false @guesses = [] @lives_left = 7 end |
Instance Method Details
#already_guessed?(guess) ⇒ Boolean
Checks if the users guess has already been guessed.
195 196 197 |
# File 'game/game.rb', line 195 def already_guessed?(guess) @guesses.include? guess end |
#close ⇒ NilClass
Puts a disconnecting method and disconnects via the superclass method close. Also exits the program with status 1 (meaning done)
55 56 57 58 59 60 61 |
# File 'game/game.rb', line 55 def close super puts 'Disconnected' Sys.exit_p 1 nil end |
#dead? ⇒ Boolean
Checks if the amount of lives left is zero, if it is then puts game over and returns true.
172 173 174 175 |
# File 'game/game.rb', line 172 def dead? # TODO: Implement this false end |
#finished ⇒ NilClass
Series of events once the robot sends the finished packet.
100 101 102 103 |
# File 'game/game.rb', line 100 def finished puts 'Game over!' close end |
#guess ⇒ String
Gets a user’s guess and ensures that is it valid. Also decrements lives left and adds the users guess to guesses.
71 72 73 74 75 76 77 78 79 80 81 |
# File 'game/game.rb', line 71 def guess guess = input_guess until valid_guess?(guess) puts 'Invalid input, try again' guess = input_guess end @lives_left -= 1 @guesses << guess @guessing = false guess end |
#input_guess ⇒ String
Takes a users guess from the console.
110 111 112 113 114 115 116 117 118 |
# File 'game/game.rb', line 110 def input_guess if @guessing puts 'Enter guess: ' gets else puts 'Waiting for robot...' wait end end |
#recieve_thread ⇒ Thread
Extended the recieve thread from the client to change the states of the game depending on the recieved packet. This prevents the user from guessing whilst the robot is drawing something.
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 |
# File 'game/game.rb', line 146 def recieve_thread Thread.new { until @socket.closed? output = @socket.gets jade_object = @deserializer.from_str(output) packet = jade_object.to_packet if packet.type.eql? 'state' case packet.data.downcase when 'guessing' @guessing = true when 'finished' finished else @guessing = false end end end } end |
#run ⇒ NilClass
The run method overrides the superclasses run however uses super to gain most of its functionality.
43 44 45 46 |
# File 'game/game.rb', line 43 def run puts 'Now playing hangman...' super end |
#send_thread ⇒ Thread
The send_thread method overrides the superclasses send_thread method. It extends it further by implementing the user guess system. The guess is also validated.
128 129 130 131 132 133 134 135 136 137 138 |
# File 'game/game.rb', line 128 def send_thread Thread.new { until @socket.closed? || dead? input = guess packet = Packet.new(@username, @reciever, 'guess', input) jade_object = packet.to_jade_object jade_string = @serializer.to_str(jade_object) @socket.puts jade_string end } end |
#valid_guess?(guess) ⇒ Boolean
Checks if the user inputted guess is valid.
182 183 184 185 186 187 188 |
# File 'game/game.rb', line 182 def valid_guess?(guess) return false if guess.nil? (guess.length == 2 && guess.match?(/[[:alpha:]]/) && !already_guessed?(guess)) end |
#wait ⇒ NilClass
Waits for the robot to go back into the guessing state.
88 89 90 91 92 93 |
# File 'game/game.rb', line 88 def wait until @guessing; break if @guessing end input_guess end |