Class: Game

Inherits:
Client show all
Defined in:
game/game.rb

Overview

The game class stores the basic client side logic of hangman. It inherits from client in order to provide greater code clarity.

Author:

  • Joseph Beck

Instance Method Summary collapse

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.

Parameters:

  • (String, Integer, String, String)


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.

Parameters:

  • (NilClass)

Returns:

  • (Boolean)


195
196
197
# File 'game/game.rb', line 195

def already_guessed?(guess)
  @guesses.include? guess
end

#closeNilClass

Puts a disconnecting method and disconnects via the superclass method close. Also exits the program with status 1 (meaning done)

Parameters:

  • (NilClass)

Returns:

  • (NilClass)


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.

Parameters:

  • (NilClass)

Returns:

  • (Boolean)


172
173
174
175
# File 'game/game.rb', line 172

def dead?
  # TODO: Implement this
  false
end

#finishedNilClass

Series of events once the robot sends the finished packet.

Parameters:

  • (NilClass)

Returns:

  • (NilClass)


100
101
102
103
# File 'game/game.rb', line 100

def finished
  puts 'Game over!'
  close
end

#guessString

Gets a user’s guess and ensures that is it valid. Also decrements lives left and adds the users guess to guesses.

Parameters:

  • (NilClass)

Returns:

  • (String)


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_guessString

Takes a users guess from the console.

Parameters:

  • (NilClass)

Returns:

  • (String)


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_threadThread

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.

Parameters:

  • (NilClass)

Returns:

  • (Thread)


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

#runNilClass

The run method overrides the superclasses run however uses super to gain most of its functionality.

Parameters:

  • (NilClass)

Returns:

  • (NilClass)


43
44
45
46
# File 'game/game.rb', line 43

def run
  puts 'Now playing hangman...'
  super
end

#send_threadThread

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.

Parameters:

  • (NilClass)

Returns:

  • (Thread)


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.

Parameters:

  • (NilClass)

Returns:

  • (Boolean)


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

#waitNilClass

Waits for the robot to go back into the guessing state.

Parameters:

  • (NilClass)

Returns:

  • (NilClass)


88
89
90
91
92
93
# File 'game/game.rb', line 88

def wait
  until @guessing;
    break if @guessing
  end
  input_guess
end