tic_tac_toe_wilbertcr 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/bin/tic_tac_toe ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ require_relative "../lib/tic_tac_toe.rb"
3
+
4
+ first_player = Players.human(1,2)
5
+ first_player.name=("Human")
6
+
7
+ second_player = Players.machine(2,1)
8
+ second_player.name=("Machine")
9
+ session = Game.new(first_player,second_player)
10
+ session.play()
@@ -0,0 +1,8 @@
1
+
2
+ require_relative "./tic_tac_toe/Board.rb"
3
+ require_relative "./tic_tac_toe/Players.rb"
4
+ require_relative "./tic_tac_toe/Display.rb"
5
+ require_relative "./tic_tac_toe/Human.rb"
6
+ require_relative "./tic_tac_toe/Machine.rb"
7
+ require_relative "./tic_tac_toe/Game.rb"
8
+
@@ -0,0 +1,92 @@
1
+ class Board
2
+
3
+ @patterns_array
4
+ Winner_not_found = -1
5
+
6
+ def initialize()
7
+ @board = [0,0,0,0,0,0,0,0,0]
8
+ end
9
+
10
+ def game_tied?()
11
+ return @board.index(0) == nil
12
+ end
13
+
14
+ def game_over?()
15
+ return get_winner_id() != Winner_not_found || game_tied?()
16
+ end
17
+
18
+ def get_winner_id()
19
+ @patterns_array = []
20
+ check_patterns()
21
+ winner = @patterns_array.first
22
+ winner.nil? ? Winner_not_found : winner
23
+ end
24
+
25
+ def get_cell(position)
26
+ @board[position]
27
+ end
28
+
29
+ def set_cell(value, cell_position)
30
+ @board[cell_position] = value
31
+ end
32
+
33
+ def empty_cell?(position)
34
+ @board[position] == 0
35
+ end
36
+
37
+ def cells_equal?(first_cell,second_cell)
38
+ get_cell(first_cell)==get_cell(second_cell)
39
+ end
40
+
41
+ def cell_symbol(position)
42
+ value = get_cell(position)
43
+ case value
44
+ when 0
45
+ " "
46
+ when 1
47
+ " X "
48
+ when 2
49
+ " O "
50
+ end
51
+ end
52
+
53
+ private
54
+
55
+ def check_patterns()
56
+ check_vertical_pattern()
57
+ check_horizontal_pattern()
58
+ check_diagonal_pattern()
59
+ end
60
+
61
+ def check_vertical_pattern()
62
+ top_cell = 0; center = 3; bottom_cell = 6;
63
+ 3.times do
64
+ pattern_scanner(top_cell, center, bottom_cell)
65
+ top_cell +=1; center +=1; bottom_cell +=1;
66
+ end
67
+ end
68
+
69
+ def check_horizontal_pattern()
70
+ left_cell = 0; center = 1; right_cell = 2;
71
+ 3.times do
72
+ pattern_scanner(left_cell, center, right_cell)
73
+ left_cell +=3; center +=3; right_cell +=3;
74
+ end
75
+ end
76
+
77
+ def check_diagonal_pattern()
78
+ first_cell = 0; center = 4; last_cell = 8;
79
+ 2.times do
80
+ pattern_scanner(first_cell, center, last_cell)
81
+ first_cell = 2; last_cell = 6;
82
+ end
83
+ end
84
+
85
+ def pattern_scanner(first_cell, second_cell, third_cell)
86
+ if (!empty_cell?(first_cell) && cells_equal?(first_cell,second_cell) &&
87
+ cells_equal?(second_cell,third_cell))
88
+ @patterns_array.push(get_cell(first_cell))
89
+ end
90
+ end
91
+
92
+ end
@@ -0,0 +1,55 @@
1
+ class Display
2
+
3
+ @player1
4
+ @player2
5
+
6
+ def initialize(player1, player2)
7
+ @player1 = player1
8
+ @player2 = player2
9
+ end
10
+
11
+ def game_instructions()
12
+ puts "Goal:"
13
+ puts ""
14
+ puts "The goal of Tic Tac Toe is to be the first player to get"
15
+ puts "three in a row on a 3x3 grid."
16
+ puts ""
17
+ puts "Instructions:"
18
+ puts ""
19
+ puts "In order to enter your move, please provide an integer between"
20
+ puts "1 and 9, the numbers represent the positions in the board the"
21
+ puts "following way:"
22
+ puts "----------------\n"
23
+ puts "| 1 | 2 | 3 |\n"
24
+ puts "----------------\n"
25
+ puts "| 4 | 5 | 6 |\n"
26
+ puts "----------------\n"
27
+ puts "| 7 | 8 | 9 |\n"
28
+ puts "----------------\n"
29
+ end
30
+
31
+ def board(board,security=true)
32
+ puts "-------------\n"
33
+ puts "|#{board.cell_symbol(0)}|#{board.cell_symbol(1)}|#{board.cell_symbol(2)}|\n"
34
+ puts "-------------\n"
35
+ puts "|#{board.cell_symbol(3)}|#{board.cell_symbol(4)}|#{board.cell_symbol(5)}|\n"
36
+ puts "-------------\n"
37
+ puts "|#{board.cell_symbol(6)}|#{board.cell_symbol(7)}|#{board.cell_symbol(8)}|\n"
38
+ puts "-------------\n"
39
+ end
40
+
41
+ def game_result(winner)
42
+ if winner == @player1.id
43
+ puts "Congratulations #{@player1.name}"
44
+ elsif winner == @player2.id
45
+ puts "Congratulations #{@player2.name}"
46
+ else #Game is a tie
47
+ puts "Game was a tie"
48
+ end
49
+ end
50
+
51
+ def player_move(player,move)
52
+ puts "#{player.name} move is: #{move+1}"
53
+ end
54
+
55
+ end
@@ -0,0 +1,42 @@
1
+ class Game
2
+
3
+ attr_reader :Player1,:Player2
4
+
5
+ Winner_not_found = -1
6
+
7
+ def initialize(player1, player2)
8
+ @Player1 = player1
9
+ @Player2 = player2
10
+ @Board = Board.new()
11
+ @Display = Display.new(@Player1,@Player2)
12
+ @current_player = @Player1
13
+ end
14
+
15
+ def play()
16
+ @Display.game_instructions()
17
+ while !@Board.game_over?
18
+ play_turn()
19
+ update_current_player
20
+ end
21
+ @Display.game_result(@Board.get_winner_id)
22
+ end
23
+
24
+ private
25
+
26
+ def play_turn()
27
+ player_move = @current_player.get_move(@Board)
28
+ @Display.player_move(@current_player,player_move)
29
+ update_and_display_board(@current_player.id, player_move)
30
+ end
31
+
32
+ def update_current_player()
33
+ @current_player = (@current_player == @Player1) ? @Player2 : @Player1
34
+ end
35
+
36
+ def update_and_display_board(player,move)
37
+ @Board.set_cell(player,move)
38
+ @Display.board(@Board)
39
+ end
40
+
41
+ end
42
+
@@ -0,0 +1,37 @@
1
+
2
+ class Human
3
+
4
+ attr_accessor :name
5
+ attr_reader :id
6
+
7
+ @board
8
+ @id
9
+ @opponent_identifier
10
+
11
+ def initialize(my_id,opponent_id)
12
+ @id = my_id
13
+ @opponent_id = opponent_id
14
+ @name = "Human"
15
+ end
16
+
17
+ def get_move(board)
18
+ @board = board
19
+ move = 0
20
+ while invalid_move?(move)
21
+ puts "Please provide your move:"
22
+ STDOUT.flush()
23
+ move = gets.chomp.to_i
24
+ if invalid_move?(move)
25
+ puts "Incorrect input provided, please try again."
26
+ end
27
+ end
28
+ move-1 #Array is 0...8, human player's options are 1..9
29
+ end
30
+
31
+ private
32
+
33
+ def invalid_move?(move)
34
+ !(1..9).include?(move) || !@board.empty_cell?(move-1)
35
+ end
36
+
37
+ end
@@ -0,0 +1,103 @@
1
+ class Machine
2
+
3
+ attr_accessor :name
4
+ attr_reader :id
5
+
6
+ @patternsMatrix
7
+ @board
8
+ @id
9
+ @opponent_id
10
+
11
+ def initialize(my_id,opponent_id)
12
+ @patternsMatrix = []
13
+ @id = my_id
14
+ @opponent_id = opponent_id
15
+ @name = "Hal"
16
+ end
17
+
18
+ def get_move(board)
19
+ @board = board
20
+ strategies_array = get_strategies_array()
21
+ winning_strategy = strategies_array[0]
22
+ blocking_strategy = strategies_array[1]
23
+ no_strategy = strategies_array[2]
24
+ move = winning_strategy
25
+ if move.nil?
26
+ move = blocking_strategy
27
+ if move.nil?
28
+ move = no_strategy
29
+ end
30
+ end
31
+ move.first
32
+ end
33
+
34
+ private
35
+
36
+ def get_strategies_array()
37
+ @patternsMatrix = []
38
+ find_vertical_pattern()
39
+ find_horizontal_pattern()
40
+ find_diagonal_pattern()
41
+ get_first_available_move()
42
+ return [@patternsMatrix.rassoc(@id),@patternsMatrix.rassoc(@opponent_id),@patternsMatrix.rassoc(-1)]
43
+ end
44
+
45
+ def find_vertical_pattern()
46
+ top_position = 0; mid_position = 3; bottom_position = 6
47
+ 3.times do
48
+ checkLinesForPattern(top_position, mid_position, bottom_position)
49
+ top_position +=1; mid_position +=1; bottom_position +=1
50
+ end
51
+ end
52
+
53
+ def find_horizontal_pattern()
54
+ left_position = 0; mid_position = 1; right_position = 2
55
+ 3.times do
56
+ checkLinesForPattern(left_position, mid_position, right_position)
57
+ left_position +=3; mid_position +=3; right_position +=3
58
+ end
59
+ end
60
+
61
+ def find_diagonal_pattern()
62
+ first = 0 ; second = 4; third = 8
63
+ 2.times do
64
+ checkLinesForPattern(first, second, third)
65
+ first = 2; third = 6
66
+ end
67
+ end
68
+
69
+ def get_first_available_move()
70
+ if @board.empty_cell?(4)
71
+ @patternsMatrix.push([4,-1])
72
+ elsif @board.empty_cell?(0)
73
+ @patternsMatrix.push([0,-1])
74
+ elsif @board.empty_cell?(2)
75
+ @patternsMatrix.push([2,-1])
76
+ elsif @board.empty_cell?(6)
77
+ @patternsMatrix.push([6,-1])
78
+ elsif @board.empty_cell?(8)
79
+ @patternsMatrix.push([8,-1])
80
+ else
81
+ random_generator = Random.new
82
+ move = random_generator.rand(0..8)
83
+ while !@board.empty_cell?(move)
84
+ move = random_generator.rand(0..8)
85
+ end
86
+ @patternsMatrix.push([move,-1])
87
+ end
88
+ end
89
+
90
+ def checkLinesForPattern(first_position, second_position, third_position)
91
+ if (!@board.empty_cell?(first_position) && @board.cells_equal?(first_position,second_position) &&
92
+ @board.empty_cell?(third_position))
93
+ @patternsMatrix.push([third_position,@board.get_cell(first_position)])
94
+ elsif (!@board.empty_cell?(first_position) && @board.cells_equal?(first_position,third_position) &&
95
+ @board.empty_cell?(second_position))
96
+ @patternsMatrix.push([second_position,@board.get_cell(first_position)])
97
+ elsif (!@board.empty_cell?(second_position) && @board.cells_equal?(second_position,third_position) &&
98
+ @board.empty_cell?(first_position))
99
+ @patternsMatrix.push([first_position,@board.get_cell(second_position)])
100
+ end
101
+ end
102
+
103
+ end
@@ -0,0 +1,11 @@
1
+ class Players
2
+
3
+ def self.human(my_id, opponent_id)
4
+ Human.new(my_id, opponent_id)
5
+ end
6
+
7
+ def self.machine(my_id,opponent_id)
8
+ Machine.new(my_id, opponent_id)
9
+ end
10
+
11
+ end
metadata ADDED
@@ -0,0 +1,53 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tic_tac_toe_wilbertcr
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Wilbert Sequeira
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-06-14 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: Console Tic Tac Toe game
15
+ email: wilbertcr@gmail.com
16
+ executables:
17
+ - tic_tac_toe
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - lib/tic_tac_toe.rb
22
+ - lib/tic_tac_toe/Human.rb
23
+ - lib/tic_tac_toe/Players.rb
24
+ - lib/tic_tac_toe/Machine.rb
25
+ - lib/tic_tac_toe/Game.rb
26
+ - lib/tic_tac_toe/Board.rb
27
+ - lib/tic_tac_toe/Display.rb
28
+ - bin/tic_tac_toe
29
+ homepage: http://rubygems.org/gems/tic_tac_toe
30
+ licenses: []
31
+ post_install_message:
32
+ rdoc_options: []
33
+ require_paths:
34
+ - lib
35
+ required_ruby_version: !ruby/object:Gem::Requirement
36
+ none: false
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ required_rubygems_version: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ requirements: []
48
+ rubyforge_project:
49
+ rubygems_version: 1.8.25
50
+ signing_key:
51
+ specification_version: 3
52
+ summary: Tic tac toe console game
53
+ test_files: []