Skip to content

Instantly share code, notes, and snippets.

@joegiralt
Created August 22, 2015 20:01
Show Gist options
  • Select an option

  • Save joegiralt/7998c2d8d2fb10f4e5d7 to your computer and use it in GitHub Desktop.

Select an option

Save joegiralt/7998c2d8d2fb10f4e5d7 to your computer and use it in GitHub Desktop.
OOP implementation of tic tac toe
class Board
attr_accessor :pos_1, :pos_2, :pos_3, :pos_4, :pos_5, :pos_6, :pos_7, :pos_8, :pos_9
def initialize(pos_1, pos_2, pos_3, pos_4, pos_5, pos_6, pos_7, pos_8, pos_9)
@pos_1 = pos_1
@pos_2 = pos_2
@pos_3 = pos_3
@pos_4 = pos_4
@pos_5 = pos_5
@pos_6 = pos_6
@pos_7 = pos_7
@pos_8 = pos_8
@pos_9 = pos_9
end
def print
puts """
#{pos_1}|#{pos_2}|#{pos_3}
-----
#{pos_4}|#{pos_5}|#{pos_6}
-----
#{pos_7}|#{pos_8}|#{pos_9}
"""
end
def row_1
[pos_1, pos_2, pos_3]
end
def row_2
[pos_4, pos_5, pos_6]
end
def row_3
[pos_7, pos_8, pos_9]
end
def col_1
[pos_1, pos_4, pos_7]
end
def col_2
[pos_2, pos_5, pos_8]
end
def col_3
[pos_3, pos_6, pos_9]
end
def diag_1
[pos_1, pos_5, pos_9]
end
def diag_2
[pos_3, pos_5, pos_7]
end
def mark_for(player)
if (player.move == 1 && @pos_1 != ('x' || 'o'))
@pos_1 = player.letter
elsif (player.move == 2 && @pos_2 != ('x' || 'o'))
@pos_2 = player.letter
elsif (player.move == 3 && @pos_3 != ('x' || 'o'))
@pos_3 = player.letter
elsif (player.move == 4 && @pos_4 != ('x' || 'o'))
@pos_4 = player.letter
elsif (player.move == 5 && @pos_5 != ('x' || 'o'))
@pos_5 = player.letter
elsif (player.move == 6 && @pos_6 != ('x' || 'o'))
@pos_6 = player.letter
elsif (player.move == 7 && @pos_7 != ('x' || 'o'))
@pos_7 = player.letter
elsif (player.move == 8 && @pos_8 != ('x' || 'o'))
@pos_8 = player.letter
elsif (player.move == 9 && @pos_9 != ('x' || 'o'))
@pos_9 = player.letter
else
InputOutput.invalid_input_msg
player.select_move
end
end
end
class Player
attr_accessor :name, :letter, :human, :move, :board
def initialize(name, letter, is_human)
@name = name
@letter = letter
@human = is_human
@move = nil
@board = nil
end
def select_move
if human
@move = InputOutput.choose_position
else
@move = Computer.choose_position(board, letter)
end
end
end
class Game
attr_accessor :turns_left, :board, :player_1, :player_2
def initialize(board, player_1, player_2)
@turns_left = 9
@board = board
@player_1 = player_1
@player_2 = player_2
end
def self.start!
setup_game
end
def play
if @turns_left.odd?
board.print
player_1.select_move
board.mark_for(player_1)
else
board.print
player_2.select_move
board.mark_for(player_2)
end
if @turns_left < 4 && victory_condition_met?
InputOutput.victory_msg(@turns_left)
exit
end
if @turns_left == 1
InputOutput.draw_msg
exit
end
@turns_left = @turns_left - 1
play
end
def victory_condition_met?
board.row_1.uniq.length == 1 ||
board.row_2.uniq.length == 1 ||
board.row_3.uniq.length == 1 ||
board.col_1.uniq.length == 1 ||
board.col_2.uniq.length == 1 ||
board.col_3.uniq.length == 1 ||
board.diag_1.uniq.length == 1 ||
board.diag_2.uniq.length == 1
end
def self.setup_game
InputOutput.welcome
player_name = InputOutput.get_player_name
player_choice = InputOutput.choose_x_or_o
if player_choice == 'x'
player_1 = Player.new(player_name, player_choice, true)
player_2 = Player.new('Computer', 'o', false)
else
player_1 = Player.new('Computer', 'x', false)
player_2 = Player.new(player_name, player_choice, true)
end
board = Board.new(1, 2, 3, 4, 5, 6, 7, 8, 9)
player_1.board = board
player_2.board = board
new_game = Game.new(board, player_1, player_2)
new_game.play
end
end
class InputOutput
def self.welcome
puts "Welcome"
end
def self.get_player_name
puts "What is your name?"
gets.chomp
end
def self.invalid_input_msg
puts "Please Select a valid input"
end
def self.choose_x_or_o
puts "Choose 'X' or 'O' --- X goes first"
input = gets.chomp.downcase
if input == 'x'
puts 'Ready Player 1'
input
elsif input == 'o'
puts 'Ready Player 2'
input
else
self.invalid_input_msg
self.choose_x_or_o
end
end
def self.choose_position
puts 'choose 1-9'
input = gets.chomp
if input.to_i.integer? && input.to_i > 0 && input.to_i < 10
input.to_i
else
self.invalid_input_msg
self.choose_position
end
end
def self.victory_msg(turn)
if turn.odd?
puts "You've Won!"
else
puts "Better luck next time!"
end
end
def self.draw_msg
puts "Draw!"
end
end
class Computer
def self.choose_position(board,letter)
self.win_if_able(board,letter)
self.block_win(board,letter)
self.fork_if_able(board)
#self.block_center
rand(1..9)
end
def self.win_if_able(board,letter)
1 if (board.pos_2 == board.pos_3 && board.pos_3 == letter) || (board.pos_4 == board.pos_7 && board.pos_7== letter) || (board.pos_5 == board.pos_9 && board.pos_9 == letter)
2 if (board.pos_1 == board.pos_3 && board.pos_3 == letter) || (board.pos_5 == board.pos_8 && board.pos_8== letter)
3 if (board.pos_1 == board.pos_2 && board.pos_2 == letter) || (board.pos_6 == board.pos_9 && board.pos_9== letter) || (board.pos_5 == board.pos_7 && board.pos_7 == letter)
4 if (board.pos_1 == board.pos_7 && board.pos_7 == letter) || (board.pos_5 == board.pos_6 && board.pos_6== letter)
5 if (board.pos_1 == board.pos_9 && board.pos_9 == letter) || (board.pos_3 == board.pos_7 && board.pos_7== letter) || (board.pos_2 == board.pos_8 && board.pos_8 == letter) || (board.pos_4 == board.pos_6 && board.pos_6 == letter)
6 if (board.pos_4 == board.pos_5 && board.pos_5 == letter) || (board.pos_3 == board.pos_9 && board.pos_9== letter)
7 if (board.pos_1 == board.pos_4 && board.pos_4 == letter) || (board.pos_3 == board.pos_5 && board.pos_5== letter) || (board.pos_8 == board.pos_9 && board.pos_9 == letter)
8 if (board.pos_7 == board.pos_9 && board.pos_9 == letter) || (board.pos_2 == board.pos_5 && board.pos_5== letter)
9 if (board.pos_1 == board.pos_4 && board.pos_4 == letter) || (board.pos_3 == board.pos_6 && board.pos_6== letter) || (board.pos_8 == board.pos_7 && board.pos_7 == letter)
end
def self.block_win(board,letter)
# 1 if (board.pos_2 == board.pos_3 != letter) || (board.pos_4 == board.pos_7 != letter) || (board.pos_5 == board.pos_9 != letter)
# 2 if (board.pos_1 == board.pos_3 != letter) || (board.pos_5 == board.pos_8 != letter)
# 3 if (board.pos_1 == board.pos_2 != letter) || (board.pos_6 == board.pos_9 != letter) || (board.pos_5 == board.pos_7 != letter)
# 4 if (board.pos_1 == board.pos_7 != letter) || (board.pos_5 == board.pos_6 != letter)
# 5 if (board.pos_1 == board.pos_9 != letter) || (board.pos_3 == board.pos_7 != letter) || (board.pos_2 == board.pos_8 != letter) || (board.pos_4 != board.pos_6 != letter)
# 6 if (board.pos_4 == board.pos_5 != letter) || (board.pos_3 == board.pos_9 != letter)
# 7 if (board.pos_1 == board.pos_4 != letter) || (board.pos_3 == board.pos_5 != letter) || (board.pos_8 == board.pos_9 != letter)
# 8 if (board.pos_7 == board.pos_9 != letter) || (board.pos_2 == board.pos_5 != letter)
# 9 if (board.pos_1 == board.pos_4 != letter) || (board.pos_3 == board.pos_5 != letter) || (board.pos_8 == board.pos_9 != letter)
end
def self.fork_if_able(board)
# if !board.pos_5.integer?
# 1 if pos_2.integer? && pos_3.integer? && pos_7.integer? && pos_4.integer? && pos_1.integer?
# 3 if pos_2.integer? && pos_1.integer? && pos_6.integer? && pos_9.integer? && pos_3.integer?
# 9 if pos_6.integer? && pos_3.integer? && pos_7.integer? && pos_8.integer? && pos_9.integer?
# 7 if pos_1.integer? && pos_4.integer? && pos_8.integer? && pos_9.integer? && pos_7.integer?
# end
end
def self.block_fork
board_state1 = [board.row1, board.row_2, board.row_3]
board_state2 = [board.col_1, board.col_2, board.col_3]
end
def self.play_center
5
end
def self.play_opposite_corner
#
end
def self.play_empty_corner
#
end
def self.play_empty_side
#
end
end
Game.start!
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment