Skip to content

Instantly share code, notes, and snippets.

@MaggieMoss
Last active August 29, 2015 14:20
Show Gist options
  • Save MaggieMoss/8d18f5cb366e8d67dbd5 to your computer and use it in GitHub Desktop.
Save MaggieMoss/8d18f5cb366e8d67dbd5 to your computer and use it in GitHub Desktop.
A ruby command line version of tic tac toe
class Board
attr_reader :spaces, :name, :board_example, :num_to_words
attr_accessor :view
def initialize
@spaces = {
:one => EMPTY,
:two => EMPTY,
:three => EMPTY,
:four => EMPTY,
:five => EMPTY,
:six => EMPTY,
:seven => EMPTY,
:eight => EMPTY,
:nine => EMPTY,
}
@view = ""+spaces[:one]+"|"+spaces[:two]+"|"+spaces[:three]+"\n-----\n"+spaces[:four]+"|"+spaces[:five]+"|"+spaces[:six]+"\n-----\n"+spaces[:seven]+"|"+spaces[:eight]+"|"+spaces[:nine]
@board_example = "1|2|3\n-----\n4|5|6\n-----\n7|8|9"
@num_to_words = { 1 => 'one', 2 => 'two', 3 => 'three', 4 => 'four', 5 => 'five', 6 => 'six', 7 => 'seven', 8 => 'eight', 9 => 'nine'}
end
EMPTY = ' '
def check_if_win_possible(letter)
if (spaces[:one] == letter && spaces[:two] == letter || spaces[:six] == letter && spaces[:nine] == letter || spaces[:seven] == letter && spaces[:five] == letter) && spaces[:three] == EMPTY
return 3
elsif (spaces[:one] == letter && spaces[:three] == letter || spaces[:five] == letter && spaces[:eight] == letter)&& spaces[:two] == EMPTY
return 2
elsif (spaces[:one] == letter && spaces[:five] == letter || spaces[:three] == letter && spaces[:six] == letter || spaces[:seven] == letter && spaces[:eight] == letter) && spaces[:nine] == EMPTY
return 9
elsif (spaces[:one] == letter && spaces[:four] == letter || spaces[:three] == letter && spaces[:five] == letter || spaces[:nine] == letter && spaces[:eight] == letter) && spaces[:seven] == EMPTY
return 7
elsif (spaces[:one] == letter && spaces[:seven] == letter || spaces[:six] == letter && spaces[:five] == letter) && spaces[:four] == EMPTY
return 4
elsif (spaces[:two] == letter && spaces[:three] == letter || spaces[:four] == letter && spaces[:seven] == letter || spaces[:nine] == letter && spaces[:five] == letter) && spaces[:one] == EMPTY
return 1
elsif (spaces[:two] == letter && spaces[:five] == letter || spaces[:seven] == letter && spaces[:nine] == letter) && spaces[:eight] == EMPTY
return 8
elsif (spaces[:two] == letter && spaces[:eight] == letter || spaces[:four] == letter && spaces[:six] == letter || spaces[:three] == letter && spaces[:seven] == letter) && spaces[:five] == EMPTY
return 5
elsif (spaces[:three] == letter && spaces[:nine] == letter || spaces[:four] == letter && spaces[:five] == letter) && spaces[:six] == EMPTY
return 6
else
return false
end
end
def check_if_winner(letter)
# check all possible winning lines
if spaces[:one] == letter && spaces[:two] == letter && spaces[:three] == letter
return true
elsif spaces[:four] == letter && spaces[:five] == letter && spaces[:six] == letter
return true
elsif spaces[:seven] == letter && spaces[:eight] == letter && spaces[:nine] == letter
return true
elsif spaces[:one] == letter && spaces[:four] == letter && spaces[:seven] == letter
return true
elsif spaces[:two] == letter && spaces[:five] == letter && spaces[:eight] == letter
return true
elsif spaces[:three] == letter && spaces[:six] == letter && spaces[:nine] == letter
return true
elsif spaces[:one] == letter && spaces[:five] == letter && spaces[:nine] == letter
return true
elsif spaces[:three] == letter && spaces[:five] == letter && spaces[:seven] == letter
return true
else
return false
end
end
def check_if_corner_open
if spaces[:one] == EMPTY
return 1
elsif spaces[:three] == EMPTY
return 3
elsif spaces[:seven] == EMPTY
return 7
elsif spaces[:nine] == EMPTY
return 9
else
return false
end
end
def update_view
@view = ""+spaces[:one]+"|"+spaces[:two]+"|"+spaces[:three]+"\n-----\n"+spaces[:four]+"|"+spaces[:five]+"|"+spaces[:six]+"\n-----\n"+spaces[:seven]+"|"+spaces[:eight]+"|"+spaces[:nine]
end
def check_if_center_open
if spaces[:five] == EMPTY
return true
else
return false
end
end
def make_move(square_num, letter)
square = num_to_words[square_num.to_i]
if @spaces[square.to_sym] == EMPTY
new_space = { square.to_sym => letter }
@spaces.merge!(new_space)
update_view
else
puts 'Oops! Invalid move, try again'
square = gets.chomp
make_move(square, letter)
end
end
def check_if_tie
space_values = @spaces.values
i = 0
while i < space_values.length-1 do
i += 1
if space_values[i] == EMPTY
return false
end
end
return true
end
def find_empty_space
space_values = @spaces.values
i = 0
while i < space_values.length-1 do
i += 1
if space_values[i] == EMPTY
return i+1
end
end
end
def computer_move
if check_if_tie
puts @view
puts "Tie Game!"
play_again?
elsif check_if_win_possible('O') != false
make_move(check_if_win_possible('O'), 'O')
elsif check_if_win_possible('X') != false
make_move(check_if_win_possible('X'), 'O')
elsif check_if_center_open
make_move(5, 'O')
elsif check_if_corner_open != false
make_move(check_if_corner_open, 'O')
else
make_move(find_empty_space, 'O')
end
end
def reset_board
reset_spaces = {
:one => EMPTY,
:two => EMPTY,
:three => EMPTY,
:four => EMPTY,
:five => EMPTY,
:six => EMPTY,
:seven => EMPTY,
:eight => EMPTY,
:nine => EMPTY,
}
@spaces.merge!(reset_spaces)
update_view
end
end
def start_game
@board = Board.new
puts "Okay. Let's go over how to play. Each square on the board is numbered from 1 to 9. Like this: "
puts @board.board_example
puts 'So, to make a move, simply type the number of the square you\'d like to place your letter on. Got it? [\'yes\' or \'y\']'
answer = gets.chomp.to_s
puts answer
if answer == 'yes' || answer == 'y'
game_loop
end
end
def game_loop
puts @board.view
puts "Whats your move?"
square = gets.chomp
make_move(square)
if @board.check_if_winner('X')
puts @board.view
puts 'You win!'
play_again?
elsif @board.check_if_winner('O')
puts @board.view
puts 'Computer Wins!'
play_again?
elsif @board.check_if_tie
puts @board.view
puts "Tie Game!"
play_again?
else
game_loop
end
end
def make_move(square)
if square.length == 1 && square.to_i > 0 && square.to_i < 10
@board.make_move(square, 'X')
@board.computer_move
else
puts 'Oops! Try putting just the number value (Like 1 or 7)'
square = gets.chomp
make_move(square)
end
end
def play_again?
puts 'Do you want to play again?'
answer = gets.chomp.to_s
if answer == 'yes' || answer == 'y'
@board.reset_board
game_loop
else
puts "Okay, Bye!"
end
end
start_game
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment