Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Lion Calss-Kimia Hasani-C18 #69

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
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
130 changes: 126 additions & 4 deletions adagrams/game.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,133 @@
import random

LETTER_POOL = {
'A': 9,
'B': 2,
'C': 2,
'D': 4,
'E': 12,
'F': 2,
'G': 3,
'H': 2,
'I': 9,
'J': 1,
'K': 1,
'L': 4,
'M': 2,
'N': 6,
'O': 8,
'P': 2,
'Q': 1,
'R': 6,
'S': 4,
'T': 6,
'U': 4,
'V': 2,
'W': 2,
'X': 1,
'Y': 2,
'Z': 1
}

def draw_letters():
pass
#empty list to hold keys
all_letters =[]

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Small style nit: add space after =

#empty list to hole random letter
letter_bank =[]

for key, value in LETTER_POOL.items():
for i in range(value):
all_letters.append(key)
while len(letter_bank) < 10:
letter = random.choice(all_letters)
letter_bank.append(letter)
all_letters.remove(letter)
return letter_bank
Comment on lines 32 to +45

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Awesome logic here! In the future, try to use more descriptive variable names. Instead of key and value, you could say something like letter and repetitions.



def uses_available_letters(word, letter_bank):
pass
#word is string describes some input word
#letter_bank is list of drawn leters in hand(10 string)
#if every letter in input is avilable in letter_bank return Tru
#if not letter in input in letter bank or has to much compare to letter bank return False
upper_letter = word.upper()
dict = {}
for letter in letter_bank:
# print(letter)
if letter in dict:
dict[letter]+=1
dict[letter]=1

for letter in upper_letter:
if letter in dict and dict[letter] > 0:
dict[letter] -=1
continue
else:
return False

return True
Comment on lines 48 to +68

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I really like the idea here! However, there's a bug for words with repeated letters. The loop from lines 55-59 will always set each letter in the word to have a value of 1, even if it shows up multiple times. Line 59 needs to be enclosed in an else to avoid overwriting the updated value.

Smaller stylistic notes: line 64 is unneeded and try to use more descriptive variable names than dict.


def score_word(word):
pass
SCORE_CHART= {
'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
}
score = 0
for letter in word.upper():
score += SCORE_CHART[letter]
if len(word) > 6:
score += 8
return score
Comment on lines +99 to +104

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great logic!


def get_highest_word_score(word_list):
pass

best_word_and_score = [] #did not start with tuple beacuse tuple are immutable
word_and_score = {}

#poulate dictonary with word string as key and score as value
for word in range(len(word_list)):
score = score_word(word_list[word])
word_and_score[word_list[word]] = score
Comment on lines +112 to +114

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider not using a range here. We could just do for word in word_list: and then we wouldn't need to index into the list inside the loop.


#iterate through word_and_scores dictinary to determine best word and score
#called best_word_and_score
for word, score in word_and_score.items():
if not best_word_and_score:
best_word_and_score.append(word)
best_word_and_score.append(score)
elif score > best_word_and_score[1]:
best_word_and_score[1] = score
best_word_and_score[0] = word

elif score == best_word_and_score[1] and len(word)< len(best_word_and_score[0]) and len(best_word_and_score[0]) != 10:
best_word_and_score[1] = score
best_word_and_score[0] = word

elif score == best_word_and_score[1] and len(word) == 10 and len(word) != len(best_word_and_score[0]):
best_word_and_score[1] = score
best_word_and_score[0] = word
return tuple(best_word_and_score)
Comment on lines +118 to +133

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great logic! Instead of having best_word_and_score be a list of length 2, consider just having it be two different variables. Then, combine the two variables into a tuple at the end. That way we don't have to remember which is in index 0 and which is in index 1 in the list as we're performing out logic.