import string
class Tile:
"""
Class that allows for the creation of a tile. Initializes using an uppercase string of one letter,
and an integer representing that letter's score.
"""
def __init__(self, letter):
#Initializes the tile class. Takes the letter as a string, and the dictionary of letter values as arguments.
scrabble_letters = {"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}
if len(letter) != 1:
raise Exception("Must be only one character")
if letter.isalpha():
self.letter = letter.upper()
else:
raise Exception("This value must be a single letter")
self.points = scrabble_letters[self.letter]
def _letter(self):
#Returns the tile's letter (string).
return self.letter
def _points(self):
#Returns the tile's score value.
return self.points
from random import shuffle
import string
class TileBag:
def __init__(self):
self.tilebag = []
self.fill_bag()
def full_bag(self, tile, count):
for i in range(count):
self.tilebag.append(Tile)
def fill_bag(self):
self.full_bag(Tile("A"), 9)
self.full_bag(Tile("B"), 3)
self.full_bag(Tile("C"), 2)
self.full_bag(Tile("D"), 4)
self.full_bag(Tile("E"), 12)
self.full_bag(Tile("F"), 2)
self.full_bag(Tile("G"), 3)
self.full_bag(Tile("H"), 2)
self.full_bag(Tile("I"), 9)
self.full_bag(Tile("J"), 1)
self.full_bag(Tile("K"), 1)
self.full_bag(Tile("L"), 4)
self.full_bag(Tile("M"), 2)
self.full_bag(Tile("N"), 6)
self.full_bag(Tile("O"), 8)
self.full_bag(Tile("P"), 2)
self.full_bag(Tile("Q"), 1)
self.full_bag(Tile("R"), 6)
self.full_bag(Tile("S"), 4)
self.full_bag(Tile("T"), 6)
self.full_bag(Tile("U"), 4)
self.full_bag(Tile("V"), 2)
self.full_bag(Tile("W"), 2)
self.full_bag(Tile("X"), 1)
self.full_bag(Tile("Y"), 2)
self.full_bag(Tile("Z"), 1)
def draw_tile(self):
if len(self.tilebag) < 1:
raise Exception("Cannot Draw From Empty Bag!")
else:
shuffle(self.tilebag)
return self.tilebag.pop()
def is_empty(self):
if (self.tilebag):
return False
else:
return True
import unittest
import string
class TestTilePoints(unittest.TestCase):
def setUp(self):
a = Title("A")
b = Title("b")
c = Title("c")
d = Title("d")
e = Title("E")
f = Title("f")
g = Title("g")
h = Title("h")
i = Title("i")
j = Title("j")
k = Title("k")
l = Title("l")
m = Title("m")
n = Title("n")
o = Title("o")
p = Title("p")
q = Title("q")
r = Title("r")
s = Title("s")
t = Title("T")
u = Title("U")
v = Title("v")
w = Title("W")
x = Title("x")
y = Title("Y")
z = Title("z")
def test_error_on_None(self):
self.assertRaises( Exception, Tile(None))
def test_error_on_empty_string(self):
self.assertRaises( Exception, Tile(""))
def test_letters(self):
alphabets = string.ascii_lowercase
for i in alphabets:
self.assertEquals( Tile(i), Tile(i))
def test_error_on_non_letter(self):
self.assertRaises( Exception, Tile(4))
def test_error_on_too_many_letters(self):
self.assertRaises( Exception, Tile("WOAH"))
def test_one_point_tiles(self):
self.assertEquals(1,a._points())
self.assertEquals(1,e._points())
self.assertEquals(1,i._points())
self.assertEquals(1,o._points())
self.assertEquals(1,n._points())
self.assertEquals(1,r._points())
self.assertEquals(1,t._points())
self.assertEquals(1,l._points())
self.assertEquals(1,s._points())
self.assertEquals(1,u._points())
aW1wb3J0IHN0cmluZwoKCmNsYXNzIFRpbGU6CiAgICAiIiIKICAgIENsYXNzIHRoYXQgYWxsb3dzIGZvciB0aGUgY3JlYXRpb24gb2YgYSB0aWxlLiBJbml0aWFsaXplcyB1c2luZyBhbiB1cHBlcmNhc2Ugc3RyaW5nIG9mIG9uZSBsZXR0ZXIsCiAgICBhbmQgYW4gaW50ZWdlciByZXByZXNlbnRpbmcgdGhhdCBsZXR0ZXIncyBzY29yZS4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGxldHRlcik6CiAgICAgICAgI0luaXRpYWxpemVzIHRoZSB0aWxlIGNsYXNzLiBUYWtlcyB0aGUgbGV0dGVyIGFzIGEgc3RyaW5nLCBhbmQgdGhlIGRpY3Rpb25hcnkgb2YgbGV0dGVyIHZhbHVlcyBhcyBhcmd1bWVudHMuCiAgICAgICAgc2NyYWJibGVfbGV0dGVycyA9IHsiQSI6IDEsCiAgICAgICAgICAgICAgICAgIkIiOiAzLAogICAgICAgICAgICAgICAgICJDIjogMywKICAgICAgICAgICAgICAgICAiRCI6IDIsCiAgICAgICAgICAgICAgICAgIkUiOiAxLAogICAgICAgICAgICAgICAgICJGIjogNCwKICAgICAgICAgICAgICAgICAiRyI6IDIsCiAgICAgICAgICAgICAgICAgIkgiOiA0LAogICAgICAgICAgICAgICAgICJJIjogMSwKICAgICAgICAgICAgICAgICAiSiI6IDgsCiAgICAgICAgICAgICAgICAgIksiOiA1LAogICAgICAgICAgICAgICAgICJMIjogMSwKICAgICAgICAgICAgICAgICAiTSI6IDMsCiAgICAgICAgICAgICAgICAgIk4iOiAxLAogICAgICAgICAgICAgICAgICJPIjogMSwKICAgICAgICAgICAgICAgICAiUCI6IDMsCiAgICAgICAgICAgICAgICAgIlEiOiAxMCwKICAgICAgICAgICAgICAgICAiUiI6IDEsCiAgICAgICAgICAgICAgICAgIlMiOiAxLAogICAgICAgICAgICAgICAgICJUIjogMSwKICAgICAgICAgICAgICAgICAiVSI6IDEsCiAgICAgICAgICAgICAgICAgIlYiOiA0LAogICAgICAgICAgICAgICAgICJXIjogNCwKICAgICAgICAgICAgICAgICAiWCI6IDgsCiAgICAgICAgICAgICAgICAgIlkiOiA0LAogICAgICAgICAgICAgICAgICJaIjogMTB9CiAgICAgICAgaWYgbGVuKGxldHRlcikgIT0gMToKICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiTXVzdCBiZSBvbmx5IG9uZSBjaGFyYWN0ZXIiKQogICAgICAgIGlmIGxldHRlci5pc2FscGhhKCk6CiAgICAgICAgICAgICBzZWxmLmxldHRlciA9IGxldHRlci51cHBlcigpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiVGhpcyB2YWx1ZSBtdXN0IGJlIGEgc2luZ2xlIGxldHRlciIpCiAgICAgICAgc2VsZi5wb2ludHMgPSBzY3JhYmJsZV9sZXR0ZXJzW3NlbGYubGV0dGVyXQogICAgIAoKICAgIGRlZiBfbGV0dGVyKHNlbGYpOgogICAgICAgICNSZXR1cm5zIHRoZSB0aWxlJ3MgbGV0dGVyIChzdHJpbmcpLgogICAgICAgIHJldHVybiBzZWxmLmxldHRlcgoKICAgIGRlZiBfcG9pbnRzKHNlbGYpOgogICAgICAgICNSZXR1cm5zIHRoZSB0aWxlJ3Mgc2NvcmUgdmFsdWUuCiAgICAgICAgcmV0dXJuIHNlbGYucG9pbnRzCgoKCgpmcm9tIHJhbmRvbSBpbXBvcnQgc2h1ZmZsZQppbXBvcnQgc3RyaW5nCgoKCgoKY2xhc3MgVGlsZUJhZzoKCWRlZiBfX2luaXRfXyhzZWxmKToKCQlzZWxmLnRpbGViYWcgPSBbXQoJCXNlbGYuZmlsbF9iYWcoKQoJCQoJZGVmIGZ1bGxfYmFnKHNlbGYsIHRpbGUsIGNvdW50KToKCQlmb3IgaSBpbiByYW5nZShjb3VudCk6CiAgICAgICAgICAgIAkJc2VsZi50aWxlYmFnLmFwcGVuZChUaWxlKQoKCWRlZiBmaWxsX2JhZyhzZWxmKToKICAgICAgICAgICAgICAgICAgICBzZWxmLmZ1bGxfYmFnKFRpbGUoIkEiKSwgOSkKICAgICAgICAgICAgICAgICAgICBzZWxmLmZ1bGxfYmFnKFRpbGUoIkIiKSwgMykKICAgICAgICAgICAgICAgICAgICBzZWxmLmZ1bGxfYmFnKFRpbGUoIkMiKSwgMikKICAgICAgICAgICAgICAgICAgICBzZWxmLmZ1bGxfYmFnKFRpbGUoIkQiKSwgNCkKICAgICAgICAgICAgICAgICAgICBzZWxmLmZ1bGxfYmFnKFRpbGUoIkUiKSwgMTIpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5mdWxsX2JhZyhUaWxlKCJGIiksIDIpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5mdWxsX2JhZyhUaWxlKCJHIiksIDMpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5mdWxsX2JhZyhUaWxlKCJIIiksIDIpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5mdWxsX2JhZyhUaWxlKCJJIiksIDkpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5mdWxsX2JhZyhUaWxlKCJKIiksIDEpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5mdWxsX2JhZyhUaWxlKCJLIiksIDEpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5mdWxsX2JhZyhUaWxlKCJMIiksIDQpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5mdWxsX2JhZyhUaWxlKCJNIiksIDIpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5mdWxsX2JhZyhUaWxlKCJOIiksIDYpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5mdWxsX2JhZyhUaWxlKCJPIiksIDgpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5mdWxsX2JhZyhUaWxlKCJQIiksIDIpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5mdWxsX2JhZyhUaWxlKCJRIiksIDEpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5mdWxsX2JhZyhUaWxlKCJSIiksIDYpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5mdWxsX2JhZyhUaWxlKCJTIiksIDQpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5mdWxsX2JhZyhUaWxlKCJUIiksIDYpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5mdWxsX2JhZyhUaWxlKCJVIiksIDQpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5mdWxsX2JhZyhUaWxlKCJWIiksIDIpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5mdWxsX2JhZyhUaWxlKCJXIiksIDIpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5mdWxsX2JhZyhUaWxlKCJYIiksIDEpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5mdWxsX2JhZyhUaWxlKCJZIiksIDIpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5mdWxsX2JhZyhUaWxlKCJaIiksIDEpCgoJZGVmIGRyYXdfdGlsZShzZWxmKToKCSAgaWYgbGVuKHNlbGYudGlsZWJhZykgPCAxOgoJICAgIHJhaXNlIEV4Y2VwdGlvbigiQ2Fubm90IERyYXcgRnJvbSBFbXB0eSBCYWchIikKCSAgZWxzZToKCSAgICBzaHVmZmxlKHNlbGYudGlsZWJhZykKCSAgICByZXR1cm4gc2VsZi50aWxlYmFnLnBvcCgpCgoJZGVmIGlzX2VtcHR5KHNlbGYpOgogICAgICAgICAgICBpZiAoc2VsZi50aWxlYmFnKToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAgICAgCmltcG9ydCB1bml0dGVzdAppbXBvcnQgc3RyaW5nCgoKY2xhc3MgVGVzdFRpbGVQb2ludHModW5pdHRlc3QuVGVzdENhc2UpOgogIGRlZiBzZXRVcChzZWxmKToKICAgIGEgPSBUaXRsZSgiQSIpCiAgICBiID0gVGl0bGUoImIiKQogICAgYyA9IFRpdGxlKCJjIikKICAgIGQgPSBUaXRsZSgiZCIpCiAgICBlID0gVGl0bGUoIkUiKQogICAgZiA9IFRpdGxlKCJmIikKICAgIGcgPSBUaXRsZSgiZyIpCiAgICBoID0gVGl0bGUoImgiKQogICAgaSA9IFRpdGxlKCJpIikKICAgIGogPSBUaXRsZSgiaiIpCiAgICBrID0gVGl0bGUoImsiKQogICAgbCA9IFRpdGxlKCJsIikKICAgIG0gPSBUaXRsZSgibSIpCiAgICBuID0gVGl0bGUoIm4iKQogICAgbyA9IFRpdGxlKCJvIikKICAgIHAgPSBUaXRsZSgicCIpCiAgICBxID0gVGl0bGUoInEiKQogICAgciA9IFRpdGxlKCJyIikKICAgIHMgPSBUaXRsZSgicyIpCiAgICB0ID0gVGl0bGUoIlQiKQogICAgdSA9IFRpdGxlKCJVIikKICAgIHYgPSBUaXRsZSgidiIpCiAgICB3ID0gVGl0bGUoIlciKQogICAgeCA9IFRpdGxlKCJ4IikKICAgIHkgPSBUaXRsZSgiWSIpCiAgICB6ID0gVGl0bGUoInoiKQogICAgCmRlZiB0ZXN0X2Vycm9yX29uX05vbmUoc2VsZik6CgkJc2VsZi5hc3NlcnRSYWlzZXMoIEV4Y2VwdGlvbiwgVGlsZShOb25lKSkgCgpkZWYgdGVzdF9lcnJvcl9vbl9lbXB0eV9zdHJpbmcoc2VsZik6CgkgIHNlbGYuYXNzZXJ0UmFpc2VzKCBFeGNlcHRpb24sIFRpbGUoIiIpKQoJICAKZGVmIHRlc3RfbGV0dGVycyhzZWxmKToKCSAgYWxwaGFiZXRzID0gc3RyaW5nLmFzY2lpX2xvd2VyY2FzZQoJICBmb3IgaSBpbiBhbHBoYWJldHM6CgkgICAgc2VsZi5hc3NlcnRFcXVhbHMoIFRpbGUoaSksIFRpbGUoaSkpCgkgICAgCmRlZiB0ZXN0X2Vycm9yX29uX25vbl9sZXR0ZXIoc2VsZik6CQoJICBzZWxmLmFzc2VydFJhaXNlcyggRXhjZXB0aW9uLCBUaWxlKDQpKQoJICAKZGVmIHRlc3RfZXJyb3Jfb25fdG9vX21hbnlfbGV0dGVycyhzZWxmKToKCSAgc2VsZi5hc3NlcnRSYWlzZXMoIEV4Y2VwdGlvbiwgVGlsZSgiV09BSCIpKQoJCmRlZiB0ZXN0X29uZV9wb2ludF90aWxlcyhzZWxmKToKICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsYS5fcG9pbnRzKCkpCiAgICBzZWxmLmFzc2VydEVxdWFscygxLGUuX3BvaW50cygpKQogICAgc2VsZi5hc3NlcnRFcXVhbHMoMSxpLl9wb2ludHMoKSkKICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsby5fcG9pbnRzKCkpCiAgICBzZWxmLmFzc2VydEVxdWFscygxLG4uX3BvaW50cygpKQogICAgc2VsZi5hc3NlcnRFcXVhbHMoMSxyLl9wb2ludHMoKSkKICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsdC5fcG9pbnRzKCkpCiAgICBzZWxmLmFzc2VydEVxdWFscygxLGwuX3BvaW50cygpKQogICAgc2VsZi5hc3NlcnRFcXVhbHMoMSxzLl9wb2ludHMoKSkKICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsdS5fcG9pbnRzKCkpCgoJICAKCSAgCgkKCgkKICAgICAgICAgICAgCiAgICAgICAgICAgIAoKCgoKICAgICAgICAKICAgICAgICAKCQkKCQoJCiAgICAgICAKCg==