Thomas Holden Oblig 3 INF Universitetet i Tromsø Obligatorisk øving 3 INF 1400 Thomas Holden

Like dokumenter
IN1000 Obligatorisk innlevering 7

Innlevering 2b i INF2810, vår 2017

Løpende strekmann Erfaren Videregående Python PDF

INF Obligatorisk innlevering 7

PXT: Det regner mat! Introduksjon. Steg 1: Grunnlag. Sjekkliste. Skrevet av: Helene Isnes

Asteroids. Introduksjon. Oversikt over prosjektet. Skrevet av: Geir Arne Hjelle

UNIVERSITETET I OSLO

Donkey Kong. Introduksjon. Oversikt over prosjektet. Skrevet av: Geir Arne Hjelle

INF Obligatorisk innlevering 7 - Hangman

2 Om statiske variable/konstanter og statiske metoder.

UNIVERSITETET I OSLO

INF Obligatorisk innlevering 7

INF Obligatorisk innlevering 5

UNIVERSITETET I OSLO

Mattespill Nybegynner Python PDF

EKSAMENSOPPGAVE. Vil det bli gått oppklaringsrunde i eksamenslokalet? Svar: NEI

Metoder med parametre, løkker og arrayer

INF Ekstrainnlevering

UNIVERSITETET I OSLO

PXT: Himmelfall. Introduksjon. Skrevet av: Helene Isnes og Julie Revdahl

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

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?

Oblig 4Hybelhus litt mer tips enn i oppgaven

Steg 0: Installere Pygame Zero

Rosetta og Philae. Steg 1: Skilpadden blir et romskip. Sjekkliste. Introduksjon

Pong. Oversikt over prosjektet. Steg 1: En sprettende ball. Plan. Sjekkliste. Introduksjon

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

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

Bygg et Hus. Steg 1: Prøv selv først. Sjekkliste. Introduksjon. Prøv selv

Lærerveiledning - Pong

Objektorientert programmering i Python

Sprettball Erfaren ComputerCraft PDF

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

Hoppehelt. Introduksjon. Steg 1: Streken. Sjekkliste. Skrevet av: Geir Arne Hjelle

Snake Expert Scratch PDF

Løse reelle problemer

Steg 1: Piler og knappetrykk

Forkurs i informatikk Python. Andreas Færøvig Olsen

Bygg et Hus. Introduksjon. Steg 1: Prøv selv først. Skrevet av: Geir Arne Hjelle

Norsk informatikkolympiade runde

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

Asteroids. Oversikt over prosjektet. Steg 1: Enda et flyvende romskip. Plan. Sjekkliste. Introduksjon

Informasjon Eksamen i IN1000 høsten 2017

Debugging. Tore Berg Hansen, TISIP

Bli Kjent med Datamaskinen Introduksjon ComputerCraft PDF

Hangman. Level. Introduksjon

Rekursjon. Binærsøk. Hanois tårn.

Programmering i C++ Løsningsforslag Eksamen høsten 2005

EKSAMENSOPPGAVE. Adm.bygget, rom K1.04 og B154 Ingen. Vil det bli gått oppklaringsrunde i eksamenslokalet? Svar: JA / NEI Hvis JA: ca. kl.

Steg 1: Katten og fotballbanen

1. Finn klassene (hvilke objekter er det i problemet) 1. Dataene som beskriver problemet (hvilke objekter har vi og hvor mange klasser er det?

TDT4102 Prosedyre og Objektorientert programmering Vår 2015

Lærerveiledning - Snake

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.

Straffespark Introduksjon Scratch Lærerveiledning

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

INF120: Oblig 3. Yngve Mardal Moe

Steg 1: Hente grafikk fra nettet

TDT4102 Prosedyre og Objektorientert programmering Vår 2014

Astrokatt. Introduksjon. Steg 1: En flyvende katt. Sjekkliste. Scratch. Skrevet av: Geir Arne Hjelle

Steg 1: Tekst på flere linjer

Oblig4 - forklaringer. Arne og Ole Christian

Hvor i All Verden? Del 3. Introduksjon. Steg 0: Forrige gang. Sjekkliste. Skrevet av: Geir Arne Hjelle

Soloball. Introduksjon. Steg 1: En roterende katt. Sjekkliste. Skrevet av: Geir Arne Hjelle

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

UNIVERSITETET I OSLO

Norsk informatikkolympiade runde

Forklaring til programmet AbstraktKontoTest.java med tilhørende filer Konto.java, KredittKonto.java, SpareKonto.java

2 Om statiske variable/konstanter og statiske metoder.

Hvor i All Verden? Del 3 Erfaren Scratch PDF

Øvingsforelesning 5 Python (TDT4110)

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

PXT: Hermegåsa. Introduksjon. Skrevet av: Felix Bjerke og Tjerand Silde

PXT: Hermegåsa. Steg 1: Sjekk at du har riktig utstyr. Sjekkliste. Introduksjon

Steg 1: Bli kjent med spillet

Matematikk og fysikk RF3100

Klask-en-Muldvarp. Introduksjon. Skrevet av: Basert på MITs "MoleMash for App Inventor 2"-guide (

Verden. Introduksjon. Skrevet av: Kine Gjerstad Eide og Ruben Gjerstad Eide

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

Norsk informatikkolympiade runde

UNIVERSITETET I OSLO

Steg 1: Streken. Steg 2: En hoppende helt. Sjekkliste. Sjekkliste. Introduksjon. Hei der! Hoppehelt

For å sjekke at Python virker som det skal begynner vi med å lage et kjempeenkelt program. Vi vil bare skrive en enkel hilsen på skjermen.

TDT Datateknologi, programmeringsprosjekt

Norsk informatikkolympiade runde. Sponset av. Uke 46, 2015

Lærerveiledning - Straffespark

Husk at du skal ha to vinduer åpne. Det ene er 'Python Shell' og det andre er for å skrive kode i.

INF1000 Eksamen 2014 (modifisert)

Verden. Steg 1: Vinduet. Introduksjon

INF109 (kun et utvalg av kommentarene er med i denne rapporten)

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

Endret litt som ukeoppgave i INF1010 våren 2004

UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet

Fra problem til program

Norsk informatikkolympiade runde

Om du allerede kjenner Scratch og har en Scratchbruker kan du gå videre til Steg 1.

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

Transkript:

Universitetet i Tromsø Obligatorisk øving 3 INF 1400 Thomas Holden

Innledning Rapporten beskriver implementasjonen av en Mayhem klone. Spillet har støtte for to spillere, gravitasjon, score (antall drap / antall drept / antall gjenværende liv), refuling når man har brukt opp drivstoffet og aksellerasjon. Oppgaven stilte krav om gravitasjon, dette kravet er gjennomført med hjelp av en planet som roterer på midten av skjermen. Om spilleren kommer for nært planeten vil gravitasjonskreftene begynne å påvirke spilleren. Gravitasjonskraften er ikke fysisk korrekt, dvs, den følger ikke de fysiske lovene (9,8 ms)^2 men spillerene får en følelse av gravitasjon likevel. Implementasjonen er gjort i Linux, ved hjelp av programmeringsspråket Python 2.7. På denne datamaskinen heter pyton binæren «python2» (Ikke python, som er vanlig på noen av de store linux distrobusjonene), dermed må du endre env variabelet i game.py om du ønsker å kjøre spillet uten bruk av python / python2 kommandoen. Mere om dette i readme.txt Implementasjonen er gjort på Universitetet i Tromsø, som en obligatorisk innlevering i INF-1400. Planleggingsfasen Det måtte noe planlegging til for å få til denne implementasjonen. Blant annet var det viktig å følge kravet oppgaven stilte om å arve pygame.sprite.sprite for alle de synlige objektene på skjermen. Dette innkluderer planeten, to romskip og to «bensin stasjoner» / pads. Teksten øverst i spillvinduet er også surface objekter, men av typen pygame.font.font, og arver dermed ikke fra sprites klassen, men i fra fonts klassen. Et annet krav oppgaven stilte var at alt av oppdateringer (forflytning / gravitasjon osv) skulle gjøres fra objektenes update funksjon. Dette var for å lære om prinsippene bak polymorfisme. Det vil si å overskrive annen tilarvet funksjonalitet. I tillegg var det viktig å tenke ut hvordan klassene skulle henge sammen. Skulle man arve noe, eller skulle man heller bare lage objektene separat? Løsningen her baserte seg på å arve det som var kravene i oppgaven, og i tillegg til dette lage flere andre objekter. Blant annet, Score, Fuel og Ammo, som vil bli beskrevet senere i rapporten. UML diagram UML diagrammet skal gjøre det enklere å visualisere seg hvordan alt henger sammen. Klassen game, er hovedklassen. Herifra blir pygame startet, displaymode satt og en screen konfigurert. Innstillingene blir hentet fra config.py som var et av de andre kravene oppgaven stilte. Game klassen har en metode, createworld() som initialiserer de andre objektene som behøves for at spillet skal kjøre. Disse er følgende: Player, Planet og Fuelpads. Alle disse objektene er sprites, som blir lagt til i grupper slik at de kan oppdateres og tegnes på en enklere måte (også et oppgave krav).

Font objekter brukes til å skrive tekst til skjermen. Metoden getsurface returnerer en surface som kan blittes til skjermen. Dette skjer i game klassen, ved hjelp av screen.blit. Dette bildet viser hvilken filer programmet består av, og hvilken del av programmet som importerer deler av programmet. For eksempel, importerer game filene player, planets, font med flere. Konfigurasjonsfilen leses av flere deler av programmet, men ikke av alle. Grunnen til dette er at noen deler er avhengige av predefinerte konstanter, mens andre derimot, ikke er det. UML-en Vedlagt denne rapporten ligger det en fil, uml.png som innholder uml diagrammet. Bildet var for stort til å få med i rapporten, men her følger en beskrivelse av diagrammet. Game klassen instansierer objekter av typen player, planets og fuelpads. Player klassen instansierer ammo, fuel og score. Alle klassene som innholder kordinater benytter seg av Vector2D objekter for å regne ut de nye posisjonene. Det kommer ikke frem av UML-en, men player og planets arver fra pygame.sprite.sprite, og font arver fra pygame.font.font

Implementasjon Game Spillets hovedklasse, og har i oppgave å sette opp PyGame, en screen og instansiere resten av objektene som er nødvendig for at spillet skal kjøre. Game klassen består av følgende metoder: Createworld Collision GameStatus dokill setalive stats handleevents Createworld Metoden kjøres fra init, og har i oppgave å instansiere to player objekter, to fuelpadobjekter, og en planet (som obstacle). Alle disse objektene blir plassert i sprites grupper. Spillerne blir lagt til i en gruppe kalt players, planeten i en gruppe kalt planets osv. Disse gruppene blir oppdatert, og tegnet i fra while løkken som kjøres i init metoden til game. Collision Metoden tester for kollisjon mellom planeter og spaceships, og ammo og spaceships. Planeter og spaceship kollisjoner blir funnet om pygame.sprite.collide_rect returnerer True. Hvis returverdien er sann vil dokill bli kjørt på objektet som skal drepes. Dette innebærer et kall til game.dokill og et annet til self.dokill. Disse metodene resetter objektet, og gjør slik at neste runde kan starte. For kulene, er det litt annerledes. Her blir skuddene fra player1 og player2 lagt til i en bullets.sprite gruppe. Alle kulene innholder en «ident», slik at det er mulig å sjekke hvem som skjøt kulene, på denne måten er det mulig å oppdatere score, og i tillegg gjøre slik at det ikke er mulig å drepe seg selv. Når en av spillerne blir drept vil self.dokill og game.dokill kjøres på objektet som er drept, i tillegg vil self.reset kjøres på begge objektene (for å resette fuel for eksempel), self.score.incrementdeath vil kjøres for å telle antall dødsfall, og self.score.decrementlive for å telle ned på liven til spilleren som døde. I tillegg vil self.score.incrementkill kjøres på objektet som sto igjen i livet. Game status

Metoden holder styr på spillets status. Hvis noen av spillerne er døde gjør metoden det mulig å restarte spillet gjennom å lytte på en pygame.key event. Metoden skriver også «Game over» til skjermen om en av spillerne går tom for liv. DoKill Sjekker om den får rett argument ved hjelp av isinstance(who, Player). Om alt stemmer vil bullets gruppen bli tømt, og spilleren som skal drepes fjernes fra gruppen slik at den ikke lengre tegnes på skjermen. På denne måten vil det se ut som at spilleren dør. SetAlive Legger til spilleren i sprites gruppen slik at den kan bli tegnet på skjermen. Teller også ned på antall liv på spilleren. Stats Skriver statistikk til skjermen gjennom bruk av Font klassen (Arver fra pygame.font.font). Denne klassen innholder en metode som gjør det mulig å hente ut et pygame surface, som senere blir blittet til skjermen. Koordinatene står spesifisert i config.py Player Player klassen instansierer et ammo, et score og et fuel objekt. Disse skal holde styr på score, skudd og drivstoff forbruket til player objektet. Posisjonen til player blir gitt ved å benytte et Vector2D objekt, dette gjøres for enkelthetsskyld. Player klassen innholder metoder for reset, gravitasjon (rundt planet, og fuelpad), rotasjon, thrust, skyting, refuling, kill/alive, set status, og update. Update metoden kaller på thrust, rotasjon og skudd når det er nødvendig. Set status benyttes av dokill, og setalive metodene. Ammo Ammo objekter blir instansiert og lagt til i ei liste for hver gang player skyter. Et ammo objekt representerer et skudd og innholder en ident, en retning og en hastighet. Ammo objektet har kun en metode, update som legger til hastighet for hver iterasjon av main loopen. Fuel Fuel objektet blir instansiert fra player klassens init funksjon og holder styr på brennstofforbruket til player. Består av metoder for å brenne fuel, fylle opp drivstoff og sjekke hvor mye som er igjen på tanken.

Score Objektet holder styr på poengene til player, dvs, antall drap, antall død og gjenværende liv. En spiller begynner med tre liv og mister liv, enten ved hjelp av krasj i planet, eller som følge av skudd. Score består av metoder for å dekrementere liv og inkrementering av drap og død. I tillegg betsår objeket av metoder for å hente ut gjenværende liv, antall dødsfall og drap. Font Font klassen arver pygame.font.font og består av fontsize, fontname og text. Text er teksten som skal rendres, og fontsize er tekststørrelse og fontname er navnet på fonten som benyttes. Består av en metode, getsurface, som returnerer en pygame surface som kan blittes til skjermen. Planets Planets arver fra pygame.sprite.sprite, og er et objekt som brukes for å illustrere planeter på skjermen. I nåværende kodeform er det kun en planet, men det er mulig å legge til flere. Klassen fungerer på samme måte som player hva angår rotasjon, men ellers er den relativt funksjonsløs. Kollisjonstesting gjøres fra game.collision Fuelpads Arver fra pygame.sprite.sprite, og illustrere en fuelpad på skjermen. Denne klassen innholder kun data om selve posisjonen, fargen og lengden / bredden av objektet. Selve refulingen skjer automatisk når romskipet er innenfor en viss radius. Dette blir detektert fra player objektet. Cprofiler Python koden er kjørt gjennom cprofiler, men det var ingenting spessielt som stakk seg ut som tregt kjørende i denne koden. Dermed, er det ikke noen forbedringer å diskutere. Det som tok lengst tid var pygame.font.font. init () metoden, og det er ikke noe å gjøre med denne. Må kjøre init for at klassen skal fungere. I filen cprofiler.txt ligger output av profileringstesten. Problemstillinger Det oppsto egentlig ingen spesielle problemstillinger under programmeringen av denne obligatoriske øvingen. Det eneste var at det måtte en del planlegging til for å finne ut hvordan implementeringen skulle være. For å følge alle kravene etc. Dette var nok det vanskeligste i denne oppgaven. Tegning av UML diagram ble gjort automatisk ved bruk av pylint, tok noe tid å skjønne seg på hvordan dette

verktøyet fungerte, men etter dette gikk det greit. Konklusjon Koden fungerer slik som den skal, følger de kravene som er stilt i oppgaveteksten og kjører ikke med noen spesielle flaskehalser. Som tidligere nevnt, er det pygame.font.font. init () som bruker lengst tid under kjøring.