class Card():
    
    ranks=["","ace","two","three","four","five","six","seven","eight","nine","ten","jack","queen","king"]
    suits=["","hearts","spades","clubs","diamonds"]
           
    def __init__(self, rank, suit):
        self.rank=rank
        self.suit=suit

    def getSuit(self):
        return self.suit

    def getRank(self):
        return self.rank

    def viewCard(self):
        return Card.ranks[self.rank]+" of "+Card.suits[self.suit]

    def getCard(self):
        return "("+ str(self.suit)+","+str(self.rank)+")"

    def __str__(self):
        return Card.ranks[self.rank]+" of "+Card.suits[self.suit]

class Deck():

    def __init__(self):
        self.cards=[]
        for suit in range(1,5):
            for rank in range(1,14):
                self.cards.append(Card(rank,suit))
                
    def viewDeck(self):
        for card in self.cards:
            print(card)
        

class Vector:

    def __init__(self,x,y):
        self.x=x
        self.y=y

    def getX(self):
        return self.x

    def getY(self):
        return self.y

    def getVector(self):
        return "("+str(self.x)+","+str(self.y)+")"

    def __str__(self):
        #must return a string data type when re-defining str
        return str(self.x)+"i+"+str(self.y)+"j"

    def __add__(self,otherVector):
        newX=self.x+otherVector.x
        newY=self.y+otherVector.y
        return Vector(newX,newY)


class Student():

    ID=0
    years=["","freshman","sophomore","junior","senior"]

    def __init__(self,firstName,lastName,standing=1):
        self.fName=firstName
        self.lName=lastName
        self.year=standing
        Student.ID=Student.ID+1
        self.ID=Student.ID

    def advance(self):
        if self.year<4:
            self.year=self.year+1

    def getStanding(self):
        return Student.years[self.year]

    def getName(self):
        return self.fName+" "+self.lName

    def getID(self):
        return self.ID

    def saySomething(self,something,otherStudent):
        return "Hi {}. My Name is {}. {}.".format(otherStudent.fName,self.fName,something)

    def __str__(self):
        return self.fName+" "+self.lName
    

    
          
          
    


class Person():

    def __init__(self,fName,lName):
        self.firstName=fName
        self.lastName=lName

    def getFirst(self):
        return self.firstName

    def getLast(self):
        return self.lastName

    def saySomething(self):
        return "Hi. My Name is {}.".format(self.firstName)

    def __str__(self):
        return self.firstName+" "+self.lastName

class HGSperson(Person):

    ID=0

    def __init__(self,fName,lName):
       Person.__init__(self,fName,lName)
       HGSperson.ID=HGSperson.ID+1
       self.ID=HGSperson.ID

    def getID(self):
        return self.ID

    def __str__(self):
        return "HGS Person: {},{}".format(self.lastName,self.firstName)