diff --git a/go/src/sprites/card/card.go b/go/src/sprites/card/card.go
index 4aefce0..4417330 100644
--- a/go/src/sprites/card/card.go
+++ b/go/src/sprites/card/card.go
@@ -9,7 +9,16 @@
 	"golang.org/x/mobile/exp/sprite"
 )
 
-func NewCard(n int, s string) *Card {
+type Suit string
+
+const (
+	Heart   Suit = "H"
+	Diamond Suit = "D"
+	Spade   Suit = "S"
+	Club    Suit = "C"
+)
+
+func NewCard(n int, s Suit) *Card {
 	return &Card{
 		suit:   s,
 		num:    n,
@@ -22,7 +31,7 @@
 }
 
 type Card struct {
-	suit string
+	suit Suit
 	//num ranges from 2-14; jack is 11, queen is 12, king is 13, ace is 14
 	num    int
 	node   *sprite.Node
@@ -32,7 +41,7 @@
 	height float32
 }
 
-func (c *Card) GetSuit() string {
+func (c *Card) GetSuit() Suit {
 	return c.suit
 }
 
diff --git a/go/src/sprites/logic_test.go b/go/src/sprites/logic_test.go
index 22f2465..d6c542d 100644
--- a/go/src/sprites/logic_test.go
+++ b/go/src/sprites/logic_test.go
@@ -22,10 +22,10 @@
 	players := []*player.Player{p0, p1, p2, p3}
 	t := table.NewTable(players)
 	t.SetFirstPlayed(1)
-	t.PlayCard(card.NewCard(3, "H"), 1)
-	t.PlayCard(card.NewCard(7, "H"), 2)
-	t.PlayCard(card.NewCard(12, "S"), 3)
-	t.PlayCard(card.NewCard(4, "D"), 0)
+	t.PlayCard(card.NewCard(3, card.Heart), 1)
+	t.PlayCard(card.NewCard(7, card.Heart), 2)
+	t.PlayCard(card.NewCard(12, card.Spade), 3)
+	t.PlayCard(card.NewCard(4, card.Diamond), 0)
 	t.SendTrick()
 	t.EndRound()
 	score := p0.GetScore()
@@ -58,16 +58,16 @@
 	players := []*player.Player{p0, p1, p2, p3}
 	t := table.NewTable(players)
 	t.SetFirstPlayed(1)
-	t.PlayCard(card.NewCard(3, "H"), 1)
-	t.PlayCard(card.NewCard(7, "H"), 2)
-	t.PlayCard(card.NewCard(12, "S"), 3)
-	t.PlayCard(card.NewCard(4, "D"), 0)
+	t.PlayCard(card.NewCard(3, card.Heart), 1)
+	t.PlayCard(card.NewCard(7, card.Heart), 2)
+	t.PlayCard(card.NewCard(12, card.Spade), 3)
+	t.PlayCard(card.NewCard(4, card.Diamond), 0)
 	t.SendTrick()
 	t.SetFirstPlayed(2)
-	t.PlayCard(card.NewCard(5, "D"), 2)
-	t.PlayCard(card.NewCard(2, "H"), 3)
-	t.PlayCard(card.NewCard(13, "D"), 0)
-	t.PlayCard(card.NewCard(14, "S"), 1)
+	t.PlayCard(card.NewCard(5, card.Diamond), 2)
+	t.PlayCard(card.NewCard(2, card.Heart), 3)
+	t.PlayCard(card.NewCard(13, card.Diamond), 0)
+	t.PlayCard(card.NewCard(14, card.Spade), 1)
 	t.SendTrick()
 	t.EndRound()
 	score := p0.GetScore()
@@ -100,29 +100,29 @@
 	players := []*player.Player{p0, p1, p2, p3}
 	t := table.NewTable(players)
 	t.SetFirstPlayed(1)
-	t.PlayCard(card.NewCard(8, "H"), 1)
-	t.PlayCard(card.NewCard(12, "S"), 2)
-	t.PlayCard(card.NewCard(13, "S"), 3)
-	t.PlayCard(card.NewCard(8, "C"), 0)
+	t.PlayCard(card.NewCard(8, card.Heart), 1)
+	t.PlayCard(card.NewCard(12, card.Spade), 2)
+	t.PlayCard(card.NewCard(13, card.Spade), 3)
+	t.PlayCard(card.NewCard(8, card.Club), 0)
 	t.SendTrick()
 	t.SetFirstPlayed(2)
-	t.PlayCard(card.NewCard(5, "C"), 2)
-	t.PlayCard(card.NewCard(2, "C"), 3)
-	t.PlayCard(card.NewCard(13, "H"), 0)
-	t.PlayCard(card.NewCard(11, "S"), 1)
+	t.PlayCard(card.NewCard(5, card.Club), 2)
+	t.PlayCard(card.NewCard(2, card.Club), 3)
+	t.PlayCard(card.NewCard(13, card.Heart), 0)
+	t.PlayCard(card.NewCard(11, card.Spade), 1)
 	t.SendTrick()
 	t.EndRound()
 	t.SetFirstPlayed(3)
-	t.PlayCard(card.NewCard(5, "S"), 3)
-	t.PlayCard(card.NewCard(6, "S"), 0)
-	t.PlayCard(card.NewCard(7, "S"), 1)
-	t.PlayCard(card.NewCard(10, "H"), 2)
+	t.PlayCard(card.NewCard(5, card.Spade), 3)
+	t.PlayCard(card.NewCard(6, card.Spade), 0)
+	t.PlayCard(card.NewCard(7, card.Spade), 1)
+	t.PlayCard(card.NewCard(10, card.Heart), 2)
 	t.SendTrick()
 	t.SetFirstPlayed(1)
-	t.PlayCard(card.NewCard(6, "D"), 1)
-	t.PlayCard(card.NewCard(2, "C"), 2)
-	t.PlayCard(card.NewCard(13, "H"), 3)
-	t.PlayCard(card.NewCard(11, "H"), 0)
+	t.PlayCard(card.NewCard(6, card.Diamond), 1)
+	t.PlayCard(card.NewCard(2, card.Club), 2)
+	t.PlayCard(card.NewCard(13, card.Heart), 3)
+	t.PlayCard(card.NewCard(11, card.Heart), 0)
 	t.SendTrick()
 	t.EndRound()
 	score := p0.GetScore()
@@ -203,12 +203,12 @@
 //Testing playing a card-- HasSuit()
 func TestSix(test *testing.T) {
 	p := player.NewPlayer(0)
-	p.AddToHand(card.NewCard(6, "D"))
-	p.AddToHand(card.NewCard(4, "S"))
-	if p.HasSuit("D") == false || p.HasSuit("S") == false {
+	p.AddToHand(card.NewCard(6, card.Diamond))
+	p.AddToHand(card.NewCard(4, card.Spade))
+	if p.HasSuit(card.Diamond) == false || p.HasSuit(card.Spade) == false {
 		test.Errorf("False negative")
 	}
-	if p.HasSuit("C") == true || p.HasSuit("H") == true {
+	if p.HasSuit(card.Club) == true || p.HasSuit(card.Heart) == true {
 		test.Errorf("False positive")
 	}
 }
@@ -217,10 +217,10 @@
 func TestSeven(test *testing.T) {
 	p1 := player.NewPlayer(0)
 	p2 := player.NewPlayer(1)
-	p1.AddToHand(card.NewCard(6, "H"))
-	p1.AddToHand(card.NewCard(12, "S"))
-	p2.AddToHand(card.NewCard(2, "D"))
-	p2.AddToHand(card.NewCard(5, "H"))
+	p1.AddToHand(card.NewCard(6, card.Heart))
+	p1.AddToHand(card.NewCard(12, card.Spade))
+	p2.AddToHand(card.NewCard(2, card.Diamond))
+	p2.AddToHand(card.NewCard(5, card.Heart))
 	if p1.HasAllPoints() == false {
 		test.Errorf("False negative")
 	}
@@ -235,9 +235,9 @@
 	players := []*player.Player{p0}
 	t := table.NewTable(players)
 	t.SetFirstPlayed(0)
-	if t.ValidPlay(card.NewCard(8, "C"), 0) == true {
+	if t.ValidPlay(card.NewCard(8, card.Club), 0) == true {
 		test.Errorf("Expected invalid play for starting round with card other than 2 of Clubs")
-	} else if t.ValidPlay(card.NewCard(2, "C"), 0) == false {
+	} else if t.ValidPlay(card.NewCard(2, card.Club), 0) == false {
 		test.Errorf("Expected valid play for starting round with 2 of Clubs")
 	}
 }
@@ -246,13 +246,13 @@
 func TestNine(test *testing.T) {
 	p0 := player.NewPlayer(0)
 	p1 := player.NewPlayer(1)
-	p1.AddToHand(card.NewCard(12, "S"))
-	p1.AddToHand(card.NewCard(3, "D"))
+	p1.AddToHand(card.NewCard(12, card.Spade))
+	p1.AddToHand(card.NewCard(3, card.Diamond))
 	players := []*player.Player{p0, p1}
 	t := table.NewTable(players)
 	t.SetFirstPlayed(0)
-	t.PlayCard(card.NewCard(2, "C"), 0)
-	if t.ValidPlay(card.NewCard(12, "S"), 1) == true {
+	t.PlayCard(card.NewCard(2, card.Club), 0)
+	if t.ValidPlay(card.NewCard(12, card.Spade), 1) == true {
 		test.Errorf("Expected invalid play for points on the first round")
 	}
 }
@@ -261,29 +261,29 @@
 func TestTen(test *testing.T) {
 	p0 := player.NewPlayer(0)
 	p1 := player.NewPlayer(1)
-	p0.AddToHand(card.NewCard(5, "H"))
-	p1.AddToHand(card.NewCard(2, "H"))
-	p1.AddToHand(card.NewCard(3, "D"))
+	p0.AddToHand(card.NewCard(5, card.Heart))
+	p1.AddToHand(card.NewCard(2, card.Heart))
+	p1.AddToHand(card.NewCard(3, card.Diamond))
 	players := []*player.Player{p0, p1}
 	t := table.NewTable(players)
 	t.SetFirstPlayed(0)
-	t.PlayCard(card.NewCard(2, "C"), 0)
-	t.PlayCard(card.NewCard(3, "C"), 1)
+	t.PlayCard(card.NewCard(2, card.Club), 0)
+	t.PlayCard(card.NewCard(3, card.Club), 1)
 	t.SendTrick()
 	t.SetFirstPlayed(0)
-	if t.ValidPlay(card.NewCard(5, "H"), 0) == false {
+	if t.ValidPlay(card.NewCard(5, card.Heart), 0) == false {
 		test.Errorf("Expected valid play for opener rightfully breaking Hearts")
 	}
 	t.SetFirstPlayed(1)
-	if t.ValidPlay(card.NewCard(2, "H"), 1) == true {
+	if t.ValidPlay(card.NewCard(2, card.Heart), 1) == true {
 		test.Errorf("Expected invalid play for opener wrongfully breaking Hearts")
 	}
-	t.PlayCard(card.NewCard(3, "D"), 1)
-	if t.ValidPlay(card.NewCard(5, "H"), 0) == false {
+	t.PlayCard(card.NewCard(3, card.Diamond), 1)
+	if t.ValidPlay(card.NewCard(5, card.Heart), 0) == false {
 		test.Errorf("Expected valid play for follower rightfully breaking Hearts")
 	}
-	p0.AddToHand(card.NewCard(7, "D"))
-	if t.ValidPlay(card.NewCard(5, "H"), 0) == true {
+	p0.AddToHand(card.NewCard(7, card.Diamond))
+	if t.ValidPlay(card.NewCard(5, card.Heart), 0) == true {
 		test.Errorf("Expected invalid play for follower wrongfully breaking Hearts")
 	}
 }
@@ -292,20 +292,20 @@
 func TestEleven(test *testing.T) {
 	p0 := player.NewPlayer(0)
 	p1 := player.NewPlayer(1)
-	p0.AddToHand(card.NewCard(2, "C"))
-	p1.AddToHand(card.NewCard(3, "D"))
+	p0.AddToHand(card.NewCard(2, card.Club))
+	p1.AddToHand(card.NewCard(3, card.Diamond))
 	players := []*player.Player{p0, p1}
 	t := table.NewTable(players)
 	t.SetFirstPlayed(0)
-	t.PlayCard(card.NewCard(2, "C"), 0)
-	if t.ValidPlay(card.NewCard(3, "D"), 1) == false {
+	t.PlayCard(card.NewCard(2, card.Club), 0)
+	if t.ValidPlay(card.NewCard(3, card.Diamond), 1) == false {
 		test.Errorf("Expected valid play for not following suit when player doesn't have suit")
 	}
-	p1.AddToHand(card.NewCard(5, "C"))
-	if t.ValidPlay(card.NewCard(5, "C"), 1) == false {
+	p1.AddToHand(card.NewCard(5, card.Club))
+	if t.ValidPlay(card.NewCard(5, card.Club), 1) == false {
 		test.Errorf("Expected valid play for following suit")
 	}
-	if t.ValidPlay(card.NewCard(3, "D"), 1) == true {
+	if t.ValidPlay(card.NewCard(3, card.Diamond), 1) == true {
 		test.Errorf("Expected invalid play for not following suit when player has suit")
 	}
 }
@@ -316,11 +316,11 @@
 	players := []*player.Player{p0}
 	t := table.NewTable(players)
 	t.SetFirstPlayed(0)
-	t.PlayCard(card.NewCard(12, "S"), 0)
+	t.PlayCard(card.NewCard(12, card.Spade), 0)
 	t.SendTrick()
-	t.PlayCard(card.NewCard(12, "S"), 0)
+	t.PlayCard(card.NewCard(12, card.Spade), 0)
 	t.SendTrick()
-	t.PlayCard(card.NewCard(12, "S"), 0)
+	t.PlayCard(card.NewCard(12, card.Spade), 0)
 	t.SendTrick()
 	winner := t.EndRound()
 	expect := -1
@@ -328,17 +328,17 @@
 		test.Errorf("Expected %d, got %d", expect, winner)
 	}
 	t.NewRound()
-	t.PlayCard(card.NewCard(12, "S"), 0)
+	t.PlayCard(card.NewCard(12, card.Spade), 0)
 	t.SendTrick()
-	t.PlayCard(card.NewCard(12, "S"), 0)
+	t.PlayCard(card.NewCard(12, card.Spade), 0)
 	t.SendTrick()
-	t.PlayCard(card.NewCard(12, "S"), 0)
+	t.PlayCard(card.NewCard(12, card.Spade), 0)
 	t.SendTrick()
-	t.PlayCard(card.NewCard(12, "S"), 0)
+	t.PlayCard(card.NewCard(12, card.Spade), 0)
 	t.SendTrick()
-	t.PlayCard(card.NewCard(12, "S"), 0)
+	t.PlayCard(card.NewCard(12, card.Spade), 0)
 	t.SendTrick()
-	t.PlayCard(card.NewCard(12, "S"), 0)
+	t.PlayCard(card.NewCard(12, card.Spade), 0)
 	t.SendTrick()
 	winner = t.EndRound()
 	expect = 0
diff --git a/go/src/sprites/player/player.go b/go/src/sprites/player/player.go
index dee1739..8c839ab 100644
--- a/go/src/sprites/player/player.go
+++ b/go/src/sprites/player/player.go
@@ -50,10 +50,10 @@
 
 func (p *Player) CalculateScore() int {
 	score := 0
-	for _, card := range p.tricks {
-		if card.GetSuit() == "H" {
+	for _, c := range p.tricks {
+		if c.GetSuit() == card.Heart {
 			score += 1
-		} else if card.GetSuit() == "S" && card.GetNum() == 12 {
+		} else if c.GetSuit() == card.Spade && c.GetNum() == 12 {
 			score += 13
 		}
 	}
@@ -64,9 +64,9 @@
 	p.tricks = nil
 }
 
-func (p *Player) HasSuit(suit string) bool {
-	for _, card := range p.hand {
-		if card.GetSuit() == suit {
+func (p *Player) HasSuit(suit card.Suit) bool {
+	for _, c := range p.hand {
+		if c.GetSuit() == suit {
 			return true
 		}
 	}
@@ -74,10 +74,10 @@
 }
 
 func (p *Player) HasAllPoints() bool {
-	for _, card := range p.hand {
-		if card.GetSuit() == "D" || card.GetSuit() == "C" {
+	for _, c := range p.hand {
+		if c.GetSuit() == card.Diamond || c.GetSuit() == card.Club {
 			return false
-		} else if card.GetSuit() == "S" && card.GetNum() != 12 {
+		} else if c.GetSuit() == card.Spade && c.GetNum() != 12 {
 			return false
 		}
 	}
diff --git a/go/src/sprites/table/table.go b/go/src/sprites/table/table.go
index 8816922..fa0d0f1 100644
--- a/go/src/sprites/table/table.go
+++ b/go/src/sprites/table/table.go
@@ -23,14 +23,20 @@
 }
 
 type Table struct {
-	//players and trick should each have 4 elements
+	//players contains all players in the game, indexed by playerIndex
 	players []*player.Player
-	trick   []*card.Card
+	//trick contains all cards in the current trick, indexed by the playerIndex of the player who played them
+	trick []*card.Card
 	//firstPlayed is the index in trick of the card played first
-	firstPlayed  int
-	allCards     []*card.Card
+	firstPlayed int
+	//allCards contains all 52 cards in the deck. GenerateCards() populates this
+	allCards []*card.Card
+	//heartsBroken returns true if a heart has been played yet in the round, otherwise false
 	heartsBroken bool
-	firstTrick   bool
+	//firstTrick returns true if the current trick is the first in the round, otherwise false
+	firstTrick bool
+	//winCondition is the number of points needed to win the game
+	//traditionally 100, could set higher or lower for longer or shorter game
 	winCondition int
 }
 
@@ -45,16 +51,16 @@
 func (t *Table) GenerateCards() {
 	t.allCards = make([]*card.Card, 0)
 	for i := 0; i < 13; i++ {
-		t.allCards = append(t.allCards, card.NewCard(i+2, "C"))
-		t.allCards = append(t.allCards, card.NewCard(i+2, "D"))
-		t.allCards = append(t.allCards, card.NewCard(i+2, "S"))
-		t.allCards = append(t.allCards, card.NewCard(i+2, "H"))
+		t.allCards = append(t.allCards, card.NewCard(i+2, card.Club))
+		t.allCards = append(t.allCards, card.NewCard(i+2, card.Diamond))
+		t.allCards = append(t.allCards, card.NewCard(i+2, card.Spade))
+		t.allCards = append(t.allCards, card.NewCard(i+2, card.Heart))
 	}
 }
 
 func (t *Table) PlayCard(c *card.Card, playerIndex int) {
 	t.trick[playerIndex] = c
-	if c.GetSuit() == "H" && t.heartsBroken == false {
+	if c.GetSuit() == card.Heart && t.heartsBroken == false {
 		t.heartsBroken = true
 	}
 }
@@ -63,12 +69,14 @@
 	player := t.players[playerIndex]
 	if t.firstPlayed == playerIndex {
 		if t.firstTrick == false {
-			if c.GetSuit() != "H" || t.heartsBroken == true {
+			if c.GetSuit() != card.Heart || t.heartsBroken == true {
 				return true
-			} else if player.HasSuit("C") == false && player.HasSuit("D") == false && player.HasSuit("S") == false {
-				return true
+			} else {
+				if player.HasSuit(card.Club) == false && player.HasSuit(card.Diamond) == false && player.HasSuit(card.Spade) == false {
+					return true
+				}
 			}
-		} else if c.GetSuit() == "C" && c.GetNum() == 2 {
+		} else if c.GetSuit() == card.Club && c.GetNum() == 2 {
 			return true
 		}
 	} else {
@@ -76,7 +84,7 @@
 		if c.GetSuit() == firstPlayedSuit || player.HasSuit(firstPlayedSuit) == false {
 			if t.firstTrick == false {
 				return true
-			} else if c.GetSuit() == "D" || c.GetSuit() == "C" || (c.GetSuit() == "S" && c.GetNum() != 12) {
+			} else if c.GetSuit() == card.Diamond || c.GetSuit() == card.Club || (c.GetSuit() == card.Spade && c.GetNum() != 12) {
 				return true
 			} else if player.HasAllPoints() == true {
 				return true
