Class: Roebe::TicTacToe

Inherits:
Base show all
Defined in:
lib/roebe/classes/tic_tac_toe.rb

Overview

Roebe::TicTacToe

Constant Summary

Constants inherited from Base

Base::COLOURS, Base::HOME_DIRECTORY_OF_USER_X, Base::N, Base::NAMESPACE

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Base

#actions, #append_this_onto_that_file, #append_what_into, #be_silent, #be_verbose?, #beautiful_url, #burlywood, #call_next, #chdir, #cheerful_guy, #cliner, #complex_esystem, #convert_global_env, #copy_directory, #copy_file, #cornflowerblue, #create_directory, #crimson, #current_month?, #current_time?, #current_year?, #cyan, #darkcyan, #darkgreen, #darkkhaki, #darkslateblue, #deeppink, #delete_symlink, #do_not_use_the_base_colours, #do_use_the_base_colours, #e, #ecomment, #editor_to_use?, #efancy, #eimp, #emphasis, #ensure_main_encoding, #ensure_utf_encoding, #eparse, #erev, #esteelblue, #etomato, #ewarn, #exit_program, #firebrick, #get_current_day, #get_current_month, #get_files_and_directories, #get_files_from, #get_german_name_for_this_weekday, #gold, #green, #grey, #hh_mm_ss, #hh_mm_ss_day_month_year, #home_dir?, #home_directory_of_user_x?, #infer_the_namespace, #internal_hash?, #is_a_directory?, #is_a_file?, #is_a_jpg_file?, #is_an_image_file?, #is_archive?, #is_audio_file?, #is_in_studium_dir?, #is_multimedia_file?, #is_on_roebe?, #is_on_windows?, #is_studium_available?, #is_symlink?, #is_this_a_ruby_file?, #is_video_file?, #iso_encoding?, #le, #left_colour, #lightblue, #lightgreen, #lightseagreen, #lightsteelblue, #lime, #limegreen, #localhost_to_data, #log_directory?, #main_encoding?, #mediumorchid, #mediumpurple, #mediumseagreen, #mediumslateblue, #mediumspringgreen, #mediumturquoise, #mkdir_p, #mv, #n_days_in_this_month, #n_pages_in_this_pdf_file?, #namespace?, #no_file_exists_at, #ogrey, #olive, #olivedrab, #open_in_browser, #opne, #opnesystem, #opnn, #orange, #orchid, #orev, #palegoldenrod, #palevioletred, #pink, #powderblue, #programs_dir?, #project_base_dir?, #random_html_colour, #rds, #read_file_in_iso_encoding, #read_file_via_the_default_encoding, #read_lines_via_iso_encoding, #readlines_with_main_encoding, #red, #register_sigint, #remove, #remove_directory, #remove_file, #rename_kde_konsole_tab, #replace_localhost_with_data, #report_pwd, #require_rescue, #reset_the_internal_hash, #return_all_directories_from_this_directory, #return_all_files_from_this_directory, #return_current_directory, #return_dd_mm_yyyy, #return_file_or_directory_of, #return_files_from_pwd, #return_last_part_of_the_current_directory, #return_utc, #rev, #right_arrow?, #right_colour, #roebe_log_directory?, #rosybrown, #royalblue, #ruby_base_directory?, #run_in_background, #run_rcfiles_then_run_ata_via_qdbus, #sandybrown, #sdir, #seagreen, #set_be_verbose, #set_xorg_buffer, #sfancy, #sfile, #show_help, #silent_redirection?, #simp, #simple_esystem, #skyblue, #slateblue, #slategray, #springgreen, #steelblue, #string_italic, #swarn, #symlink, #teal, #temp_dir?, #to_camelcase, #to_counted_hash, #tomato, #touch, #try_to_require_the_beautiful_url_gem, #try_to_require_the_html_template, #try_to_require_the_open_gem, #try_to_require_the_program_information_gem, #try_to_require_the_xorg_buffer, #use_colours?, #verbose_truth, #weekday?, #word_wrap, #write_what_into, #yellow

Methods included from Base::CommandlineArguments

#append_onto_the_commandline_arguments, #clear_commandline_arguments, #commandline_arguments?, #commandline_arguments_as_string?, #commandline_arguments_without_leading_hyphens?, #first_argument?, #first_argument_without_leading_hyphens?, #has_an_argument_been_passed?, #remove_hyphened_arguments_from_the_commandline_arguments, #return_commandline_arguments_with_leading_hyphens, #second_argument?, #set_commandline_arguments

Constructor Details

#initialize(i = nil, run_already = true) ⇒ TicTacToe

#

initialize

#


25
26
27
28
29
30
31
32
# File 'lib/roebe/classes/tic_tac_toe.rb', line 25

def initialize(
    i           = nil,
    run_already = true
  )
  reset
  set_commandline_arguments(i)
  run if run_already
end

Class Method Details

.[](i = '') ⇒ Object

#

Roebe::TicTacToe[]

#


318
319
320
# File 'lib/roebe/classes/tic_tac_toe.rb', line 318

def self.[](i = '')
  new(i)
end

Instance Method Details

#already_occupied?(i) ⇒ Boolean

#

already_occupied?

#

Returns:

  • (Boolean)


103
104
105
106
# File 'lib/roebe/classes/tic_tac_toe.rb', line 103

def already_occupied?(i)
  (i == 'o') or # player2
  (i == 'x')    # player1
end

#determine_whether_the_game_is_overObject

#

determine_whether_the_game_is_over

#


224
225
226
227
228
229
230
231
232
233
# File 'lib/roebe/classes/tic_tac_toe.rb', line 224

def determine_whether_the_game_is_over
  _ = query_win_condition
  if @game_over
    if _.nil?
      e 'Unentschieden - kein Spieler hat diese Partie gewonnen.'
    else
      e "#{_} hat das Spiel gewonnen!"
    end
  end
end

#display_game_fieldObject

#

display_game_field

#


298
299
300
301
302
303
304
305
306
# File 'lib/roebe/classes/tic_tac_toe.rb', line 298

def display_game_field
  e
  horizontal_line
  @playing_field.each {|line|
    e ' | '+line.join(' ')+' |'
  }
  horizontal_line
  e
end

#horizontal_lineObject

#

horizontal_line

#


311
312
313
# File 'lib/roebe/classes/tic_tac_toe.rb', line 311

def horizontal_line
  e ' .-------.'
end

#msg_already_occupied_placeObject

#

msg_already_occupied_place

#


111
112
113
# File 'lib/roebe/classes/tic_tac_toe.rb', line 111

def msg_already_occupied_place
  e 'Diese Stelle ist bereits besetzt. Bitte verwende eine andere Stelle.'
end

#obtain_user_inputObject

#

obtain_user_input

#


189
190
191
192
193
# File 'lib/roebe/classes/tic_tac_toe.rb', line 189

def obtain_user_input
  _ = $stdin.gets.chomp
  _ = '9' if _ == '0' # 0 is treated equally like 0.
  @user_input = _.to_i
end

#query_win_conditionObject

#

query_win_condition

#


238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
# File 'lib/roebe/classes/tic_tac_toe.rb', line 238

def query_win_condition
  who_won = nil
  _ = @playing_field
  # ======================================================================= #
  # Next horizontal rows:
  # ======================================================================= #
  if    (_[0][0]+_[0][1]+_[0][2] == 'xxx')
    who_won = :player1
  elsif (_[0][0]+_[0][1]+_[0][2] == 'ooo')
    who_won = :player2
  elsif (_[1][0]+_[1][1]+_[1][2] == 'xxx')
    who_won = :player1
  elsif (_[1][0]+_[1][1]+_[1][2] == 'ooo')
    who_won = :player2
  elsif (_[2][0]+_[2][1]+_[2][2] == 'xxx')
    who_won = :player1
  elsif (_[2][0]+_[2][1]+_[2][2] == 'ooo')
    who_won = :player2
  # ======================================================================= #
  # Next vertical rows:
  # ======================================================================= #
  elsif (_[0][0]+_[1][0]+_[2][0] == 'xxx')
    who_won = :player1
  elsif (_[0][0]+_[1][0]+_[2][0] == 'ooo')
    who_won = :player2
  elsif (_[0][1]+_[1][1]+_[2][1] == 'xxx')
    who_won = :player1
  elsif (_[0][1]+_[1][1]+_[2][1] == 'ooo')
    who_won = :player2
  elsif (_[0][2]+_[1][2]+_[2][2] == 'xxx')
    who_won = :player1
  elsif (_[0][2]+_[1][2]+_[2][2] == 'ooo')
    who_won = :player2
  # ======================================================================= #
  # And diagonal checks - only two possible. (X structure)
  # ======================================================================= #
  elsif (_[0][0]+_[1][1]+_[2][2] == 'xxx')
    who_won = :player1
  elsif (_[0][0]+_[1][1]+_[2][2] == 'ooo')
    who_won = :player2
  elsif (_[2][0]+_[1][1]+_[0][2] == 'xxx')
    who_won = :player1
  elsif (_[2][0]+_[1][1]+_[0][2] == 'ooo')
    who_won = :player2
  end
  case who_won
  when :player1, 
       :player2
    @game_over = true
  else # Unentschieden.
    unless @playing_field.flatten.include? ' '
      @game_over = true
    end
  end
  return who_won
end

#resetObject

#

reset (reset tag)

#


37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/roebe/classes/tic_tac_toe.rb', line 37

def reset
  super()
  infer_the_namespace
  # ======================================================================= #
  # === @game_over
  # ======================================================================= #
  @game_over = false
  # ======================================================================= #
  # === @playing_field    
  # ======================================================================= #
  @playing_field = [
    [' ',' ',' '],
    [' ',' ',' '],
    [' ',' ',' ']
  ]
  # ======================================================================= #
  # === @active_player
  # ======================================================================= #
  @active_player = :player1
end

#return_active_playerObject

#

return_active_player

#


96
97
98
# File 'lib/roebe/classes/tic_tac_toe.rb', line 96

def return_active_player
  @active_player
end

#return_token_for_the_currently_active_playerObject Also known as: insert_which_token?, zeichen?, use_which_token?, token?

#

return_token_for_the_currently_active_player

#


68
69
70
71
72
73
74
75
# File 'lib/roebe/classes/tic_tac_toe.rb', line 68

def return_token_for_the_currently_active_player
  case @active_player
  when :player1
    'x'
  when :player2
    'o'
  end
end

#runObject

#

run (run tag)

#


198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
# File 'lib/roebe/classes/tic_tac_toe.rb', line 198

def run
  @user_input = nil
  loop {
    e rev+
      'Bitte setze das '+
       steelblue(return_token_for_the_currently_active_player)+
      ' durch Eingabe einer Nummer von 1-9:'
    obtain_user_input
    case @user_input
    when 1,2,3,4,5,6,7,8,9
      try_to_modify_this_field(
        @user_input, return_token_for_the_currently_active_player
      )
      @active_player = return_active_player
      display_game_field
      determine_whether_the_game_is_over
      break if @game_over
    else
      e @user_input.to_s+' ist nicht erlaubt.'
    end
  }
end

#set_active_player(i) ⇒ Object

#

set_active_player

#


61
62
63
# File 'lib/roebe/classes/tic_tac_toe.rb', line 61

def set_active_player(i)
  @active_player = i
end

#toggle_active_playerObject

#

toggle_active_player

#


83
84
85
86
87
88
89
90
91
# File 'lib/roebe/classes/tic_tac_toe.rb', line 83

def toggle_active_player
  if @active_player == :player1
    set_active_player(:player2)
  elsif @active_player == :player2
    set_active_player(:player1)
  else
    e 'Not registered event.'
  end
end

#try_to_modify_this_field(position, use_this_token) ⇒ Object

#

try_to_modify_this_field

#


118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
# File 'lib/roebe/classes/tic_tac_toe.rb', line 118

def try_to_modify_this_field(position, use_this_token)
  case position
  when 1
    if already_occupied?(@playing_field[0][0])
      msg_already_occupied_place
    else
      @playing_field[0][0] = use_this_token
      toggle_active_player
    end
  when 2
    if already_occupied?(@playing_field[0][1])
      msg_already_occupied_place
    else
      @playing_field[0][1] = use_this_token
      toggle_active_player
    end
  when 3
    if already_occupied?(@playing_field[0][2])
      msg_already_occupied_place
    else
      @playing_field[0][2] = use_this_token
      toggle_active_player
    end
  when 4
    if already_occupied?(@playing_field[1][0])
      msg_already_occupied_place
    else
      @playing_field[1][0] = use_this_token
      toggle_active_player
    end
  when 5
    if already_occupied?(@playing_field[1][1])
      msg_already_occupied_place
    else
      @playing_field[1][1] = use_this_token
      toggle_active_player
    end
  when 6
    if already_occupied?(@playing_field[1][2])
      msg_already_occupied_place
    else
      @playing_field[1][2] = use_this_token
      toggle_active_player
    end
  when 7
    if already_occupied?(@playing_field[2][0])
      msg_already_occupied_place
    else
      @playing_field[2][0] = use_this_token
      toggle_active_player
    end
  when 8
    if already_occupied?(@playing_field[2][1])
      msg_already_occupied_place
    else
      @playing_field[2][1] = use_this_token
      toggle_active_player
    end
  when 9
    if already_occupied?(@playing_field[2][2])
      msg_already_occupied_place
    else
      @playing_field[2][2] = use_this_token
      toggle_active_player
    end
  end
end