Last active
August 29, 2015 14:20
-
-
Save MaggieMoss/8d18f5cb366e8d67dbd5 to your computer and use it in GitHub Desktop.
A ruby command line version of tic tac toe
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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