Created
October 26, 2014 19:18
-
-
Save Ninjex/b5e790c4403feb3b1881 to your computer and use it in GitHub Desktop.
Tic Tac Toe Ruby
This file contains 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
ran_num = rand(0..1) | |
if ran_num == 0 | |
PLAYER = "X" | |
COMPUTER = "O" | |
@turn = :player | |
else | |
PLAYER = "O" | |
COMPUTER = "X" | |
@turn = :computer | |
end | |
puts "Tic Tac Toe, 3 in a Row!" | |
AVAILABLE_SQUARES =* (1..9) | |
ROW_A = { 1 => nil, 2 => nil, 3 => nil } | |
ROW_B = { 1 => nil, 2 => nil, 3 => nil } | |
ROW_C = { 1 => nil, 2 => nil, 3 => nil } | |
ROWS = [ROW_A, ROW_B, ROW_C] | |
def print_board | |
puts "Board Available" | |
puts " _ _ _ _ _ _" | |
count = 0 | |
ROWS.each do |row| | |
count += 1 | |
row.each do |column, value| | |
if value == nil | |
print "|_" | |
elsif value == "O" | |
print "|O" | |
else | |
print "|X" | |
end | |
end | |
print "| " | |
(1..3).each do |i| | |
if count == 1 | |
if ROW_A[i] == nil | |
print "|#{i+6}" | |
else | |
print "|_" | |
end | |
elsif count == 2 | |
if ROW_B[i] == nil | |
print "|#{i+3}" | |
else | |
print "|_" | |
end | |
elsif count == 3 | |
if ROW_C[i] == nil | |
print "|#{i}" | |
else | |
print "|_" | |
end | |
end | |
end | |
puts "|\r\n" | |
end | |
end | |
def spot_valid?(location) | |
if location == nil | |
true | |
else | |
false | |
end | |
end | |
def spot_taken?(spot) | |
if AVAILABLE_SQUARES.include?(spot) == false | |
true | |
else | |
AVAILABLE_SQUARES.delete(spot) | |
false | |
end | |
end | |
def place_choice(spot) | |
if spot_taken?(spot) == true | |
puts "That square can not be used." | |
elsif spot.between?(1,9) | |
puts "#{@turn.capitalize} chose square: #{spot}" | |
if spot > 3 && spot < 7 | |
loc = ROW_B | |
spot -= 3 | |
elsif spot >= 7 | |
loc = ROW_A | |
spot -= 6 | |
else | |
loc = ROW_C | |
end | |
if @turn == :player | |
loc[spot] = PLAYER | |
@turn = :computer | |
else | |
loc[spot] = COMPUTER | |
@turn = :player | |
end | |
end | |
end | |
def win_horizontal? | |
cur_row = 0 | |
ROWS.compact.each do |row| | |
cur_row += 1 | |
if row.values.compact.length == 3 && row.values.uniq.length == 1 | |
if PLAYER == row.values[0] | |
puts "Player playing as #{row.values[0]}'s won horizontally on row: #{cur_row}" | |
else | |
puts "Computer playing as #{row.values[0]}'s won horizontally on row: #{cur_row}" | |
end | |
return true | |
end | |
end | |
end | |
def win_vertical? | |
(0..2).each do |i| | |
if ROW_A.values[i] != nil && ROW_A.values[i] == ROW_B.values[i] | |
if ROW_B.values[i] == ROW_C.values[i] | |
if PLAYER == ROW_C.values[i] | |
puts "Player playing as #{ROW_A.values[i]}'s won vertically on column #{i+1}" | |
else | |
puts "Computer playing as #{ROW_A.values[i]}'s won vertically on column #{i+1}" | |
end | |
return true | |
end | |
end | |
end | |
end | |
def win_diagonal? | |
if ROW_A.values[0] != nil | |
if ROW_A.values[0] == ROW_B.values[1] && ROW_B.values[1] == ROW_C.values[2] | |
if PLAYER == ROW_A.values[0] | |
puts "Player playing as #{ROW_A.values[0]}'s won diagonally with squares 1, 5, and 9" | |
else | |
puts "Computer playing as #{ROW_A.values[0]}'s won diagonally with squares 1, 5, and 9" | |
end | |
return true | |
end | |
end | |
if ROW_C.values[0] != nil | |
if ROW_C.values[0] == ROW_B.values[1] && ROW_B.values[1] == ROW_A.values[2] | |
if PLAYER == ROW_C.values[0] | |
puts "Player playing as #{ROW_C.values[0]}'s won diagonally with squares 3, 5, and 7" | |
else | |
puts "Computer playing as #{ROW_A.values[0]}'s won diagonally with squares 1, 5, and 9" | |
end | |
return true | |
end | |
end | |
end | |
def game_status | |
wins = [win_horizontal?, win_diagonal?, win_vertical?] | |
if wins.include?(true) || AVAILABLE_SQUARES.length == 0 | |
return :over | |
end | |
puts "Available Squares: #{AVAILABLE_SQUARES}" | |
end | |
puts "You are #{PLAYER}'s" | |
print_board | |
until game_status == :over | |
if @turn == :player | |
print "Square Choice: " | |
spot = gets.chomp | |
else | |
spot = AVAILABLE_SQUARES[rand(0..AVAILABLE_SQUARES.size-1)] | |
end | |
place_choice(spot.to_i) | |
print_board | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment