IN1000 Obligatorisk innlevering 7

Like dokumenter
Informasjon Prøveeksamen i IN1000 høsten 2018

Informasjon Eksamen i IN1000 og IN1001 høsten a) 1 poeng. 1b) 1 poeng. Tid. Oppgavene. Tillatte hjelpemidler. 30. november kl. 14.

Objektorientert programmering i Python

Seminaroppgaver IN1010, uke 2

Mattespill Nybegynner Python PDF

IN1010 V18, Obligatorisk oppgave 5

Øvingsforelesning i Python (TDT4110)

Innhold uke 8. Objekter: Bruk og intern organisering. Beskjeder: Oblig 1 6. Beskjeder: Oblig 7 (og 8)

IN Seminaroppgaver til uke 11

Informasjon Eksamen i IN1000 høsten 2017

IN1010 V19, Obligatorisk oppgave 2

Prøveeksamen IN1000. IN Prøveeksamen. Dato november 2017 Tid 12:30-12:00 Alle trykte og skrevne hjelpemidler er tillatt.

På tide med et nytt spill! I dag skal vi lage tre på rad, hvor spillerne etter tur merker ruter med X eller O inntil en av spillerne får tre på rad.

Obligatorisk oppgave 5: Labyrint

Eksamensoppgaver 2014

Innhold uke 7. Objektorientert programmering i Python: Introduksjon. Lite tilbakeblikk: Programflyt og skop. Lite tilbakeblikk: Funksjoner er uttrykk

Hangman. Steg 1: Velg et ord. Steg 2: Gjett en bokstav. Sjekkliste. Sjekkliste. Introduksjon

INF Obligatorisk innlevering 7 - Hangman

Etter uke 6 skal du. Introduksjon til objektorientert programmering. Hva skjedde ~1967? INF1001. Grunnkurs i objektorientert programmering

Innleveringsoppgave 5

Introduksjon til objektorientert programmering

INF Obligatorisk innlevering 7

INF1000 Eksamen 2014 (modifisert)

IN1000 Repetisjonskurs: IO og listeoperasjoner (+ string)

Først må vi få datamaskinen til å velge et tilfeldig ord, så la oss begynne. Lagre programmet ditt og kjør det. Hvilket ord skrives ut?

INF Obligatorisk innlevering 5

Kanter, kanter, mange mangekanter. Introduksjon: Steg 1: Enkle firkanter. Sjekkliste. Skrevet av: Sigmund Hansen

INF Ekstrainnlevering

Repetisjon Novice Videregående Python PDF

Objektorientert programmering i Python. Resten av semesteret. Innhold uke 9 Mer komplekse strukturer. Referanser og objekter, inkl Mentimeter spørsmål

I dag skal vi ved hjelp av ganske enkel Python-kode finne ut om det er mulig å tjene penger på å selge og kjøpe en aksje.

INF1000 Eksamen 2014 (modifisert)

Læringsmål uke 7. Objektorientert programmering i Python: Introduksjon. Innhold uke 7. Lite tilbakeblikk: Programflyt og skop

Løse reelle problemer

Tre på rad mot datamaskinen. Steg 1: Vi fortsetter fra forrige gang. Sjekkliste. Introduksjon

På tide med et nytt spill! I dag skal vi lage tre på rad, hvor spillerne etter tur merker ruter med X eller O inntil en av spillerne får tre på rad.

Oppgave 2 (20 poeng) float og long i oppgave 2:

INF våren 2017

Øvingsforelesning 3 Python (TDT4110)

Sudokubrettet Et sudokubrett består av n n ruter. Vi bruker følgende begreper i oppgaven:

Hvordan angripe en større oppgave? (og hva skal jeg gjøre i oblig 7!?)

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

Tre på rad mot datamaskinen. Steg 1: Vi fortsetter fra forrige gang

I denne oppgaven skal vi repetere litt Python-syntaks, det er en god blanding av alle tingene du har lært i Python til nå.

INF1000 Uke 14. Løsningsforslag - prøveeksamen. Institutt for Informatikk Fredrik Sørensen og Arne Maus

Løse reelle problemer

EKSAMENSOPPGAVE / EKSAMENSOPPGÅVE

AlgDat - Øvingsforelesning 1 Introduksjon til Python, lenkede lister og øving 1

Finne ut om en løsning er helt riktig og korrigere ved behov

Hvordan løse problemer med programmering?

PGZ - Hangman Ekspert Python Lærerveiledning

UNIVERSITETET I OSLO

Øvingsforelesning 1 Python (TDT4110)

TDT4110 IT Grunnkurs Høst 2015

Forside. 1 Hva skrives ut?

TDT4100 Objektorientert programmering

Obligatorisk oppgave 4: Lege/Resept

Hangman. Level. Introduksjon

Sudokubrettet Et sudokubrett består av n n ruter. Vi bruker følgende begreper i oppgaven:

INF Uke 10. Ukesoppgaver oktober 2012

2 Om statiske variable/konstanter og statiske metoder.

Med løkke: Læringsmål og pensum. TDT4110 Informasjonsteknologi grunnkurs: Tema: Løkker/Sløyfer Utgave 3: Kap. 4 Utgave 2: Kap. 5. Mål.

Steg 1: Rest etter divisjon

Kanter, kanter, mange mangekanter

Oppsummering fra sist

MAT-INF 1100: Obligatorisk oppgave 1

UNIVERSITETET I OSLO

Skilpaddetekst. Steg 1: Tekst på flere linjer. Sjekkliste. Introduksjon

TDT4110 Informasjonsteknologi grunnkurs: Tema: Funksjoner med retur og moduler. - 3rd edition: Kapittel Professor Alf Inge Wang

Steg 1: Tekst på flere linjer

Læringsmål uke 7. Introduksjon til objektorientert programmering. Paradigmet objektorientering. Objektreferanser. INF1001 Høst 2016 Uke 7

Hvorfor objektorientert programmering? Objektorientert programmering i Python: Introduksjon. Læringsmål uke 7. Undervisning og pensum IN1000

Fra Python til Java. En introduksjon til programmeringsspråkenes verden. Dag Langmyhr

Øvingsforelesning 5 Python (TDT4110)

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

Oblig2 - obligatorisk oppgave nr. 2 (av 4) i INF1000 v2008

Et større programeksempel. Hvordan løse et reelt problem med en objektorientert fremgangsmåte

Introduksjon til objektorientert. programmering. Hva skjedde ~1967? Lokale (og globale) helter. Grunnkurs i objektorientert.

Forkurs INF1010. Dag 1. Andreas Færøvig Olsen Tuva Kristine Thoresen

Oblig 4Hybelhus litt mer tips enn i oppgaven

Oblig2 - obligatorisk oppgave nr. 2 (av 4) i INF1000 v2009

Python: Intro til funksjoner. TDT4110 IT Grunnkurs Professor Guttorm Sindre

Utførelse av programmer, metoder og synlighet av variabler i JSP

Innlevering 2b i INF2810, vår 2017

Oblig2 - obligatorisk oppgave nr. 2 (av 4) i INF1000

Hvorfor objektorientert programmering?

Steg 1: Regneoperasjoner på en klokke

BOKMÅL Side 1 av 7. KONTINUASJONSEKSAMEN I FAG TDT4100 Objektorientert programmering / IT1104 Programmering, videregående kurs

Hash-funksjoner. Introduksjon. Steg 1: Strekkoder. Eksempel. Skrevet av: Martin Strand

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

OPPGAVE 1 OBLIGATORISKE OPPGAVER (OBLIG 1) (1) Uten å selv implementere og kjøre koden under, hva skriver koden ut til konsollen?

Øvingsforelesning 5 Python (TDT4110)

Transkript:

IN1000 Obligatorisk innlevering 7 Frist for innlevering: 23.10. kl 12:00 Introduksjon I denne innleveringen skal du lage et program som simulerer cellers liv og død. Dette skal du gjøre ved hjelp av en modell kalt Conway s Game of Life ( les mer om Game of Life her ). Kort fortalt skal programmet holde styr på et kvadratisk spillebrett av en vilkårlig størrelse, der hvert felt i brettet skal kunne inneholde en celle. En celle kan være levende eller død. Simuleringen utspiller seg gjennom flere generasjoner, der celler dør eller lever i en generasjon avhengig av sine omgivelser i den forrige. Programmet skal la brukeren observere simuleringen generasjon for generasjon ved å tegne opp spillebrettet i terminalen sammen med tilleggsinformasjon om hvilken generasjon vi ser på samt hvor mange celler som for øyeblikket lever. Når du leverer denne oppgaven skal du levere alle python-filer du har brukt i løsningen. Det er viktig at du kommenterer hvordan løsningen din fungerer. I tillegg skal du også levere en fil README.txt som beskriver hva som har vært utfordrende og hva som har vært enkelt. Dersom deler av programmet ikke fungerer skal du også beskrive hva som ikke fungerer, et forslag til hvorfor det ikke fungerer, samt en beskrivelse av hvordan du ville ha angrepet oppgaven annerledes dersom du fikk et nytt forsøk. Spillets regler En ny generasjon skapes ved at alle cellene i brettet endrer status avhengig av sine naboceller. Som naboceller regnes alle celler med felles hjørne eller kant, både levende og døde. Illustrasjon 1: En celle (X) og dens naboceller (grønne celler er levende ) En celles nye status bestemmes av følgende regler: Dersom cellens nåværende status er levende : Ved færre enn to levende naboceller dør cellen ( underpopulasjon ). Ved to eller tre levende naboceller vil cellen leve videre. Hvis cellen har mer enn tre levende naboceller vil den dø ( overpopulasjon )

Dersom cellen er død : Cellens status blir levende ( reproduksjon ) dersom den har nøyaktig tre levende naboer. NB! Hver celles tilstand er bare avhengig av naboene i forrige generasjon. Det betyr at neste tilstand til alle celler må bestemmes før man oppdaterer cellene. Illustrasjon 2: Et eksempel på to etterfølgende generasjoner av celler i et 7x7 spillebrett Struktur Programmet består av tre filer med to klasser i tillegg til et hovedprogram, som alle skal leveres i hver sin kodefil. De beskrevne klassene skal navngis som beskrevet. Kodeskjelett for de tre filene er vedlagt oppgaven, i tillegg til noen ferdig implementerte metoder. Disse er det også mulig å implementere selv, for de som vil ha flere utfordringer. Det kan være nødvendig å utvide klassene med flere metoder. Celle Filnavn: celle.py Klassen beskriver en celle i simuleringen. En celle skal ha en variabel som beskriver status (levende/død). 1. Skriv en konstruktør for klassen som oppretter cellen med status død som utgangspunkt. 2. Skriv metodene settdoed og settlevende som ikke tar noen parametere, men som setter statusen til cellen til henholdsvis død og levende. Oppdater konstruktøren slik at den tar i bruk metoden settdoed. 3. Skriv metoden erlevende som returnerer cellens status; True hvis cellen er levende og False ellers. Skriv i tillegg en metode som returnerer en tegnrepresentasjon av cellens status til bruk i tegning av brettet. Dersom cellen er levende skal det returneres en O, mens hvis den er død returneres et punktum.

Spillebrett Filnavn: spillebrett.py Denne klassen beskriver et todimensjonalt brett som inneholder celler. Spillebrettet skal holde styr på hvilke celler som skal endre status og oppdatere disse for hver generasjon. 1. Skriv ferdig konstruktøren for klassen Spillebrett. Konstruktøren tar imot dimensjoner på spillebrettet og lagrer disse i instansvariablene self._rader og self._kolonner. Konstruktøren skal: a. Opprette et rutenett i form av en todimensjonal (nøstet) liste. Rutenettet skal fylles med et antall Celle-objekter likt antall rader ganger antall kolonner. b. Opprette en variabel som holder styr på generasjonsnummer og som skal økes hver gang brettet oppdateres. 2. Utvid klassens konstruktør til å kalle på metoden generer. Denne metoden går gjennom rutenettet og sørger for at et tilfeldig antall celler får status levende. Dette kalles et seed og utgjør utgangspunktet, eller nulte generasjon for cellesimuleringen vår. Denne metoden er ferdig implementert i kodeskjelettet vi har delt ut. En forklaring på implementasjonen kan du finne nederst i oppgaveteksten. FRIVILLIG: Du kan implementere denne metoden selv. For å gjøre dette enklest mulig kan du ta i bruk Python-modulen random. Den inneholder blant annet funksjonen randint(t1, t2), som tar imot to heltall og returnerer et tilfeldig tall mellom disse. 3. For å vise frem og teste spillebrettet skal du skrive metoden tegnbrett. Denne metoden skal bruke en nøstet for-løkke for å skrive ut hvert element i rutenettet. Husk å teste programmet ditt så langt ved å opprette et Spillbrett-objekt og skrive ut brettet i et lite testprogram. Tips til formatering av utskrift: a. For å unngå linjeskift etter hver utskrift kan du avslutte utskriften med en tom streng isteden, slik: print( arg, end = "") b. Det kan være lurt å tømme terminalvinduet mellom hver utskrift. Dette kan du for eksempel gjøre ved å skrive ut et titalls blanke linjer før du skriver ut brettet. 4. For å bestemme hvilke celler som skal være levende og døde i neste generasjon trenger vi å vite statusen til hver celles nabo. Spillebrett-klassen inneholder derfor en metode finnnabo. Metoden tar imot to koordinater i rutenettet og returnerer en liste med alle cellens naboer. Denne metoden er ferdig implementert i kodeskjelettet vi har delt ut. En forklaring på implementasjonen kan du finne nederst i oppgaveteksten.

FRIVILLIG: Denne metoden kan du også implementere selv. Merk at metoden må ta høyde for at en celle ligger på en kant av brettet og kun legge til celler på plasser som ligger innenfor den todimensjonale listen. 5. For å beregne neste generasjon av celler trengs metoden oppdatering. Skriv denne metoden. Metoden skal gjøre følgende: a. Opprett to lister. Den ene listen skal inneholde alle døde celler som skal få status levende, mens den andre skal inneholde levende celler som skal få status død. La listene være tomme foreløpig. b. Deretter skal metoden gå gjennom rutenettet ved hjelp av en nøstet løkke. For hver celle skal den sjekke om cellen er levende eller død og deretter beregne om den skal endre status på bakgrunn av antallet levende naboer. Her blir du nødt til å hente opp alle naboene til en celle og telle antallet som lever. Følg listen med regler beskrevet under Spillets regler lenger opp. Celler som skal endre status skal legges inn i den riktige av de to listene vi laget tidligere. c. Først når alle cellene er sjekket og listene er fylt med Celle-objekter skal selve oppdateringen skje. Endre status på objektene i de to listene ved hjelp av Celle-metodene settlevende eller settdoed. d. Til sist må du huske å oppdatere telleren for antall generasjoner. e. Utvid testprogrammet fra deloppgave 3 ved å kalle på metoden oppdatering en gang. Oppfører programmet seg som forventet? Tips: Denne metoden kan testes ved å fylle rutenettet med et kjent mønster og se at det endrer seg som forventet etter en generasjon. 6. I tillegg til generasjonsnummer er vi interessert i den generelle cellestatusen på spillebrettet. Du skal derfor skrive en metode finnantalllevende som kan beregne og returnere antallet levende celler. Dette kan du enklest gjøre ved å gå gjennom rutenettet og øke en teller for hver levende celle du finner. Hovedprogram Filnavn: main.py Skriv et hovedprogram, main, der brukeren først skal bli spurt om å oppgi dimensjoner på spillebrettet. Deretter skal du opprette brettet og skrive ut den nulte generasjonen.

Illustrasjon 4: Eksempel på utskrift av spillebrettet Ved hjelp en menyløkke og input skal brukeren deretter kunne velge å oppgi en tom linje for å gå videre til neste steg, eller skrive inn bokstaven q for å avslutte programmet. Hver gang brukeren oppgir at de ønsker å fortsette skal du kalle på oppdatering -metoden og deretter skrive ut brettet på nytt sammen med en linje som beskriver hvilken generasjon som vises og hvor mange celler som lever for øyeblikket. Vedlegg 1: Kode Celle Filnavn: celle.py class Celle: # Constructor def init ( self ): # Endre status def settdoed( self ): def settlevende( self ):

# Hente status def erlevende( self ): def hentstatustegn( self ): Spillebrett Filnavn: spillebrett.py from random import randint from celle import Celle class Spillebrett: def init ( self, rader, kolonner): self._rader = rader self._kolonner = kolonner self._rutenett = [] #... def tegnbrett( self ): pass def oppdatering( self ): pass def finnantalllevende( self ): pass def generer( self ) : for i in range ( self._rader): for j in range ( self._kolonner): rand = randint(0,3) if rand == 3 : self._rutenett[i][j].settlevende() def finnnabo( self, x, y): naboliste = [] for i in range (-1, 2): for j in range (-1, 2): nabox = x+i naboy = y+j if (nabox == x and naboy == y)!= True: if (nabox < 0 or naboy < 0 or nabox > self._kolonner-1 or naboy > self._rader-1)!= True: naboliste.append( self._rutenett[naboy][nabox]) return naboliste

Hovedprogram Filnavn: main.py from spillebrett import Spillebrett def main(): pass # starte hovedprogrammet main() Vedlegg 2: Forklaring på utgitt kode a) Hvordan generere generasjon 0 : Øverst i dokumentet må du inkludere følgende linje: from random import randint Selve metoden kan defineres slik: def generer( self ) : for i in range ( self._rader): for j in range ( self._kolonner): rand = randint(0,3) if rand == 3 : self._rutenett[i][j].settlevende() Denne metoden genererer et tilfeldig tall for hver celle (her mellom 0 og 3) og sammenlikner det med et statisk sjekktall (her 3). Dersom tallene matcher vil cellen settes til levende. Test gjerne ut andre verdier og se hvordan det påvirker antallet levende celler i første generasjon. Er du ekstra interessert kan du se eksempler på spesifikke mønstre her. b) Finn nabo i Spillebrett def finnnabo( self, x, y): naboliste = [] for i in range (-1, 2): for j in range (-1, 2): nabox = x+i naboy = y+j if (nabox == x and naboy == y)!= True: if (nabox < 0 or naboy < 0 or nabox > self._kolonner-1 or naboy > self._rader-1)!= True: naboliste.append( self._rutenett[naboy][nabox]) return naboliste Metoden går gjennom de ni mulige plassene rundt en celle, men luker ut senteret (som er selve cellen og ikke en nabo), samt plasseringer som er for små eller for store til å eksistere i

spillebrettet (utenfor kanten av brettet). Alle gyldige naboer legges i en liste av naboer som returneres.