Created
August 22, 2015 20:01
-
-
Save joegiralt/7998c2d8d2fb10f4e5d7 to your computer and use it in GitHub Desktop.
OOP implementation 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_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