Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
7fdb17a
Created spec helper file.
abrown152 Mar 8, 2016
a93e551
Created rakefile and spec file.
abrown152 Mar 8, 2016
7c6dce7
Created specs folder.
abrown152 Mar 8, 2016
a182434
created spec sheets and scoring class. Also created scoring hash cons…
abrown152 Mar 8, 2016
1eef307
Added notes for tomorrow.
jadevance Mar 8, 2016
5e4ca83
created spec files for class scoring and class player
jadevance Mar 8, 2016
44340fc
created player.rb
jadevance Mar 8, 2016
6daec94
Delete .DS_Store
jadevance Mar 8, 2016
70b7672
Delete .DS_Store
jadevance Mar 8, 2016
dc75d6d
Update and rename spec_helper.rb to scrabble.rb
jadevance Mar 8, 2016
f59f9b7
Completed baseline requirements
jadevance Mar 8, 2016
2dc2c3b
Wrote a test for 50 point bonus in scoring class method. Also wrote a…
jadevance Mar 8, 2016
c936248
Fixed self.score method and associated tests.
abrown152 Mar 8, 2016
bf2dc05
started working on higest score method.
jadevance Mar 8, 2016
c19f615
Finished wave 1.
abrown152 Mar 8, 2016
0588c81
Started tie-breaker test.
abrown152 Mar 8, 2016
4a196fc
solved the tie breaker problem and all tests pass
jadevance Mar 9, 2016
a8d79d8
Completed Wave 1 requirements and polished tie-breaker scenarios.
abrown152 Mar 9, 2016
fe312d8
Clarified tie breaker code can handle more than two tied words.
abrown152 Mar 9, 2016
bc3a04d
Cleaned up and clarified scoring_spec tests, arranged constants to be…
jadevance Mar 9, 2016
61d161f
Removed extra comments, made all test cases consistent
jadevance Mar 9, 2016
522c699
created a player_spec and player file
jadevance Mar 9, 2016
ac3ecf2
git didn't commit player_spec, doing it again
jadevance Mar 9, 2016
cbdf019
Linked Scoring class to Player class to calculate score of word entered.
abrown152 Mar 9, 2016
7e33806
Added in module scrabble.
jadevance Mar 9, 2016
27dd6ad
Roll back of changes due to confusion
jadevance Mar 10, 2016
47f53ea
Pushing notes and tests
jadevance Mar 10, 2016
e2950bc
Three tests written for player_spec.
jadevance Mar 10, 2016
c4f012b
Scoring test for scores over 100 points returns false.
jadevance Mar 10, 2016
6f5bd41
wrote a test for returning an array of words played
jadevance Mar 10, 2016
ba42f13
Wave 2 complete
jadevance Mar 10, 2016
4912010
Created skeleton of TileBag class and spec for wave 3
jadevance Mar 11, 2016
d958642
Updates to logic for TileBag tracking
jadevance Mar 11, 2016
5375fbe
Added skeleton to testing tilebag specs
jadevance Mar 11, 2016
798bf57
Updated my directory.
abrown152 Mar 11, 2016
74d2fd1
Finished draw_tiles method.
abrown152 Mar 11, 2016
12891f6
completed wave 3
jadevance Mar 11, 2016
dd407e2
fixed indentation, cleaned up comments.
jadevance Mar 12, 2016
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
9 changes: 9 additions & 0 deletions Rakefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
require 'rake/testtask'

Rake::TestTask.new do |t|
t.libs = ["lib"]
t.warning = true
t.test_files = FileList['specs/*_spec.rb']
end

task default: :test
69 changes: 69 additions & 0 deletions lib/player.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
require_relative '../lib/scoring'
require_relative '../lib/tilebag'

class Player
WINNING_SCORE = 100

def initialize(name, scores_array=[], words_played=[])
@name = name
@scores_array = scores_array
@words_played = words_played
return @name
end

def name_return
@name
end

# returns sum of scores of played words
def total_score
@scores_array.reduce(0, :+)
end

# returns an array of all the words played by Player
def plays
return @words_played
end

# adds word to the words_played array
def play(word)
# test to see if score is over 100
if @scores_array.reduce(0, :+) >= WINNING_SCORE
return false
end
@words_played << word
@scores_array << Scoring.score(word)
end

# returns true if over 100pts, otherwise false(haven't won yet)
def won?
if @scores_array.reduce(0, :+) >= WINNING_SCORE
"You win!"
return true
else
"You haven't won yet."
return false
end
end

# returns highest scored word from words_played array
def highest_scoring_word
Scoring.highest_score_from(@words_played)
end

# returns the highest score
def highest_word_score
@scores_array.max
end

def draw_tiles(number_of_tiles)
tilebag = TileBag.new
tilebag.draw_tiles(number_of_tiles)
end

def tiles(number_of_tiles)
tilebag = TileBag.new
tilebag = draw_tiles(number_of_tiles)
end
end

91 changes: 91 additions & 0 deletions lib/scoring.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
class Scoring
LETTER_SCORING = {
"A" => 1,
"B" => 3,
"C" => 3,
"D" => 2,
"E" => 1,
"F" => 4,
"G" => 2,
"H" => 4,
"I" => 1,
"J" => 8,
"K" => 5,
"L" => 1,
"M" => 3,
"N" => 1,
"O" => 1,
"P" => 3,
"Q" => 10,
"R" => 1,
"S" => 1,
"T" => 1,
"U" => 1,
"V" => 4,
"W" => 4,
"X" => 8,
"Y" => 4,
"Z" => 10,
}

def self.score(word)
word = word.upcase!
word_array = word.split("") # could use .chars here
score_value = 0

# applies 50 point bonus for words >= 7 letters
amount_of_loops = word_array.length
if amount_of_loops >= 7
score_value +=50
end
word_array.each do |letter|
LETTER_SCORING.each do |hash_letter, point_value|
if hash_letter == letter
score_value += point_value
end
end
end
return score_value.to_i
end

def self.highest_score_from(array_of_words)
score_values_array = []

array_of_words = array_of_words.map(&:upcase)
array_of_words.each do |word_in_array|
score_value = 0
letter_array = word_in_array.split("")
# checks for the 50 point bonus
amount_of_loops = letter_array.length
if amount_of_loops >= 7
score_value +=50
end

#split each word into letters, scan and score each letter
letter_array.each do |letter|
LETTER_SCORING.each do |hash_letter, point_value|
if hash_letter == letter
score_value += point_value
end
end
end
# collects all of the scores for each word
score_values_array << score_value
end

# index of the highest scoring word = array of word values()
high_value_index = score_values_array.index(score_values_array.max)

# used to check for a tie
tie_value_index =
score_values_array.each_index.select {|i| score_values_array[i] == score_values_array.max}
# tie_value_index holds the indexes of the highest score. if more than one, it's a tie
if tie_value_index.length > 1
#can handle any number of words that are tied
return tie_value_index.min{|a, b| a.size <=> b.size}
else
# returns the highest value word when there is no tie
return array_of_words[high_value_index]
end
end
end
27 changes: 27 additions & 0 deletions lib/tilebag.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
class TileBag

def initialize
@tilebag = [
"A", "A", "A", "A", "A", "A", "A", "A", "A", "N", "N", "N", "N", "N", "N",
"B", "B", "O", "O", "O", "O", "O", "O", "O", "O", "C", "C", "P", "P", "D",
"D", "D", "D", "Q", "E", "E", "E", "E", "E", "E", "E", "E", "E", "E", "E",
"E", "R", "R", "R", "R", "R", "R", "F", "F", "S", "S", "S", "S", "G", "G",
"G", "T", "T", "T", "T", "T", "T", "H", "H", "U", "U", "U", "U", "I", "I",
"I", "I", "I", "I", "I", "I", "I", "V", "V", "J", "W", "W", "K", "X", "L",
"L", "L", "L", "Y", "Y", "M", "M", "Z"
]
end

def draw_tiles(number_of_tiles)
if number_of_tiles > 7
raise ArgumentError,"That's too many tiles! Stop CHEATING"
else
@tilebag = @tilebag.shuffle
tiles_drawn = @tilebag.shift(number_of_tiles)
end
end

def tiles_remaining
@tilebag.length
end
end
1 change: 1 addition & 0 deletions scrabble.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

93 changes: 93 additions & 0 deletions specs/player_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
require_relative './spec_helper'
require_relative '../lib/player'
require_relative '../lib/tilebag'

describe Player do
WORDS_PLAYED = ["GOAT", "PUPPY", "MONKEY", "CAT", "WHALES", "IGUANA"]
HIGH_SCORE_TEST = [200]

# TEST 1
it "Player is an object we have access to" do
Player.wont_be_nil
end

# TEST 2
it "should return a name when entered" do
fran = Player.new("Fran")
assert_equal "Fran", fran.name_return
end

# TEST 3
it "should allow the player to play a word" do
fran = Player.new("Fran")
assert_equal [8], fran.play("word")
end

# TEST 4
it "should return an array of words played" do
fran = Player.new("Fran")
fran.play("goat")
fran.play("puppy")
fran.play("monkey")
fran.play("cat")
fran.play("whales")
fran.play("iguana")
assert_equal WORDS_PLAYED, fran.plays
end

# TEST 5
it "return false if player plays when score is >= 100" do
chacha = Player.new("ChaCha", HIGH_SCORE_TEST)
assert_equal false, chacha.play("word")
end

# TEST 6
it "should return true for winning" do
chacha = Player.new("ChaCha", HIGH_SCORE_TEST)
assert true, chacha.won?
end

# TEST 7
it "should return total score of words played so far" do
fran = Player.new("Fran")
fran.play("goat")
fran.play("puppy")
assert_equal 19, fran.total_score
end
# TEST 8
it "should return highest scoring word played" do
fran = Player.new("Fran")
fran.play("goat")
fran.play("puppy")
assert_equal "PUPPY", fran.highest_scoring_word
end
# TEST 9
it "should return highest word score" do
fran = Player.new("Fran")
fran.play("goat")
fran.play("puppy")
assert_equal 14, fran.highest_word_score
end
# TEST 10
it "returns the score of a word played" do
fran = Player.new("Fran")
assert_equal [14], fran.play("puppy")
end
# TEST 11
it "player class accepts one argument" do
assert_raises(ArgumentError) {fran = Player.new}
end

# TEST 12
it "raises an error if too many tiles are drawn" do
fran = Player.new("Fran")
assert_raises(ArgumentError) {fran.tiles(10)}
end

# TEST 13
it "returns a number of tiles when drawn" do
fran = Player.new("Fran")
refute_equal nil, fran.draw_tiles(7)
end
end

53 changes: 53 additions & 0 deletions specs/scoring_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
require_relative './spec_helper'
require_relative '../lib/scoring'

describe Scoring do
# Test 5
HIGH_SCORE = ["dog", "bird", "quiz", "bug"]
# Test 6
FIFTY_POINT_HIGH_SCORE = ["dog", "bird", "quiz", "require"]
# Test 7
RETURN_FEWEST_LETTERS_TIE = ["ale", "hi", "zinc", "cat", "squad", "butts"]
# Test 8
RETURN_FIRST_WORD_TIE = ["ale", "hi", "zaps", "cat", "squad", "butts", "zinc"]

# TEST 1
it "Scoring is an object we have access to" do
Scoring.wont_be_nil
end
# TEST 2
it "is a class method we have access to" do
Scoring.score("test").wont_be_nil
end
# TEST 3
it "validates score method returns correct score" do
Scoring.score("pig")
return 6
end
# TEST 4
it "50-point bonus is applied to words >= 7 letters" do
Scoring.score("require")
return 66
end
# TEST 5
it "returns the highest scoring word" do
Scoring.highest_score_from(HIGH_SCORE)
return "quiz"
end
# TEST 6
it "returns highest scoring word with 50 point bonus" do
Scoring.highest_score_from(FIFTY_POINT_HIGH_SCORE)
return "require"
end
# TEST 7
it "returns the word with the fewest letters during a tie" do
Scoring.highest_score_from(RETURN_FEWEST_LETTERS_TIE)
return "zinc"
end
# TEST 8
# for highest score and fewest letters
it "returns first given word during a tie" do
Scoring.highest_score_from(RETURN_FIRST_WORD_TIE)
return "zaps"
end
end
10 changes: 10 additions & 0 deletions specs/spec_helper.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
require 'simplecov'
SimpleCov.start

require 'minitest'
require 'minitest/spec'
require 'minitest/autorun'
require 'minitest/reporters'

#give us some really pretty output :)
Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new
35 changes: 35 additions & 0 deletions specs/tilebag_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
require_relative './spec_helper'
require_relative '../lib/tilebag'

describe TileBag do

# TEST 1
it "is an object we have access to" do
TileBag.wont_be_nil
end

# TEST 2
it "draw tiles accepts an argument" do
chacha = TileBag.new
chacha.draw_tiles(7).wont_be_nil
end

# TEST 3
it "draw tiles returns tiles drawn" do
chacha = TileBag.new
chacha.draw_tiles(7).wont_be_nil
end

# TEST 4
it "tiles remaining returns the length" do
chacha = TileBag.new
chacha.draw_tiles(7)
assert_equal 91, chacha.tiles_remaining
end

# TEST 5
it "errors when more than seven tiles are drawn" do
chacha = TileBag.new
assert_raises(ArgumentError) {chacha.draw_tiles(10)}
end
end