from passasjer import Passasjer class Trikk: def __init__(self, rutenr, antallRadar): self._rutenr = rutenr self._antallRader = antallRadar self._antSeterPerRad = 5 self._trikkeSeter = self._generer(antallRadar) def _generer(self, antallRader): """ Lager ett rutenett med tomme plasser en tom plass har verdien "None" Argumenter: antallRader (int) , antall rader på trikken Returnerer: En nøstet liste (rutenettet) med ledige plasser """ trikkeListe = [] for i in range(antallRader): rad = [] for j in range(self._antSeterPerRad): rad.append(None) # fyller rad med ledige plasser trikkeListe.append(rad) return trikkeListe def __str__(self): tekst = "" # går igjennom alle radene i trikken for rad in self._trikkeSeter: tekst += "|" for passasjer in rad: if passasjer is None: tekst += " ledig |" else: tekst += " " + str(passasjer) + " |" tekst += "\n" return tekst def gaaPaaTrikk(self, passasjer): """ Lar en passasjer gå på trikken Argumenter: passasjer (Passasjer), passasjeren som skal sette seg på trikken Returnerer: (boolean), True dersom passasjeren har satt seg, False om ikke. """ for radID in range(self._antallRader): for seteId in range(self._antSeterPerRad): plass = self._trikkeSeter[radID][seteId] if plass is None: passasjer.gaaPaa() self._trikkeSeter[radID][seteId] = passasjer return True return False def gaaAvTrikk(self, stasjon): """ Går igjennom hele trikken og sjekker om noen skal av Dersom passasjeren skal av blir plassen ledig. Dette skjer om personen har kommet til stasjonen den skal av, eller om 4 personer rundt stinker. Om passasjeren ikke skal av økes antall stopp passasjeren har sittet på. Argumenter: stasjon (str), hvilken stasjon trikken er på """ gaaAvListe = [] # tar vare på par av (rad, sete) for bruk senere for radID in range(self._antallRader): for seteId in range(self._antSeterPerRad): # henter personen som ligger på plassen plass = self._trikkeSeter[radID][seteId] if not plass is None: # dersom noen sitter på plassen # sjekker om person skal av if plass.hentAvstigning() == stasjon: # om personen er på stasjonen den skal gå av plass.gaarAvRiktig() self._trikkeSeter[radID][seteId] = None else: # om ikke, sitter persjonen på ett stopp til plass.ookAntallStasjoner() naboer = self._hentNabo(radID, seteId) # går igjennom alle naboer og teller hvor mange som stinker antallSomStinker = 0 for passasjer in naboer: if passasjer.stinker(): antallSomStinker += 1 if antallSomStinker > 4: # legger inn i en liste for å "vente" på å fjerne passasjeren parMedId = [radID, seteId] gaaAvListe.append(parMedId) # alternativt kunne vi gjort # self._trikkeSeter[radID][seteId] = None # dette avhenger av tolkningen # går igjennom alle naboer som skal av og fjerner de for passasjerIDPar in gaaAvListe: self._trikkeSeter[passasjerIDPar[0]][passasjerIDPar[1]] = None def _hentNabo(self, radID, plassId): """ Henter naboene til en passasjer Argumenter: radID (int), raden en passasjer sitter på plassId (int), hvilken plass på en rad en passasjer sitter på Returnerer: liste med Passasjer-objekter """ # oppretter liste for å ta vare på naboene naboListe = [] for i in range(-1,2): # -1, 0, 1 for j in range(-1,2): # -1, 0, 1 naboRad = radID + i naboSete = plassId + j gyldig = True # om index er lik for den vi ønsker å finne naboer til if i == 0 and j == 0: gyldig = False # im indeks er utenfor "rutenettet" if naboRad < 0 or naboSete < 0: gyldig = False if naboRad >= self._antallRader or naboSete >= self._antSeterPerRad: gyldig = False # dersom gyldig og ikke ledig plass (om en person sitter der) if gyldig and self._trikkeSeter[naboRad][naboSete] != None: naboListe.append(self._trikkeSeter[naboRad][naboSete]) return naboListe