Skip to content
This repository has been archived by the owner on Dec 1, 2021. It is now read-only.

Final #132

Open
wants to merge 45 commits into
base: master
Choose a base branch
from
Open

Final #132

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
25ddc56
Adding tic tac toe class to work with
vogelbek Dec 4, 2013
0a6da71
Accepting a player local variable
vogelbek Dec 4, 2013
695eafb
Welcoming player
vogelbek Dec 4, 2013
1385fae
Don't need the initialize
vogelbek Dec 4, 2013
9168f4c
Sampling an array for a random player
vogelbek Dec 4, 2013
ebaa8e5
SYMBOLS should be defined with setter methods
vogelbek Dec 4, 2013
d6fb7c2
Turns out initialize is needed
vogelbek Dec 4, 2013
21e7719
Initialize has variable numbers of arguments
vogelbek Dec 4, 2013
211028b
I think I need to keep track of the current player
vogelbek Dec 4, 2013
6759f4c
Fixing typo
vogelbek Dec 5, 2013
6015030
Turns must alternate
vogelbek Dec 5, 2013
8cab719
Was changing player back into computer
vogelbek Dec 5, 2013
dbb444c
Apparantly my logic was backwards
vogelbek Dec 5, 2013
b9f10e4
Adding methods
vogelbek Dec 5, 2013
baa8758
Think this is actually the right logic, with a computer instance vari…
vogelbek Dec 5, 2013
4d62cda
Adding player symbols
vogelbek Dec 5, 2013
085ff69
I'm shooting in the dark, no idea what I'm hitting...
vogelbek Dec 5, 2013
5c9905f
Finally making computer accepted as a player
vogelbek Dec 5, 2013
8b21e6b
Figuring out a robust way to handle play symbols
vogelbek Dec 5, 2013
247fbc0
Trying to setup the game board
vogelbek Dec 5, 2013
80e1dda
Making use of that SYMBOLS constant... good refactor
vogelbek Dec 6, 2013
a1c7e32
Setting up methods for computer move.
vogelbek Dec 6, 2013
a6977e4
Successfully generating array of empty spots
vogelbek Dec 6, 2013
b6be44f
Passing test with random computer move
vogelbek Dec 6, 2013
d3610dc
Building displayable board
vogelbek Dec 6, 2013
b845bad
Making use of attr_accessor to modify board
vogelbek Dec 7, 2013
39a6f82
Using player move to change board
vogelbek Dec 7, 2013
230b0eb
Making sure that player move is valid
vogelbek Dec 7, 2013
7dd6814
Player input must be a symbol to key the hash
vogelbek Dec 7, 2013
b648e6a
Developing private method to assess winning situations
vogelbek Dec 8, 2013
b3f19e7
Commenting because the logical math may not be intuitive
vogelbek Dec 8, 2013
e882bbd
First pass at declaring a winner and game over
vogelbek Dec 8, 2013
f71cd2f
Determined where draws occur
vogelbek Dec 8, 2013
b556e04
Can not play the game, despite tests passing. Checking functionality
vogelbek Dec 8, 2013
117330d
Reworking current_player and making sure tests pass
vogelbek Dec 8, 2013
8ab618e
Fixing lack of specifing starting player
vogelbek Dec 8, 2013
dc5b754
The computer wastes moves on empty map values, so injecting into an a…
vogelbek Dec 8, 2013
8214e1a
Actually breaking tests, but making game not fail after first turn
vogelbek Dec 8, 2013
06d2c17
Fixing the ability to detect a winner
vogelbek Dec 8, 2013
4fa4175
Removing debugging statement
vogelbek Dec 8, 2013
4cc04f1
Fixing the bad moves with recursion
vogelbek Dec 8, 2013
6bc48d5
Sooo, not working because the carriage return turns into part of the …
vogelbek Dec 8, 2013
96f9ac8
Making sure correct winner is shown at the end of match
vogelbek Dec 8, 2013
1740bd2
Fixed draw logic to work in play mode
vogelbek Dec 8, 2013
d9d2301
Tearing out debugging puts
vogelbek Dec 8, 2013
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@

Then /^the computer prints "(.*?)"$/ do |arg1|
@game.should_receive(:puts).with(arg1)
@game.indicate_palyer_turn
@game.indicate_player_turn
end

Then /^waits for my input of "(.*?)"$/ do |arg1|
Expand Down
131 changes: 131 additions & 0 deletions week7/homework/features/tic-tac-toe.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
class TicTacToe
attr_accessor :player, :player_symbol, :computer_symbol, :board
SYMBOLS = [:X, :O]

@game_over
@current


def welcome_player
current_state
"Welcome #{@player}"
end

def current_player
@current ||= [@player, "Computer"].sample
if @current == @player
@current = "Computer"
else
@current = @player
end
end

def initialize *name
@current ||= name[0]
name[1] ||= SYMBOLS.sample
@player_symbol = (SYMBOLS.reject {|s| s != name[1]}).first
@computer_symbol = (SYMBOLS.reject {|s| s == @player_symbol}).first
@player = name.first.to_s.capitalize
@board = {A1: ' ', A2: ' ', A3: ' ',
B1: ' ', B2: ' ', B3: ' ',
C1: ' ', C2: ' ', C3: ' '}
end

def indicate_player_turn
puts "#{@player}'s Move:"
end

def get_player_move
gets.chomp.upcase
end

def computer_move
move = open_spots.sample
@board[move] = @computer_symbol.to_s
move
end

def player_move
entered_move = get_player_move.to_sym
if open_spots.include? entered_move
move = entered_move
else
puts "Sorry, that spot isn't available."
move = player_move
end
@board[move] = @player_symbol.to_s
move
end

def open_spots
@board.inject(Array.new) do |remaining, (spot, fill)|
remaining << spot if fill == ' '
remaining
end
end

def current_state
#current state is a display method, building a string that pleasingly displays the @board
<<-board
1 2 3
A #{@board[:A1]} | #{@board[:A2]} | #{@board[:A3]}
--- --- ---
B #{@board[:B1]} | #{@board[:B2]} | #{@board[:B3]}
--- --- ---
C #{@board[:C1]} | #{@board[:C2]} | #{@board[:C3]}
board
end

def determine_winner
@winner = false
winner_hash = {@player_symbol=>@player, @computer_symbol=>"Computer"}
winner_hash.each do |symbol, winner|
winning_play = winning_lines symbol
@winner = winner if winning_play
@game_over = (@game_over or winning_play)
end
if spots_open? == false and @winner == false
@game_over = true
end
end

def player_won?
@winner == @player
end

def computer_won?
@winner == "Computer"
end

def over?
@game_over
end

def draw?
(@game_over == true) and (@winner == false)
end

def spots_open?
@board.has_value?(' ')
end

private
def winning_lines symbol
winning_lines = [[:A1, :A2, :A3],
[:B1, :B2, :B3],
[:C1, :C2, :C3],
[:A1, :B1, :C1],
[:A2, :B2, :C2],
[:A3, :B3, :C3],
[:A3, :B2, :C1],
[:A1, :B2, :C3]]
winning_lines.inject(false) do |won, line|
line_wins = line.inject(true) do |winning, spot|
# A single false creates a false value
winning = (winning and @board[spot].to_sym == symbol)
end
# A single true creates a true value
won = (won or line_wins)
end
end
end
4 changes: 2 additions & 2 deletions week7/homework/play_game.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
require './features/step_definitions/tic-tac-toe.rb'
require './features/tic-tac-toe.rb'

@game = TicTacToe.new
puts "What is your name?"
Expand All @@ -10,7 +10,7 @@
when "Computer"
@game.computer_move
when @game.player
@game.indicate_palyer_turn
@game.indicate_player_turn
@game.player_move
end
puts @game.current_state
Expand Down