Browse Source

having this in git is probably good

master
mortie 7 years ago
commit
6cce9fdc1c
100 changed files with 4061 additions and 0 deletions
  1. 60
    0
      exphil/gr.mdn
  2. 88
    0
      exphil/gr2.mdn
  3. BIN
      exphil/gr2.pdf
  4. BIN
      exphil/semesteroppgave/semesteroppgave.docx
  5. 143
    0
      exphil/semesteroppgave/semesteroppgave.mdn
  6. BIN
      exphil/semesteroppgave/semesteroppgave.odt
  7. BIN
      inf1000/gr1/W0.class
  8. 12
    0
      inf1000/gr1/W0.java
  9. 35
    0
      inf1000/gr1/w0.md
  10. 9
    0
      inf1000/gr2/O1.java
  11. 15
    0
      inf1000/gr2/O2.java
  12. 19
    0
      inf1000/gr2/O3.java
  13. 3
    0
      inf1000/gr2/O5.txt
  14. BIN
      inf1000/hw1/Arena.class
  15. BIN
      inf1000/hw1/Ball.class
  16. BIN
      inf1000/hw1/Beslutninger.class
  17. 39
    0
      inf1000/hw1/Beslutninger.java
  18. BIN
      inf1000/hw1/Billettpris.class
  19. 20
    0
      inf1000/hw1/Billettpris.java
  20. BIN
      inf1000/hw1/HeiStudent.class
  21. 46
    0
      inf1000/hw1/HeiStudent.java
  22. BIN
      inf1000/hw1/LikeVerdier.class
  23. 42
    0
      inf1000/hw1/LikeVerdier.java
  24. BIN
      inf1000/hw1/MinOppgave1.class
  25. 176
    0
      inf1000/hw1/MinOppgave1.java
  26. 2
    0
      inf1000/hw1/README.txt
  27. BIN
      inf1000/hw1/Vec2.class
  28. BIN
      inf1000/hw2/A.class
  29. BIN
      inf1000/hw2/Arena.class
  30. BIN
      inf1000/hw2/Block.class
  31. BIN
      inf1000/hw2/Bullet.class
  32. BIN
      inf1000/hw2/Enemy$1.class
  33. BIN
      inf1000/hw2/Enemy$Direction.class
  34. BIN
      inf1000/hw2/Enemy.class
  35. 34
    0
      inf1000/hw2/EnkelKalkulator.java
  36. BIN
      inf1000/hw2/Entity.class
  37. 11
    0
      inf1000/hw2/Feilmeldinger.txt
  38. 49
    0
      inf1000/hw2/Kodeflyt.txt
  39. 20
    0
      inf1000/hw2/Metoder.java
  40. BIN
      inf1000/hw2/MinOppgave2.class
  41. 641
    0
      inf1000/hw2/MinOppgave2.java
  42. BIN
      inf1000/hw2/Player.class
  43. 2
    0
      inf1000/hw2/README.txt
  44. BIN
      inf1000/hw2/Util.class
  45. BIN
      inf1000/hw2/Vec2.class
  46. 7
    0
      inf1000/hw3/3.3.md
  47. BIN
      inf1000/hw3/3.3.pdf
  48. BIN
      inf1000/hw3/FirstArray.class
  49. 69
    0
      inf1000/hw3/FirstArray.java
  50. BIN
      inf1000/hw3/MinOppgave3.class
  51. 60
    0
      inf1000/hw3/MinOppgave3.java
  52. BIN
      inf1000/hw3/NegativeTall.class
  53. 46
    0
      inf1000/hw3/NegativeTall.java
  54. 2
    0
      inf1000/hw3/README.txt
  55. BIN
      inf1000/hw3/SumTall.class
  56. 21
    0
      inf1000/hw3/SumTall.java
  57. 20
    0
      inf1000/hw4/Innlesing.java
  58. 43
    0
      inf1000/hw4/Kalkulator.java
  59. BIN
      inf1000/hw4/MinOppgave4.class
  60. 228
    0
      inf1000/hw4/MinOppgave4.java
  61. 4
    0
      inf1000/hw4/README.txt
  62. BIN
      inf1000/hw4/RequestHandler.class
  63. 26
    0
      inf1000/hw4/Temperatur.java
  64. BIN
      inf1000/hw4/Templates.class
  65. 76
    0
      inf1000/hw4/Valg.java
  66. 456
    0
      inf1000/hw4/stemmer.txt
  67. 12
    0
      inf1000/hw4/temperatur.txt
  68. 485
    0
      inf1000/hw4/winnie.txt
  69. 1
    0
      inf1000/hw4/www/foo/a
  70. 1
    0
      inf1000/hw4/www/foo/b
  71. 1
    0
      inf1000/hw4/www/foo/c
  72. 1
    0
      inf1000/hw4/www/foo/somedir/somefile
  73. 6
    0
      inf1000/hw4/www/pythonScript.py
  74. 6
    0
      inf1000/hw4/www/somefile.html
  75. BIN
      inf1000/hw5/Bil.class
  76. 36
    0
      inf1000/hw5/Bil.java
  77. BIN
      inf1000/hw5/Coin.class
  78. BIN
      inf1000/hw5/Enemy.class
  79. BIN
      inf1000/hw5/EnemyFlyer.class
  80. BIN
      inf1000/hw5/EnemyJumper.class
  81. BIN
      inf1000/hw5/EnemyWalker.class
  82. BIN
      inf1000/hw5/Entity.class
  83. BIN
      inf1000/hw5/Game$State.class
  84. BIN
      inf1000/hw5/Game.class
  85. BIN
      inf1000/hw5/GraphicsUtils.class
  86. BIN
      inf1000/hw5/Isbod.class
  87. 28
    0
      inf1000/hw5/Isbod.java
  88. BIN
      inf1000/hw5/Key.class
  89. BIN
      inf1000/hw5/MinOppgave5.class
  90. 907
    0
      inf1000/hw5/MinOppgave5.java
  91. BIN
      inf1000/hw5/Oppgave51.class
  92. 23
    0
      inf1000/hw5/Oppgave51.java
  93. BIN
      inf1000/hw5/Oppgave54.class
  94. 23
    0
      inf1000/hw5/Oppgave54.java
  95. BIN
      inf1000/hw5/Platform.class
  96. BIN
      inf1000/hw5/Player.class
  97. 2
    0
      inf1000/hw5/README.txt
  98. BIN
      inf1000/hw5/Side.class
  99. 5
    0
      inf1000/hw5/Teori.txt
  100. 0
    0
      inf1000/hw5/Vec2.class

+ 60
- 0
exphil/gr.mdn View File

@@ -0,0 +1,60 @@
# Notes

* Humes: 253
* kant, aristoteles: 150, 133
* kant: 273

# Heisenberg

## 1/2

* Iføle Hume er sambandet av kausalitet mellom to hendelser ikke i seg selv et sambånd av nødvendighet

## 3

* Determinisme er at alt fører til et endepunkt; hvis vi har fullstendig kunskap om universet på et punkt i tid, kan vi beregne oss frem vilkårlig langt frem eller tilbake.
* Laplaces fiksjon er en historie om en demon som kan forutberegne fremtiden fordi den har fullstendig kunnskap om alt.

## 4

* Statistiske lover; vi trenger ikke fullstendig kunnskap om alle enheter og små enkeltprosesser for å kunne trekke slutninger om store prosesser.

## 5

* Ved å i de fleste tilfeller stemme;

## 6

* Heisenberg mener at det ikke går an å se på enkeltatomene for å bestemme hvordan et stoff oppfører seg; en må se på alle atomene som en enhet. Hvert atom oppfører seg for uforutsigbart til å si oss noe interessant om stoffet det er en del av.

## 7

* Jo mer en vet om posisjonen til en partikkel på kvantenivå, desto mindre vet en om dens fart, og motsatt.
* Det gir mening å ha flere motstridende modeller for forskjellige bruk. Noen ganger gir det for eksempel mening å se på atomer som elektroner som går i bane rundt en kjerne, mens andre ganger er andre modeller mer nyttige. Disse modellene er praktiske selv om de ikke beskriver virkeligheten noeyaktig.

## 8

8. Det enkeltatomer gjør i antenningsprosessen i en atombombedetonasjon har mye å si for hvordan eksplosjonen foretar seg, så en kan kun beregne minimum- og maksimumkraft, ikke nøyaktig hvor kraftig bomben kommer til å være.

## 9

* Newthon sine lover er deterministiske, og antar et verden er deterministisk. Heisenbergs relasjoner viser at verden ikke er deterministisk; på kvantenivå snakker vi om sannsynligheter.

## 10

* 92 kvalitativt forskjellige grunnstoffer er ganske mange, det hadde vært mye mer tilfredsstillende å kun ha noen få forskjellige byggeklosser som verden er bygget opp av.

## 11

* Relativitetsteorien er deterministisk, og forutsetter ting som at vi vet hvor ting er og hvordan de beveger seg. Kvantemekanikken er ikke deterministisk, og vi vet ikke hvor ting er og hvordan de beveger seg.

\pagebreak

# Mayr

## 1

* Vitalisme er egenskapen om å være levende.
* Descartes ignorerte vitalisme, og påstod at en levende organisme ikke er mer enn en deterministisk maskin.
* Biologer var overbevist om at det var en forskjell på det levende og det ikke-levende.


+ 88
- 0
exphil/gr2.mdn View File

@@ -0,0 +1,88 @@
# Seminaroppgave 2

## 1

_I artikkelen gjennomgår Feldman ulike tolkninger av relativismen. Hva er hensikten med å stille opp R1? Hvorfor krever han at en tolkning av relativismen må være filosofisk interessant? (Her bør du tenke over hva det ville bety for etisk teori hvis en filosofisk interessant tolkning av R1 var sann.)_

* Hva er hensikten med å stille opp R1?
* R1 er en mer daglidgags måte å stille opp R2, men ikke presis nok.

* Hvorfor krever han at en tolkning av relativismen må være filosofisk interessant?
* Det er ikke interessant å diskutere noe triviellt; meningsrelativismen er udiskutabelt sann, og derfor uinteressant.

## 2

_Hva forstår Feldman med absolutisme? Betyr dette ordet her det samme som i Frieds artikkel? Er utilitarismen og deontologien absolutistisk teorier? Hva med dygsetikken?_

* Hva forstår Feldman med absolutisme?
* Absolutisme er at det finnes et moralsk kriterium som er sant for alle mennesker.

* Betyr dette ordet her det samme som i Freids artikkel?

* Er utilitarismen og deontologien absolutistiske teorier?

* Hva med dygsetikken?
* Dygdsetikken er absolutistisk, fordi den oppretter dygd som et absolutt moralsk kriterium.

## 3

_Forklar kort hva meningsrelativisme (i begge versjoner) er. Fanger denne tolkningen inn R1?_

* Forklar hva meningsrelativisme er.
* Meningsrelativisme: Det som er rett for en person trenger ikke å være rett for en annen.
* Bla: bla.

* Fanger denne tolkningen inn R1?
* Nei. R1 sier hva som er rett, i steden for hva personer oppfatter at er rett.

## 4

_I hvilken forstand kan konvensjonalismen sies å være et bedre uttrykk for tanken bak den sosiale meningsrelativismen? Nevn (bare kort) problemene med å formulere disse. Fanger konvensjonalismen, slik Feldman fremstiller denne, inn R1? Redegjør for hans argumenter._

* I hvilken forstand kan konvensjonalismen sies å være et bedre uttrykk for tanken bak den sosiale meningsrelativismen?
* Konvensjonalismen snakker om hva som faktisk er moralsk riktig, mens den sosiale meningsrelativismen snakker om hva folk mener er moralsk rett.

* Nevn problemene med å formulere meningene.
* Argumentene krever at en kan snakke om hvilket samfunn en person tilhører, men det er sjeldent mulig å si at en person tilhører akkurat et samfunn. Det er mulig å være del i to samfunn på samme tid med motstridende konvensjoner.

* Fanger konvensjonalismen, slik Feldman fremstiller denne, inn R1?
* Ja. R1 er bredere enn konvensjonalismen, men begge snkker om hva som faktisk er rett, ikke om meninger om hva som er rett.

## 5

_Hva karakteriserer begrepsrelativismen (nynorsk: omgrepsrelativismen)? På hvilken måte tar den opp i seg elementer fra konvensjonalismen? Hvorfor mener Feldman at denne tolkningen fanger inn R1?_

* Hva karakteriserer begrepsrelativismen?

* På hvilken måte tar den opp i seg elementer fra konvensjonalismen?

* Hvorfor mener Feldman at denne tolkningen fanger inn R1?

## 6

_Hva går resonnementet om ikke-konflikt ut på? I hvilken forstand er dette et argument mot etisk relativisme? Er det ikke nettopp en motivasjon bak relativismen at man ikke skal kunne fordømme andre moralske oppfatninger?_

* Hva går resonnementet om ikke-konflikt ut på?
* Det gir ikke mening at det er konflikt mellom to samfunn, fordi samfunnene burde

* I hvilken forstand er dette et argument mot etisk relativisme?
* Argumentet viser at ikke alle er etiske relativister.

* Er det ikke nettop en motivasjon bak relativismen at man ikke skal kunne fordømme andre moralske oppfatninger?
* idfk

## 7

_Hva er reformatorens dilemma? I hvilken forstand er dette et argument mot etisk relativisme?_



## 8

_Feldman hevder i det siste avsnittet om begrepsrelativismen (rett før diskusjonen av relativisme og toleranse) at det er et stort problem å definere begrepsrelativismen på en konsistent måte. Hva er problemet?_



## 9

_Hva menes med toleranse? Hvorfor kan man ifølge Feldman ikke hevde at (ekte) etisk relativisme fører til toleranse? Mener du at han har rett? Gitt at han har rett, har det da noen hensikt å være relativist? Diskuter._

BIN
exphil/gr2.pdf View File


BIN
exphil/semesteroppgave/semesteroppgave.docx View File


+ 143
- 0
exphil/semesteroppgave/semesteroppgave.mdn View File

@@ -0,0 +1,143 @@
# Semesteroppgave

> Fred Feldman hevder i teksten «Relativismen» at mange ser på relativisme som en naturlig videreføring av en opplyst, tolerant holdning overfor ulike skikker i ulike samfunn. Redegjør for de forskjellige tolkninger av relativisme som Feldman legger frem i teksten. Drøft om toleranse kan medføre relativisme.

## Innledning

I denne oppgaven vil jeg først definere begrepet etikk. I tillegg vil jeg redegjøre for de forskjellige tolkningene av relativismen Feldman legger frem, og drøfte om toleranse kan medføre relativisme.

## Etikk


Fra læreboken:

> I metaetikken reflekterer man over visse grunnlagsspørsmål ved moralen: om moralen er objektiv eller subjektiv; om moralske utsagn kan begrunnes. I metaetikken er man ikke opptatt av det normative spørsmålet om hvordan vi bør handle, men for eksempel av hvorvidt det er mulig å gi et objektivt svar på spørsmålet om hvordan vi bør handle.

Finnes det moralske egenskaper?
Hvordan kan vi få skaffe oss moralsk kunnskap?
Varierer moralske oppfatninger på tvers av kulturer?

En del av de tankene som drøftes via relativismen hører hjemme innen metaetikken. I dette ligger at relativismen studerer moralske begreper, samt hvordan vi kan erkjenne og begrunne påstander om moral, og hva som er etikkens metafysiske forutsetninger. Metaetikken er ikke selv opptatt av å anbefale hva vi bør gjøre eller hvordan vi bør leve, men er i stedet opptatt av å undersøke moralens natur (Sagdahl 2015).

## Moralsk relativisme
I artikkelen om relativismen innleder Fred Feldman med et eksempel om to familier, familien Smith og familien Jones, hvor Smith-familien har invitert Jones-falilien til middag. De i familien Smith er glade i kjøtt, og har dermed servert en stekt gris med et eple i munnen til middag, men de i familien Jones er vegetarianere av moralske grunner. De i familien Smith mener at det er moralsk rett å spise kjøtt, mens de i familien Jones mener det er moralsk feil. Uenigheten løses ved at Smith-familien spiser grisen mens Jones-familien spiser eplet. Det filosofiske premisset som blir etablert, er at det som er riktig for den ene familien ikke nødvendigvis er riktig for den andre familien. Dette er et eksempel på moralsk relativisme; to familier har motsatt moralske innretning.

Også i andre sammenhenger vil folk finne veier rundt moralske spørsmål ved hjelp av relativismen med utsagn av typen "det som re riktig for dere trenger ikke være riktig for oss." Feldman påpeker at det er mange ulike fortolkninger av det relativistiske prinsipp, selv om man er enig om at det er et viktig prinsipp. I artikkelen sin forsøker han å løse opp i betydningsfloken og skille de ulike betydningene fra hverandre. Han vurderer også om noen er mer sanne enn andre og om noen av betydningene er mer filosofisk interessante enn andre.

Nedenfor beskriver jeg de ulike betydningene som Fred Feldman har satt opp og gjengir hans vurderinger om betydningene er sanne og om de er av filosofisk interesse.

### Meningsrelativisme
Her vil jeg redegjøre for Fred Feldmans tolkning av relativismen som han kaller _meningsrelativisme_.

Meningsrelativismen er en form for relativisme som sier at det finnes ihvertfall noen situasjoner hvor to eller flere personer er uenige i hvorvidt noe er moralsk riktig eller ikke.

I kortform sier Feldman at meningsrelativisme betyr at det som er riktig for en person, ikke trenger å være rikitg for en annen. Sagt på en annen måte betyr dette at det er mulig at det finnes handlinger som er slik at en person mener at den typen handlinger er moralsk riktige, mens en annen person mener at den typen handling ikke er moralsk riktig. Det siste tilfellet kaller Feldman **personlig meningsrelativisme**. Det betyr rett og slett at de moralske overbevisningene til en person kan være forskjellig fra overbevisningene til en annen person.

Det er også slik at det er lett å hevde at en moralsk overbevisning i ett samfunn kan være ulik den moralske overbevisningen i et annet samfunn. Dette mener Feldman at er en vanskeligere påstand, ettersom det er uklart hva som egentlig ligger i begrepet "samfunn". Det er heller ikke lett å gi presis definisjon av begrepet "samfunn" - og skulle vi likevel klare å definere "samfunn" råker vi ut for det faktum at "samfunn" "strengt tatt ikke har overbevisninger. Overbevisningene ligger på et et individuelt nivå i det enkelte menneske.

Feldman foreslår at vi kanskje kan hevde at et samfunn har en overbevisning dersom det store flertallet av samfunnsmedlemmene har en felles overbevisning. Basert på dette formulerer Feldman lærsetninga om sosial meningsrelativisme slik:

_"Det er mogleg at det finst handlingar som er slik at eitt samfunn meiner at den slags handlingar er moralsk rette, mens eit anna samfunn ikkje meiner at den slags handlingar er moralsk rette"_

Feldman slår fast at læresetninga om sosial meningsrelativisme er sann. Den som er enig i at det fins "sanfunn", må også være enig i lærestninga, sier Feldman, og viser til antropologien.

_Konklusjonen til Feldman er altså at meningsrelativismen ser ut til å være sann._

Det neste Feldman drøfter er om meningsrelativismen er av filosofisk interesse. Har det noe å si for etisk teori at meningsrelativismen er sann? I denne vurderingen trekker Feldman inn _absolutismen_. I følge Wikipedia betyr absolutisme i filosofisk betydning at det finnes et moralsk kriterium som gjelder for alle mennesker til alle tider. Det finnes faste universelle standarder. Det vil si at det finnes en eneste moralsk standard. Eksempler på filosofisk absolutisme er utilitarisme og kantianisme. Feldman beskriver absolutisme som den oppfatningen at det finnes ett moralsk kriterium som gjelder for alle mennesker for alle tider. Med andre ord sier absoluttismen at det finnes en eneste endelig moralsk standard.

Feldman ønsker å vurdere om hvorvidt det har noe å si for etisk teori at meningsrelativismen er sann. Det gjør han ved år vudere om meningsrelativisme og absoluttisme motsier hverandre. Årsaken til at han vurderer dette, er at en slik motsigelse vil føre til at realtivismen fortjener en viss interesse.

Feldman setter opp et skjema, som han kaller C, med et absoluttisk innhold: _"C: Ei handling er moralsk rett dersom og berre dersom ..."_. Han påpeker at hvis dette skjemaet kan fylles ut på en måte som gir mening og som gjør at utsagnet blir sant, er absoluttismen sann. Han formulerer absoluttismen slik:

_A: "Det finst ein måte å fylle ut tomrommet i C på som er ikkje-trivielt og som gjer at C blir eit universelt sant moralsk kriterium."_ Denne formuleringen kaller Feldman for _handlingsutilitarisme_. Handlingsutilitarisme er omtalt av Smart i artikkelen "Riss av et system for en utilitaristisk etikk" (Smart 2015). Videre trekker Feldman inn Kants første katogoriske imperativ: _"Jeg skal aldri handle annerledes enn slik at jeg også kan ville at min maksime skal bli en allmenn lov"_ (Kant 2015)

Basert på dette trekker Feldman disse konklusjonene:

1. Det finnes et forhold som gjelder overalt som et nødvendig og tilstrekkelig vilkår for hva som er moralsk rett. Han fyller ut skjema C på denne måten: _"Ei handling er moralsk rett dersom og berre dersom ho er minst like nyttig som alle alternativ"._
2. Det ikke er noen motstrid mellom absoluttismen, slik den er uttrykt i skjema C, og relativismen. At folk eller samfunn har ulike oppfatninger om moral, betyr ikke nødvendigvis at vi kan trekke slutninger om en universell moralsk standard.
3. Relativismen er ikke interessant for moralfilosofien. At personer eller samfunn har sine egne overbevisninger eller normer er ikke i seg selv interessant i et moralfilosofisk perspektiv, ettersom forekomsten av slike overbevisninger er sammenfallende med handlingsutilitarismen og det kategoriske imperativ, og ikke sier noe om sannhetsgehalten i absoluttismen.


### Konvensjonalisme
Her vil jeg redegjøre for Fred Feldmans tolkning av relativismen som han kaller _konvensjonalisme_.

Konvensjonalismen er den oppfatningen at man skal handle på den måten som samfunnet man er den del av mener man skal handle. Det er de moralske konvensjonene i samfunnet man er en del av, som avgjør hvilke moralske plikter man har. Dette er i følge Fred Feldman en fortolkning av læresetninga _"det som er rett i ett samfunn kan være feil i et annet samfunn"_.

Feldman stiller opp noen forutsetninger for å kunne fremstille konvensjonalismen ordentlig:

1. Vi må gå ut fra at det for hver handling finnes nøyaktig ett samfunn som er det samfunnet som handlingen blit utført i. Dette er en forutsetning for å kunne avgjøre hvem sine konvensjoner som som avgjør den normative statusen for handlingen.
2. Vi må ut fra at hvert samfunn har ett sett med konvensjoner eller allmenne moralprinsipp, og vi må gå ut fra at hvert sett av konvensjoner er konsistent. Gjennom dette vil de handlingene man utfører være enten riktig eller gal. Feldman bruker også begrepet "påboden", men slik jeg ser det er dette et subsett av riktig eller galt og derfor unødvendig å nevnte eksplisitt.
3. Ei handling er tillatte etter konvensjonene i et samfunn hvis og bare hvis konvensjonene gir handlingen den normative statusen "rett".

Feldman formulerer følgende skjema for konvensjonalisme:

_"Ei handling er moralsk rett dersom og berre dersom ho er tillaten av konvensjonane i samfunnet."_ I følge konvensjonalisten kan det som er rett i ett samfunn være feil i et annet samfunn.

Feldman hevder at det største problemet er et begrepsproblem, ettersom vi må ut fra at for hver handling er det nøyaktig ett samfunn som er samfunnet der handlingen blir utført. Hvis vi ikke går ut fra dette, vil vi ikke kunne fremstille konvensjonalismen på en logisk holdbr måte. Feldman hevder at det ikke lar seg gjøre å identifisere nøyaktig ett samfunn. Feldman problematiserer dette både på individnivå - man kan tilsynelatende bo i samme samfunn med likevel ha svært ulike konvensjoner å leve etter. Og han problematiserer det på samfunnsnivå gjennom å stille spørsmålet om hva slags egenskaper en gruppe må ha felles for å være medlemmer av samme samfunn. Dette aktualiseres også etter min mening med de "paralellsamfunnene" som er identifisert i Sverige i forbindelse med terrorangrepene i Paris og Brüssel, og de historiene som fortelles om religiøse sekter i Norge som i realiteten er paralellsamfunn.

Gjenom eksempler viser Feldman at skjemaet som er satt opp, fører til at både gode og onde personer og gode og onde samfunn er i sin rett dersom de bare handler i tråd med samfunnets konvensjoner. Konvensjonalismen impliserer at vi ikke kan fordømme medlemmene i et samfunn for å følge samfunnets konvensjoner, om så konvensjonene tillater drap, slaveri, utnyttelse av kvinner og barn osv.

Feldman konkluderer med at dersom vi aksepterer konvensjonalismen, ser det ut til at vi ikke blir i stand til å sammenligne moralen i ulike samfunn. Dette virker som et alvorlig tap.



### Reformatorens dilemma
Som en del av drøftingen av konvensjonalismen trekker Fred Feldman inn det han kaller _reformatorens dilemma_. Reformatorens dilemma kan kort forklares som at at det er feil i følge konvensjonalismen å gå imot konvensjonene i sitt eget samfunn, det er altså umoralsk å gjøre noe som ikke er i tråd med det samfunnet sier. Dette gjør at konvensjonalismen ikke tillater samfunnsendringer eller reformer så lenge de moralske konvensjonene gjelder. Hvis konvensjonalismen er sann, tar reformatoren feil uansett hvordan samfunnets moralske konvensjoner er og hvor rett reformatoren har i sin samfunnskritikk. Dette fordi samfunnsborgerne handler rett bare hvis de følger de moralske konvensjonene i samfunnet.


Feldman fører også bevis for at konvensjonalismen ikke står i motstrid til absoluttismen slik Feldman formulerer absoluttismen. Han viser at skjemaet "Ei handling er moralsk rett dersom og berre dersom ho er tillaten av konvensjonane i samfunnet" er forenlig med absoluttismen, og at absoluttismen er sann dersom konvensjonalismen er sann. Hvis vi forutsetter at utsagnet i skjemaet er sant, finnes det en eneste endelig moralsk standard som er sann overalt, og den standarden er utsagnet i seg selv. Absoluttisme er definert som læren om at det finnes en eneste endelig moralsk standard. Hvis Feldmans skjema er sant, er altså absoluttismen sann.

Feldman trekker den slutningen at hvis konvensjonalismen er sann, er konvensjonelle handlinger moralsk rett over alt. Denne slutningen viser også at konvensjonalismen viser seg å være en ekstremt konservativ læresetning.



### Begrepsrelativisme
Her vil jeg redegjøre for Fred Feldmans tolkning av relativismen som han kaller _begrepsrelativisme_.

Under begrepsrelativismen hevder Feldman at "rett" og "galt" er meningsløse begreper alene. At noe er rett eller galt er alltid et forhold mellom handlinger og samfunn. Man har ikke noe entydig svar på hva som er rett eller galt hvis man ikke har noe å sette "rett" og "galt" i forhold til. Feldman påpeker at om noe er rett, er et forhold mellom en handling og et samfunn. En handling kan være rett i forhold til ett samfunn, og den samme handlingen kan være feil i forhold til et annet samfunn. Ingen handling er ganske enkelt "rett".

Dersom en person hevder at en handling er moralsk rett, mener Feldman at utsagnet bare er et halvveis utsagn som verken er rett eller galt så lenge personen ikke sier hvilket samfunn han eller hun har i tankene.

I følge Feldman kan dette rent metafysisk uttrykkes slik: _"Det fint ingen eigenskap "rett". At noko er rett, er eit forhold mellom handlingar og samfunn."_
Og lingvistisk kan det uttrykkes slik: _"Setningar på forma "handling a er moralsk rett" er anten meinigslause eller forkortingar for setningar på forma "handling a er moralsk rett i samfunn S"._

Feldman viser at begrepsrelativismen har som en konsekvens at den umuliggjør moralske konflikter mellom samfunn. Men han viser også at det er ulogisk at det kan være ikke-konflikt mellom samfunn med ulike moralsyn, og gjennomfører derfor et resonnement om ikke-konflikt.

I resonnementet om ikke-konflikt viser feldman at de som støtter enten det metafysiske eller lingvistiske uttrykket over vil måtte hanskes med spørmål om moralsk konflikt mellom samfunn. Feldman påpeker at begrepsrelativismen støter på to andre problem også:

1. Begrepsrelativismen er avhengig av begrepet "samfunn". Dersom begrepet samfunn er uklart eller umulig å definere, vil ikke begrepsrelativismen fungere.
2. Det følger av begrepsrelativismen at det ikke finnes noen egenskaper som "moralsk rett". Det gjør det vanskelig å forklare hva "rett i samfunn S" kan bety. Dersom egenskapen "rett" ikke finnes, kan vi ikke definere noe som "rett".


### Medfører toleranse relativisme?
Her vil jeg drøfte om toleranse kan medføre relativisme, basert på kapitlet "Relativisme og toleranse" i Feldmans artikkel <referanse>.

Enkelte påstår at relativisme i etikken er den naturlige utviklingen av en opplyst, tolerant holdning til de ulike skikkene i et uensartet samfunn. Det hevdes også at ettersom relativismen er sann, bør vi peøve å være mindre sjåvinistiske.

Ut fra resonnementene som er vist over, er det klart at meningsrelativismen ikke sier noe om toleranse.

Det er ikke mulig å trekke den konklusjonen at personlig meningsrelativisme: _"Det er mogleg at det finst handlingar som er slik at éin person meiner at den slags handlingar er moralsk rette, mens ein anna person ikkje meiner at at den slags handlingar er moralsk rette."_ legger til rette for et tolerant samfunn. Heller ikke for sosial meningsrelativisme: _"Det er mogleg at det finst handlingar som er slik at eitt samfunn meiner at den slags handlingar er moralsk rette, mens eit anna samfunn ikkje meiner at den slags handlingar er moralsk rette"_ er det en klar konklusjon at dette fører til toleranse. I følge Feldman har ikke meningsrelativismen noe å fortelle om toleranse. Det er ikke mulig å trekke en slutning ut fra det faktumet at folk i ulike samfunn har ulike moraloppfatninger, til at menneskene bør være tolerante. Etter min mening er det mer sannsynlig at meningsrelativisme kan føre til skuldertrekk og likegyldighet enn til toleranse.

Om konvensjonlismen sier Feldman at den har konsekvenser for toleransen basert på utsagnet: _"Ei handling er moralsk rett dersom og berre dersom ho er tillaten av konvensjonane i samfunnet."_. Men disse konsekvensene åpner ikke for toleranse, nærmere tvert i mot. Utsagnet medfører at en toleransehandling er rett dersom og bare dersom den er rett etter konvensjonene i samfunnet. Det er konvensjonene i samfunnet som er avgjørende for om konvensjonalismen åpner for toleranse, ikke konvensjonalismen i seg selv. Feldman hevder det kan være inkonsistent å hevde både at konvensjonalismen er sann og at toleranse er rett overalt. Etter min mening er konvensjonalismen konserverende, og kan i sin grelleste form føre til sjåvinisme, rasisme, sexisme og andre varianter at intoleranse dersom disse meningene er i samsvar med konvensjonene i samfunnet. I tillegg vil det være vanskelig å reformere et intolerant samfunn basert på konvensjonalismeteorien, som vist under "Reformatorens dilemma".

Begrepsrelativismen fører til en lignende konklusjon. Påstanden om at det er moralsk rett å være tolerant, er i følge begrepsrelativismen ufullstendig. Påstanden er enten meningsløs eller en forkortelse for en påstand av typen "teleranse er rett i samfunn S". Etter begrepsrelativistens grunnsyn finnes det ikke noe som er rett eller galt. Etter min mening kan dette føre til likegyldighet, ettersom det ikke er noe fast norm for "rett" Hvis egenskapen "rett" ikke finnes, kan vi ikke definere noe som "rett". Og da blir det heller ikke noe som er "galt". Jeg mener at det ikke er tolerant å akseptere kjønnslemlestelse av kvinner i visse samfunn bare fordi en begrepsrelativist ikke kan si om det er "rett" eller "galt", jeg mener at det er likegyldighet å ikke engasjere seg i saker som skader andre personer fysisk og psykisk.


## Konklusjon

I denne oppgaven har jeg redegjort for de forskjellige tolkningene av relativismen Feldman legger frem, og drøftet om toleranse kan medføre relativisme.

Feldman trekker den slutningen at det ikke følger av relativismen at folk bør være mer eller mindre tolerante. Noen former for relativisme har ingenting å fortelle om toleranse, mens andre former for relativisme krever at vi skal være tolerante hvis og bare hvis konvensjonene i samfunnet krever toleranse. Uansett hvordan relativismen forstås, følger det ikke logisk at at vi bør prøve å utvikle en mer tolerant holdning overfor andres moraloppfatninger.

For min del vil jeg gå så langt som til å påstå at konvensjonalismen, litt avhengig av forklaringsmodell, kan føre til sjåvinisme, rasisme, sexisme o.l. (konvensjonalismen) eller likegyldighet (meningsrelativismen og begrepskonvensjonalismen)

Relativisme ser for meg ut til å være enten triviell, selvmotsigende, eller fører til at vi ikke kan kritisere andre samfunn. Ingen av de valgene er nyttige.

## Kilder

Sagdahl, Mathias. 2015. "etikk". I Store Norske Leksikon. Oppsøkt 06. Mai 2016, fra <https://snl.no/etikk>

Smart, John Jamieson Carswell. 2015. Riss av et system for en utilitaristisk etikk. I IFIKK (red). Exphil II. Tekster i etikk. Oslo: Gyldendal Norsk Forlag.

Kant, Immmanuel. 2015. Grunnlegging til moralens metafysikk. I IFIKK (red). Exphil I. Filosofi- og vitenskapshistorie. Oslo: Gyldendal Norsk Forlag.

BIN
exphil/semesteroppgave/semesteroppgave.odt View File


BIN
inf1000/gr1/W0.class View File


+ 12
- 0
inf1000/gr1/W0.java View File

@@ -0,0 +1,12 @@
import java.util.Scanner;

class W0 {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);

int n1 = s.nextInt();
int n2 = s.nextInt();

System.out.println(n1+"+"+n2+"="+(n1+n2));
}
}

+ 35
- 0
inf1000/gr1/w0.md View File

@@ -0,0 +1,35 @@
# Seminaroppgaver til uke 0

## Oppgave 1

`System.out.print` printer kun ut teksten en skriver, `System.out.println` legger til en newline.

## Oppgave 2

b og e er gyldige; javac kompilerer alt som har extension `.java`, og den kompilerte filen vil få navnet `Student.class` uansett.

## Oppgave 3

PrintAlder printer:

Din alder er 30

Summere heltall:

class SumHeltall {
public static void main(String[] args) {
int a = 4;
int b = 5;

System.out.println(a + b);
}
}

## Oppgave 4

39 + 3
42

## Oppgave 5

Tall 1: 5 og tall 2: 3456 blir til sammen 3461

+ 9
- 0
inf1000/gr2/O1.java View File

@@ -0,0 +1,9 @@
class O1 {
public static void main(String[] args) {
int i = 0;
while (i < 5) {
System.out.println(i);
i += 1;
}
}
}

+ 15
- 0
inf1000/gr2/O2.java View File

@@ -0,0 +1,15 @@
import java.util.Scanner;

class O2 {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);

while (true) {
int i = s.nextInt();
if (i == 10) {
System.out.println("Warning: 10 detected. You will now be terminated.");
break;
}
}
}
}

+ 19
- 0
inf1000/gr2/O3.java View File

@@ -0,0 +1,19 @@
class O3 {
public static void main(String[] args) {
double[] arr = new double[10];
arr[0] = 10.0;
int i;

i = 1;
while (i < arr.length) {
arr[i] = arr[i-1] / 2;
i += 1;
}

i = 0;
while (i < arr.length) {
System.out.println("arr["+i+"]: "+arr[i]);
i += 1;
}
}
}

+ 3
- 0
inf1000/gr2/O5.txt View File

@@ -0,0 +1,3 @@
Hallo
Geir
Kjetil

BIN
inf1000/hw1/Arena.class View File


BIN
inf1000/hw1/Ball.class View File


BIN
inf1000/hw1/Beslutninger.class View File


+ 39
- 0
inf1000/hw1/Beslutninger.java View File

@@ -0,0 +1,39 @@
import java.util.Scanner;

class Beslutninger {
private static void a() {
int age = 18;
}

private static void b() {
int age = 18;

//Checks the user's age, telling whether they're legal age or not
if (age >= 18) {
System.out.println("You're of legal age.");
} else {
System.out.println("You're not of legal age.");
}
}

private static void c() {
Scanner s = new Scanner(System.in);

//Asks the user how old they are
System.out.println("How old are you?");
int age = s.nextInt();

//Checks the user's age, telling whether they're legal age or not
if (age >= 18) {
System.out.println("You're of legal age.");
} else {
System.out.println("You're not of legal age.");
}
}

public static void main(String[] args) {
a();
b();
c();
}
}

BIN
inf1000/hw1/Billettpris.class View File


+ 20
- 0
inf1000/hw1/Billettpris.java View File

@@ -0,0 +1,20 @@
import java.util.Scanner;

class Billettpris {
public static int price = 50;

public static void main(String[] angs) {
Scanner s = new Scanner(System.in);

//Asks the user how old they are
System.out.println("How old are you?");
int age = s.nextInt();

//Checks the user's age, telling them what price they have to pay
if (age > 67 || age < 12) {
System.out.println("Price: "+(price / 2));
} else {
System.out.println("Price: "+price);
}
}
}

BIN
inf1000/hw1/HeiStudent.class View File


+ 46
- 0
inf1000/hw1/HeiStudent.java View File

@@ -0,0 +1,46 @@
import java.util.Scanner;

class HeiStudent {
private static void a() {
System.out.println("Hei student!");
}

private static void b() {
String name = "Martin";
System.out.println("Hello, "+name);
}

private static void c() {
//Asks the user what age they are, printing the name back to them
System.out.println("What's your name?");
Scanner s = new Scanner(System.in);
System.out.println("Hello "+s.nextLine());
}

private static void d() {
int a = 10;
int b = 200;
System.out.println(a+"+"+b+"="+(a+b));
}

private static void e() {
Scanner s = new Scanner(System.in);

//Asks the user for two number
System.out.println("Write a number.");
int a = s.nextInt();
System.out.println("Write another number.");
int b = s.nextInt();

//Tells the user the sum of the numbers they entered
System.out.println(a+"+"+b+"="+(a+b));
}

public static void main(String[] args) {
a();
b();
c();
d();
e();
}
}

BIN
inf1000/hw1/LikeVerdier.class View File


+ 42
- 0
inf1000/hw1/LikeVerdier.java View File

@@ -0,0 +1,42 @@
import java.util.Scanner;

class LikeVerdier {
private static void a() {
int c = 256;
int d = 1024;
}

private static void b() {
int c = 256;
int d = 1024;

if (c == d) {
System.out.println("C and D are equal.");
} else {
System.out.println("C and D are different.");
}
}

private static void c() {
Scanner s = new Scanner(System.in);

//Asks the user for two value
System.out.println("Input C");
int c = s.nextInt();
System.out.println("Input D");
int d = s.nextInt();

//Tells the user whether the values they entered were equal or not
if (c == d) {
System.out.println("C and D are equal.");
} else {
System.out.println("C and D are different.");
}
}

public static void main(String[] args) {
a();
b();
c();
}
}

BIN
inf1000/hw1/MinOppgave1.class View File


+ 176
- 0
inf1000/hw1/MinOppgave1.java View File

@@ -0,0 +1,176 @@
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Random;

//A 2D vector, with an x and a y property
class Vec2 {
public int x;
public int y;

public Vec2(int vx, int vy) {
x = vx;
y = vy;
}
}

//A ball, with a velocity and position
class Ball {
public Vec2 pos;
public Vec2 vel;
public final String img = "0";

public Ball(int x, int y, int vx, int vy) {
pos = new Vec2(x, y);
vel = new Vec2(vx, vy);
}

//Update the ball's position, according to its velocicty
public void update() {
pos.x += vel.x;
pos.y += vel.y;
}
}

//An arena full of balls
class Arena {
private Vec2 dimensions;
private ArrayList<Ball> balls;
private final String ANSI_CLS = "\u001b[2J";
private final String ANSI_HOME = "\u001b[H";

public Arena(int w, int h) {
dimensions = new Vec2(w, h);
balls = new ArrayList<Ball>();
}

public void addBall(Ball b) {
balls.add(b);
}

//Update all balls, reversing their velocity if they collide with walls
public void update() {
for (Ball b: balls) {
if (b.pos.x + b.vel.x <= 0 || b.pos.x + b.vel.x >= dimensions.x) {
b.vel.x *= -1;
}
if (b.pos.y + b.vel.y < 0 || b.pos.y + b.vel.y >= dimensions.y) {
b.vel.y *= -1;
}

b.update();
}
}

public void draw() {
//Buffer to avoid drawing to the screen a billion times
String str = "";

//Draw top part of frame
str += " ";
for (int i = 0; i < dimensions.x; ++i) {
str += "-";
}
str += "\n";

//Draw all balls
for (int y = 0; y < dimensions.y; ++y) {
str += "|";
for (int x = 0; x < dimensions.x; ++x) {

//Draw a ball if there's a ball in this square
boolean isBall = false;
for (Ball b: balls) {
if (b.pos.x == x && b.pos.y == y) {
isBall = true;
str += b.img;
break;
}
}

//Draw blank if there's no ball here
if (!isBall)
str += " ";
}
str += "|\n";
}

//Draw bottom part of frame
str += " ";
for (int i = 0; i < dimensions.x; ++i) {
str += "-";
}

//Clear the screen and print
System.out.print(ANSI_CLS + ANSI_HOME + str);
}
}

class MinOppgave1 {
private static Arena arena;
private static final Random rand = new Random();

//Random int in range
private static int randInt(int min, int max) {
return rand.nextInt((max - min) + 1) + min;
}

//Overloading randInt to let us exclude a number if we want
private static int randInt(int min, int max, int exclude) {
int r;
do {
r = rand.nextInt((max - min) + 1) + min;
} while (r == exclude);

return r;
}

//We generally don't want user input to be 0 or negative
private static int getPositiveInt(Scanner s) {
int i = s.nextInt();

if (i <= 0) {
System.out.println("Please only input positive integers.");
System.exit(1);
}

return i;
}

public static void main(String[] args) {
Scanner s = new Scanner(System.in);

//Get arena width, arena height, and the amount of balls from the user
System.out.println("Insert arena width");
int width = getPositiveInt(s);
System.out.println("Insert arena height");
int height = getPositiveInt(s);
System.out.println("How many balls do you want?");
int nBalls = getPositiveInt(s);

arena = new Arena(width, height);

//Add balls to the arena, with a random position and velocity
for (int i = 0; i < nBalls; ++i) {
arena.addBall(new Ball(
randInt(0, width), //X
randInt(0, height), //Y
randInt(-4, 4, 0), //Velocity X
randInt(-2, 2, 0) //Velocity Y
));
}

//Update the arena (moving the balls, etc), draw the result,
//and sleep for 33 milliseconds to get an animation at about 30 FPS
while (true) {
arena.update();
arena.draw();

try {
Thread.sleep(33);
} catch (Exception e) {
System.out.println("Failed to sleep.");
System.exit(1);
}
}
}
}

+ 2
- 0
inf1000/hw1/README.txt View File

@@ -0,0 +1,2 @@
* Jeg synes innleveringen var lett.
* Jeg brukte ca. en time.

BIN
inf1000/hw1/Vec2.class View File


BIN
inf1000/hw2/A.class View File


BIN
inf1000/hw2/Arena.class View File


BIN
inf1000/hw2/Block.class View File


BIN
inf1000/hw2/Bullet.class View File


BIN
inf1000/hw2/Enemy$1.class View File


BIN
inf1000/hw2/Enemy$Direction.class View File


BIN
inf1000/hw2/Enemy.class View File


+ 34
- 0
inf1000/hw2/EnkelKalkulator.java View File

@@ -0,0 +1,34 @@
import java.util.Scanner;

class EnkelKalkulator {
private static void add(int n1, int n2) {
System.out.println(n1 + n2);
}

private static void sub(int n1, int n2) {
System.out.println(n1 - n2);
}

private static void multi(int n1, int n2) {
System.out.println(n1 * n2);
}

public static void main(String[] args) {
Scanner s = new Scanner(System.in);

System.out.println("First number:");
int n1 = s.nextInt();

System.out.println("Second number:");
int n2 = s.nextInt();

System.out.println(n1+"+"+n2+":");
add(n1, n2);

System.out.println(n1+"-"+n2+":");
sub(n1, n2);

System.out.println(n1+"*"+n2+":");
multi(n1, n2);
}
}

BIN
inf1000/hw2/Entity.class View File


+ 11
- 0
inf1000/hw2/Feilmeldinger.txt View File

@@ -0,0 +1,11 @@
A)

Kjoerefeil er feil som forekommer mens programmet kjoerer, etter at det er kompilert. Kompileringsfeil er feil som fanges opp av kompilatoren (javac).

B)

1. Jeg ser paa den foerste feilmeldingen, og ser at den peker paa linje 1 i koden min. Jeg ser deretter mot den foerste linjen, som javac var saa snill aa printe ut sammen med feilmeldingen, og ser umiddelbart at det staar "Class" der, mens det skulle ha staatt "class". Jeg aapner deretter tekstfilen og erstatter "Class" med "class".

2. Den andre feilen er en foelgefeil. Javac vet ikke at linje 2 er inni en klasse fordi den ikke har funnet et "class"-noekkelord, saa den tror vi proever aa definere en metode utenfor en klasse, noe Java ikke tillater. Med en gang vi fikser den foerste feilen vil kompilatoren vite at den linjen er i en klasse, og dermed er det ikke noe problem aa definere en metode der.

3. Jeg ser at javac klager paa en manglende semikolon, saa jeg ser til den linjen javac printer ut. Jeg ser at det mangler et semikolon der, saa jeg jeg aapner tekstfilen og legger til et semikolon.

+ 49
- 0
inf1000/hw2/Kodeflyt.txt View File

@@ -0,0 +1,49 @@
import java.util.Scanner;
public class PersonRegister {
public static void main(String[] args) {
1 Scanner innleser = new Scanner(System.in);
2 String navn = "Ikke satt";
3 String bosted = "Ikke satt";
4 int valg = 0;
5 printMeny();
8 valg = Integer.parseInt(innleser.nextLine());

9 if (valg == 1) {
10 registrerPerson();
12 navn = innleser.nextLine();
13 bosted = innleser.nextLine();
}

14 if (valg == 2) {
printPerson(navn, bosted);
}

15 printMeny();
18 valg = Integer.parseInt(innleser.nextLine());

19 if (valg == 1) {
registrerPerson();
navn = innleser.nextLine();
bosted = innleser.nextLine();
}
20 if (valg == 2) {
21 printPerson(navn, bosted);
}
}

// metode for aa gjore valg fra brukeren
static void printMeny() {
16 System.out.println("1. Registrer en person");
17 System.out.println("2. Print personen");
}

// metode for aa skrive ut beskjed om aa registrere en person
static void registrerPerson() {
11 System.out.println("Skriv inn navnet, trykk enter, og skriv saa inn bostedet og trykk enter");
}

// metode for å printe en person
static void printPerson(String navnForUskrift, String bostedForUskrift){
22 System.out.println("Du har registert personen: " + navnForUskrift + " fra " + bostedForUskrift);
}
}

+ 20
- 0
inf1000/hw2/Metoder.java View File

@@ -0,0 +1,20 @@
import java.util.Scanner;

class Metoder {
private static void converse(Scanner s) {
System.out.println("What's your name?");
String name = s.nextLine();
System.out.println("Where do you live?");
String city = s.nextLine();

System.out.println("Hello, "+name+"! You are from "+city+".");
}

public static void main(String[] args) {
Scanner s = new Scanner(System.in);

converse(s);
converse(s);
converse(s);
}
}

BIN
inf1000/hw2/MinOppgave2.class View File


+ 641
- 0
inf1000/hw2/MinOppgave2.java View File

@@ -0,0 +1,641 @@
//Oppgavetekst: Lag et spill.

import java.util.ArrayList;
import java.util.Scanner;
import java.util.Random;
import java.io.Reader;
import java.io.InputStreamReader;

class Util {
public static int randInt(int min, int max) {
return (int)(Math.random() * (max - min) + min);
}

public static int randInt(int min, int max, int skip) {
int i;
do {
i = randInt(min, max);
} while (i != skip);
return i;
}

public static void exit() {
try {
exec("stty sane </dev/tty");
} catch (Exception e) {
//No need to catch the exception; we'll just exit anyways
} finally {
System.exit(0);
}
}

public static void exec(String str) throws Exception {
String[] cmd = {"/bin/sh", "-c", str};
Runtime.getRuntime().exec(cmd).waitFor();
}
}

class Vec2 {
public double x;
public double y;

public Vec2(double vx, double vy) {
x = vx;
y = vy;
}

//It's sometimes useful to get the X and Y value as
//rounded integers
public int intX() {
return (int)Math.round(x);
}
public int intY() {
return (int)Math.round(y);
}
}

class Entity {
public String img;
public String color;
public Vec2 pos;
public Vec2 vel;
public Arena arena;
public boolean dead;
public Entity origin; //For entities which are spawned by other entities

public Entity(double x, double y, Arena a) {
pos = new Vec2(x, y);
vel = new Vec2(0, 0);
arena = a;
dead = false;
}

public void update(ArrayList<Entity> entities) {}

public void move() {
pos.x += vel.x;
pos.y += vel.y;
}

public void die() {
dead = true;
}

public boolean collidesWith(Entity e) {
if (dead || e.dead)
return false;
if (this == e)
return false;

return (pos.intX() == e.pos.intX() && pos.intY() == e.pos.intY());
}

public String identify() {
return identify("entity");
}

public String identify(String name) {
return "Entity "+img+" "+name+" at "+pos.x+", "+pos.y;
}
}

class Player extends Entity {
private boolean onGround;
private static double speedOnGround = 1;
private static double speedInAir = 0.3;
private static double jumpSpeed = 2;

private int shootCounter = 0;
private int shootTimeout = 10;

public Player(double x, double y, Arena a) {
super(x, y, a);
img = " ";
color = "47";
onGround = false;
}

@Override
public String identify() {
return identify("player");
}

public boolean shouldDieFromEnemy() {
return true;
}

@Override
public void die() {
img = (char)27+"[37;41m#"+(char)27+"[0m";
arena.draw();
super.die();
System.out.println("You died!");
Util.exit();
}

@Override
public void update(ArrayList<Entity> entities) {

//Are we standing on anything?
onGround = false;
for (Entity e: entities) {

if (e == this)
continue;

//For whether we're on ground or not,
//we're only interested in blocks
if (e instanceof Block && !onGround) {

//We don't want to be stuck on ground if we're currently rising
if (vel.y <= -0.5)
continue;

//Checking whether we collide on the X axis is simple
if (e.pos.intX() != pos.intX())
continue;

//Checking whether we collide on the Y axis is harder
if ((e.pos.intY() == pos.intY() + 1)
|| ((e.pos.y <= pos.y + vel.y + 1) && (e.pos.y > pos.y))) {
onGround = true;
pos.y = e.pos.intY() - 1;
vel.y = 0;
}

//Die if we touch an enemy.
} else if (shouldDieFromEnemy() && e instanceof Enemy) {
if (collidesWith(e)) {
die();
}

//Die if we touch a bullet
} else if (e instanceof Bullet) {
if (e.collidesWith(this)) {
die();
}
}
}

//Decrement shoot counter
if (shootCounter > 0)
shootCounter -= 1;

//Die if we fall through the arena floor
if (pos.y > arena.dimensions.y)
die();

//Fall if not on ground
if (!onGround)
vel.y += 0.2;

//Bounce off walls
if (pos.intX() + vel.intX() < 0) {
pos.x = 0;
vel.x = -vel.x;
} else if (pos.intX() + vel.intX() >= arena.dimensions.x) {
pos.x = arena.dimensions.x - 1;
vel.x = -vel.x;
}

//Turn velocity back to 0 over time
vel.x *= 0.8;
vel.y *= 0.9;
}

public void jump() {
if (onGround)
vel.y -= jumpSpeed;
}

public void moveLeft() {
if (onGround)
vel.x -= speedOnGround;
else
vel.x -= speedInAir;
}

public void moveRight() {
if (onGround)
vel.x += speedOnGround;
else
vel.x += speedInAir;
}

public void moveDown() {
if (onGround)
pos.y += 1;
else
vel.y += 0.4;
}

public void shoot() {
if (shootCounter > 0)
return;

shootCounter = shootTimeout;
Bullet b1 = new Bullet(pos.x, pos.y, -2, 0, this);
Bullet b2 = new Bullet(pos.x - 1, pos.y, -2, 0, this);
Bullet b3 = new Bullet(pos.x, pos.y, 2, 0, this);
Bullet b4 = new Bullet(pos.x + 1, pos.y, 2, 0, this);
arena.addEntity(b1);
arena.addEntity(b2);
arena.addEntity(b3);
arena.addEntity(b4);
}
}

class Enemy extends Player {
private static double speedOnGround = 0.5;

private enum Direction {
LEFT,
RIGHT
}
private Direction direction;

public Enemy(double x, double y, Arena a) {
super(x, y, a);
img = " ";
color = "41";

//Randomly start walking in a direction
if (Util.randInt(0, 1) == 0)
direction = Direction.LEFT;
else
direction = Direction.RIGHT;
}

@Override
public String identify() {
return identify("enemy");
}

@Override
public boolean shouldDieFromEnemy() {
return false;
}

@Override
public void die() {
dead = true;
}

@Override
public void update(ArrayList<Entity> entities) {

//Randomly decide to change direction
if (Util.randInt(0, 7) == 0) {
if (direction == Direction.LEFT)
direction = Direction.RIGHT;
else
direction = Direction.LEFT;
}

//Randomly decide to jump
if (Util.randInt(0, 23) == 0) {
jump();
}

//Randomly shoot
if (Util.randInt(0, 20) == 0) {
shoot();
}

//Change direction if we get too close to the wall
if (direction == Direction.LEFT && pos.x - 5 < 0)
direction = Direction.RIGHT;
else if (direction == Direction.RIGHT && pos.x + 5 > arena.dimensions.x)
direction = Direction.LEFT;

switch (direction) {
case LEFT:
moveLeft();
break;
case RIGHT:
moveRight();
break;
}

super.update(entities);
}
}

class Bullet extends Entity {
public Entity origin;

public String originalImg;
public String originalColor;
private boolean dieNext = false;

public Bullet(double x, double y, double vx, double vy, Entity o) {
super(x, y, o.arena);

originalImg = "*";
originalColor = o.color.replace("4", "3")+";1";
img = originalImg;
color = originalColor;

vel.x = vx;
vel.y = vy;
origin = o;
}

@Override
public String identify() {
return identify("bullet (origin: "+origin.identify()+")");
}

@Override
public void update(ArrayList<Entity> entities) {

if (dieNext) {
die();
return;
}

Entity collision = null;
for (Entity e: entities) {
if (e.collidesWith(this))
collision = e;

//The bullet should die the next tick if it hits anything
if (e != this && !(e instanceof Bullet) && collidesWith(e)) {
dieNext = true;
}
}

//If the bullet has hit anything, we want it to look like what it hit
if (collision != null) {
img = collision.img;
color = collision.color;
} else {
img = originalImg;
color = originalColor;
}
}

@Override
public boolean collidesWith(Entity e) {
if (e == origin)
return false;
else
return super.collidesWith(e);
}
}

class Block extends Entity {
public Block(int x, int y, Arena a) {
super(x, y, a);
img = " ";
color = "42";
}

@Override
public String identify() {
return identify("block");
}
}

class Arena {
public Vec2 dimensions;
public ArrayList<Entity> entities;
private final String ANSI_CLS = "\u001b[2J";
private final String ANSI_HOME = "\u001b[H";

public Arena(int width, int height) {
dimensions = new Vec2(width, height);
entities = new ArrayList<Entity>();
}

public void addEntity(Entity e) {
entities.add(e);
}

public void update() {

//Move entities
for (int i = entities.size() - 1; i >= 0; --i) {
Entity e = entities.get(i);

if (e.dead) {
entities.remove(i);
} else {
e.move();
}
}

//Update entities
boolean enemiesLeft = false;
for (int i = entities.size() - 1; i >= 0; --i) {
Entity e = entities.get(i);
e.update(entities);

if (e instanceof Enemy)
enemiesLeft = true;
}

if (!enemiesLeft) {
System.out.println("No enemies left! You win!");
Util.exit();
}
}

public void draw() {
String str = "\r\n\r\n\r\n";

//Create draw list
String[][] drawList = new String[dimensions.intX()][dimensions.intY()];
for (Entity e: entities) {
if (!e.dead
&& e.pos.x >= 0 && e.pos.intX() < dimensions.intX()
&& e.pos.y >= 0 && e.pos.intY() < dimensions.intY()) {
drawList[e.pos.intX()][e.pos.intY()] =
(char)27+"["+e.color+"m"+e.img+(char)27+"[0m";
}
}

//Create the horizontal line at the top and bottom of the arena
String horLine = "";
for (int i = 0; i < dimensions.x; ++i) {
horLine += "-";
}

//Append horizontal line to top
str += " "+horLine+"\r\n";

//Draw entities
for (int y = 0; y < dimensions.y; ++y) {
str += "|";
for (int x = 0; x < dimensions.x; ++x) {
String img = drawList[x][y];
if (img == null)
str += " ";
else
str += img;
}
str += "|\r\n";
}

//Append horizontal line to bottom
str += " "+horLine+"\r\n";

//Print the drawn arena
//System.out.print(ANSI_CLS + ANSI_HOME + str);
System.out.print(str);
}

public void generateWorld() {

//Create a floor for the player to stand o
for (int i = 0; i < dimensions.intX(); ++i) {
Block b = new Block(i, dimensions.intY() - 3, this);
addEntity(b);
}

int prevX = dimensions.intX() / 2;
int prevY = dimensions.intY() - 3;

//We want to spawn enemies and such after the terrain
ArrayList<Entity> toAdd = new ArrayList<Entity>();

//Generate the random terrain
while (prevY > 0) {

//Create a random coordinate for the next platform
int nextX = Util.randInt(
prevX - (int)(dimensions.x / 3),
prevX + (int)(dimensions.x / 3)
);
int nextY = Util.randInt(
prevY + 1,
prevY - 3
);

//platforms should have random width
int width = Util.randInt(3, 12);

//We don't want to make platforms outside of the arena
if (nextX < 0)
nextX = 0;
else if (nextX >= (int)dimensions.x - width)
nextX = (int)dimensions.x - 1 - width;

//Add the platform block
for (int i = 0; i < width; ++i) {
Block b = new Block(nextX + i, nextY, this);
addEntity(b);
}

//Randomly decide to spawn an enemy on top
if (Util.randInt(0, 3) == 0) {
Enemy e = new Enemy(nextX, nextY - 1, this);
toAdd.add(e);
}

prevX = nextX;
prevY = nextY;
}

//Now that terrain is created, add enemies and such
for (Entity e: toAdd) {
addEntity(e);
}
}
}

class MinOppgave2 {
private static Arena arena;

static int[] KEY_EXIT = {3};
static int[] KEY_ENTER = {13};
static int[] KEY_LEFT = {27, 91, 68};
static int[] KEY_RIGHT = {27, 91, 67};
static int[] KEY_UP = {27, 91, 65};
static int[] KEY_DOWN = {27, 91, 66};

static int[] keyLog = new int[3];

static Player player;

public static void main(String[] args) throws Exception {

Scanner s = new Scanner(System.in);

//Get arena dimensions
System.out.println("Insert arena width\r");
int width = s.nextInt();
System.out.println("Insert arena height\r");
int height = s.nextInt();

//Show controls
System.out.println(" ------------------------------- ");
System.out.println("| Controls: |");
System.out.println("| ctrl+C: Exit |");
System.out.println("| Left/Right: Move left/right |");
System.out.println("| Up: Jump |");
System.out.println("| Down: Descend |");
System.out.println("| Enter: Shoot |");
System.out.println(" ------------------------------- ");
s.nextLine();
s.nextLine();
System.out.println("Generating world...");

//Unix specific hackc to set the terminal to raw mode
Util.exec("stty raw </dev/tty");

//Initiate arena and generate the world
arena = new Arena(width, height);
arena.generateWorld();

//Create our player
player = new Player(width / 2, height - 5, arena);
arena.addEntity(player);

//Game loop
arena.update();
arena.draw();
Reader r = new InputStreamReader(System.in);
while (true) {
logKey(r.read());

if (wasKeyPressed(KEY_EXIT)) {
Util.exit();
} else if (wasKeyPressed(KEY_LEFT)) {
player.moveLeft();
} else if (wasKeyPressed(KEY_RIGHT)) {
player.moveRight();
} else if (wasKeyPressed(KEY_UP)) {
player.jump();
} else if (wasKeyPressed(KEY_ENTER)) {
player.shoot();
} else if (wasKeyPressed(KEY_DOWN)) {
player.moveDown();
} else {
//Don't do anything if an unbound key was pressed;
//just redraw the a rena to get rid of garbage characters
arena.draw();
continue;
}

arena.update();
arena.draw();
}
}

private static void logKey(int c) {
for (int i = 0; i < keyLog.length - 1; ++i) {
keyLog[i] = keyLog[i + 1];
}
keyLog[keyLog.length - 1] = c;
}

private static boolean wasKeyPressed(int[] key) {
int offset = (keyLog.length - key.length);
for (int i = offset; i < keyLog.length; ++i) {
if (key[i - offset] != keyLog[i])
return false;
}
return true;
}
}

BIN
inf1000/hw2/Player.class View File


+ 2
- 0
inf1000/hw2/README.txt View File

@@ -0,0 +1,2 @@
* Jeg syntes oppgavene var enkle.
* Jeg brukte rundt 10-15 timer, men det aller meste av den tiden gikk med til MinOppgave2.

BIN
inf1000/hw2/Util.class View File


BIN
inf1000/hw2/Vec2.class View File


+ 7
- 0
inf1000/hw3/3.3.md View File

@@ -0,0 +1,7 @@
| Index | Verdi |
|:-----:|:-----:|
| 0 | 1 |
| 1 | 2 |
| 2 | 3 |
| 3 | 4 |
| 4 | 5 |

BIN
inf1000/hw3/3.3.pdf View File


BIN
inf1000/hw3/FirstArray.class View File


+ 69
- 0
inf1000/hw3/FirstArray.java View File

@@ -0,0 +1,69 @@
import java.util.Scanner;

class FirstArray {
public static void main(String[] args) {

/*
* A
*/

int[] nums = new int[4];
nums[0] = 0;
nums[1] = 1;
nums[2] = 2;
nums[3] = 3;

/*
* B
*/

for (int i = 0; i < nums.length; ++i) {
nums[i] = i;
}

/*
* C
*/

nums[0] = 1337;
nums[3] = 1337;

/*
* D
*/

String[] inputs = new String[5];
Scanner s = new Scanner(System.in);

System.out.println("Enter 5 strings.");
for (int i = 0; i < inputs.length; ++i) {
inputs[i] = s.nextLine();
}

System.out.println("");

/*
* E
*/

int i;

//Output the numbers in nums
//For loops would've been appropriate here, but y'know, while loops
System.out.println("Numbers:");
i = 0;
while (i < nums.length) {
System.out.println(nums[i]);
i += 1;
}
System.out.println("");

//Output the strings in inputs
System.out.println("Input strings:");
i = 0;
while (i < inputs.length) {
System.out.println(inputs[i]);
i += 1;
}
}
}

BIN
inf1000/hw3/MinOppgave3.class View File


+ 60
- 0
inf1000/hw3/MinOppgave3.java View File

@@ -0,0 +1,60 @@
//Oppgavetekst: implementer en sorteringsalgoritme

import java.util.ArrayList;
import java.util.Scanner;

class MinOppgave3 {
private static void swap(int[] arr, int i1, int i2) {
int tmp = arr[i1];
arr[i1] = arr[i2];
arr[i2] = tmp;
}

//Insertion sort
private static void sort(int[] arr) {

//Iterate through the array, skipping the first value
for (int i = 1; i < arr.length; ++i) {

//Iterate backwards, from the current index,
//until we reach sorted values
int j = i;
while (j > 0 && arr[j-1] > arr[j]) {

//Since the while loop hasn't exited,
//we know arr[j] and arr[j-1] is in the wrong order,
//so we swap them
swap(arr, j, j-1);

j -= 1;
}
}
}

public static void main(String[] args) {
if (args.length == 0) {
System.out.println("Usage: MinOppgave3 <ints>");
System.exit(1);
}

int[] ints = new int[args.length];

//Build array of ints
for (int i = 0; i < args.length; ++i) {
ints[i] = Integer.parseInt(args[i]);
}

//Sort the array; arrays are passed by pointer, so sort()
//modifies the array itself
sort(ints);

//Print the elements in the sorted array
for (int i = 0; i < ints.length; ++i) {
System.out.print(ints[i]);
if (i != ints.length - 1) {
System.out.print(", ");
}
}
System.out.println("");
}
}

BIN
inf1000/hw3/NegativeTall.class View File


+ 46
- 0
inf1000/hw3/NegativeTall.java View File

@@ -0,0 +1,46 @@
class NegativeTall {
public static void main(String[] args) {
int[] ints = {1, 4, 5, -2, -4, 6, 10, 3, -2};
int i;

/*
* A
*/

//Count the number of negative ints
i = 0;
int numNegative = 0;
while (i < ints.length) {
if (ints[i] < 0)
numNegative += 1;

i += 1;
}
System.out.println("Number of negative ints: "+numNegative);

/*
* B
*/

//Replace negative ints with their index
i = 0;
while (i < ints.length) {
if (ints[i] < 0)
ints[i] = i;

i += 1;
}

/*
* C
*/

//Output the ints in the array
System.out.println("Elements in the array:");
i = 0;
while (i < ints.length) {
System.out.println(ints[i]);
i += 1;
}
}
}

+ 2
- 0
inf1000/hw3/README.txt View File

@@ -0,0 +1,2 @@
* Jeg syntes innleveringen var enkel.
* Jeg brukte ca. en time paa innleveringen.

BIN
inf1000/hw3/SumTall.class View File


+ 21
- 0
inf1000/hw3/SumTall.java View File

@@ -0,0 +1,21 @@
import java.util.Scanner;

class SumTall {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int sum = 0;

while (true) {
int num = s.nextInt();

//Exit the loop if the user inputs 0
if (num == 0)
break;

sum += num;
}

//After the user input 0, show them the sum of all their inputs
System.out.println("Sum: "+sum);
}
}

+ 20
- 0
inf1000/hw4/Innlesing.java View File

@@ -0,0 +1,20 @@
import java.util.Scanner;
import java.io.*;

class Innlesing {
public static void main(String[] args) throws FileNotFoundException {
Scanner file = new Scanner(new File("winnie.txt"));
Scanner s = new Scanner(System.in);

System.out.println("What word?");
String word = s.nextLine();

int occurrences = 0;
while (file.hasNextLine()) {
if (file.nextLine().equals(word))
occurrences += 1;
}

System.out.println("'"+word+"' was found "+occurrences+" times.");
}
}

+ 43
- 0
inf1000/hw4/Kalkulator.java View File

@@ -0,0 +1,43 @@
class Kalkulator {
static int add(int a, int b) {
return a + b;
}

static int sub(int a, int b) {
return a - b;
}

static int intDiv(int a, int b) {
return a / b;
}

static double doubleDiv(double a, double b) {
return a / b;
}

//Method overloading
static int div(int a, int b) {
return a / b;
}
static double div(double a, double b) {
return a / b;
}

public static void main(String[] args) {
int addRes = add(3, 4);
System.out.println("3+4="+addRes);

int subRes = sub(5, 2);
System.out.println("5-2="+subRes);

int intDivRes = intDiv(10, 3);
System.out.println("10/3="+intDivRes);

double doubleDivRes = doubleDiv(10, 3);
System.out.println("10/3="+doubleDivRes);

//Method overloading for the win!
int divRes1 = div(10, 3);
double divRes2 = div(11.6, 9.993);
}
}

BIN
inf1000/hw4/MinOppgave4.class View File


+ 228
- 0
inf1000/hw4/MinOppgave4.java View File

@@ -0,0 +1,228 @@
//Oppgavetekst: Lag en webserver med foelgende funksjoner:
// * Server filer
// * List opp mapper og filer i en mappe - saakalt directory index
// * Sender en 404-side naar noen spoer om en fil som ikke finnes
// * Kjoer Python-scripts, filer som ender i .py, og send resultatet til nettlesere

import java.util.Scanner;
import java.util.HashMap;
import java.io.*;
import java.nio.file.Paths;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpServer;
import com.sun.net.httpserver.HttpHandler;
import java.net.InetSocketAddress;
import java.net.URLDecoder;

class Templates {
public static String sysInfo =
"<hr>"+
"<p>"+
"Web Server running on "+
System.getProperty("os.name")+" "+
System.getProperty("os.version")+" "+
System.getProperty("os.arch")+
"</p>";

public static String err404 =
"<!DOCTYPE html>"+
"<html>"+
"<head>"+
"<title>Error 404</title>"+
"</head>"+
"<body>"+
"<h1>404 Not Found</h1>"+
"<p>The file {{$1}} was not found.</p>"+
sysInfo+
"</body>"+
"</html>";

public static String index =
"<!DOCTYPE html>"+
"<html>"+
"<head>"+
"<title>Index</title>"+
"</head>"+
"<body>"+
"<ul>"+
"<li><a href='..'>..</a></li>"+
"{{$1}}"+
"</ul>"+
sysInfo+
"</body>"+
"</html>";

public static String indexEntry =
"<li>"+
"<a href='{{$1}}'>{{$1}}</a>"+
"</li>";

//Convenience function; many templates have only one argument,
//pointless to have to build up a String[] just for that
public static String templatify(String str, String arg) {
String[] args = {arg};
return templatify(str, args);
}

//Build a template, replacing things within {{ and }} with
//the arguments provided
public static String templatify(String str, String[] args) {
for (int i = 0; i < args.length; ++i) {
str = str.replace("{{$"+(i+1)+"}}", args[i]);
}

return str;
}
}

class RequestHandler implements HttpHandler {
private File root;

@Override public void handle(HttpExchange t) throws IOException {
OutputStream out = t.getResponseBody();
String url = t.getRequestURI().toString().split("\\?")[0];
int lmul = 1;

//HEAD requests want to only receive headers, but that's
//somewhat hard to implement with this structure.
//We'll just kill the connection if that happens.
if (t.getRequestMethod().equalsIgnoreCase("HEAD")) {
out.close();
return;
}

File f = new File(root, url);

if (!f.exists()) {
send404(f, url, out, t);
} else if (f.isDirectory())
sendIndex(f, url, out, t);
else {
if (url.endsWith(".py"))
sendPython(f, url, out, t);
else
sendFile(f, url, out, t);
}

out.close();
}

RequestHandler(File r) {
root = r;
}

//404 when a file which doesn't exist is requested
private static void send404(File f, String url, OutputStream out, HttpExchange t) throws IOException {
byte[] res = Templates.templatify(Templates.err404, url).getBytes();
t.sendResponseHeaders(404, res.length);
out.write(res);
}

//Directory index when a directory is requested
private static void sendIndex(File dir, String url, OutputStream out, HttpExchange t) throws IOException {
File[] files = dir.listFiles();
String entries = "";

//Loop through files in the requested directory,
//building up the list of entries
for (int i = 0; i < files.length; ++i) {
File f = files[i];
String name = f.toPath().getFileName().toString();
if (f.isDirectory())
name += "/";
entries += Templates.templatify(Templates.indexEntry, name);
}

//Combine the entries with the rest of the index' HTML,
//and send to the client
byte[] res = Templates.templatify(Templates.index, entries).getBytes();
t.sendResponseHeaders(200, res.length);
out.write(res);
}

//Send file when a file is requested
private static void sendFile(File f, String url, OutputStream out, HttpExchange t) throws IOException {
Scanner s = new Scanner(f);
t.sendResponseHeaders(200, f.length());

while (s.hasNextLine()) {
out.write((s.nextLine()+"\n").getBytes());
}
}

//Execute python script and send the output to the browser
private static void sendPython(File f, String url, OutputStream out, HttpExchange t) throws IOException {
String[] command = {"python", f.toPath().toString()};
Process proc = Runtime.getRuntime().exec(command);

BufferedReader stdin = new BufferedReader(new InputStreamReader(proc.getInputStream()));
BufferedReader stderr = new BufferedReader(new InputStreamReader(proc.getErrorStream()));

String res = "";
String s = null;

//Print the output from the python script
while ((s = stdin.readLine()) != null) {
res += s+"\n";
}

//Print the errors from the python script
while ((s = stderr.readLine()) != null) {
res += s+"\n";
}

t.getResponseHeaders().add("Content-Type", "text/plain");
t.sendResponseHeaders(200, res.length());
out.write(res.getBytes());
}
}

class MinOppgave4 {
private static HttpServer server;
private static File root = new File("www");
private static int port = 8000;

//Simple command line interface
public static String onCommand(String str) {
String[] tokens = str.split("\\s+");

switch (tokens[0]) {
case "help":
return
"help: Display this help text\n"+
"stop: Stop the web server";

case "stop":
System.exit(0);
return "";

default:
return
"Unknown command: "+tokens[0]+"\n"+
"Type 'help' for help.";
}
}

public static void main(String[] args) throws IOException {
Scanner s = new Scanner(System.in);

//Create an HTTP server
server = HttpServer.create(new InetSocketAddress(port), 0);

//Add request handler
server.createContext("/", new RequestHandler(root));

//Start the server
server.start();
System.out.println("Server started. Visit http://localhost:"+port+" in a web browser.");
System.out.println("Try modifying the contents of the directory "+root.toPath().getFileName()+".");

//Simple command line interface
System.out.print("> ");
while (s.hasNextLine()) {
System.out.println(onCommand(s.nextLine()));
System.out.print("> ");
}
}
}

+ 4
- 0
inf1000/hw4/README.txt View File

@@ -0,0 +1,4 @@
* Jeg syntes innleveringen var lett.
* Jeg brukte et par timer, stort sett paa MinOppgave4.java.

* Oppgaven var levert som en .zip-fil fordi det ville vaert upraktisk aa laste opp `www`-mappa uten det.

BIN
inf1000/hw4/RequestHandler.class View File


+ 26
- 0
inf1000/hw4/Temperatur.java View File

@@ -0,0 +1,26 @@
import java.util.Scanner;
import java.util.ArrayList;
import java.io.*;

class Temperatur {
private static double avg(ArrayList<Integer> nums) {
double sum = 0;
for (int n: nums) {
sum += n;
}
return sum / nums.size();
}

public static void main(String[] args) throws FileNotFoundException {
Scanner s = new Scanner(new File("temperatur.txt"));
ArrayList<Integer> temps = new ArrayList<Integer>();

while (s.hasNextLine()) {
String num = s.nextLine()+" ";
System.out.println("'"+num+"'");
temps.add(Integer.parseInt(num));
}

System.out.println("Average temperature: "+avg(temps));
}
}

BIN
inf1000/hw4/Templates.class View File


+ 76
- 0
inf1000/hw4/Valg.java View File

@@ -0,0 +1,76 @@
import java.util.Scanner;
import java.util.HashMap;
import java.io.*;

class Party {
private static int totalVotes = 0;
private int nVotes = 0;

public String name;

Party(String n) {
name = n;
}

public void addVote() {
nVotes += 1;
totalVotes += 1;
}

public int getVotes() {
return nVotes;
}

public int getPercentage() {
double percent = ((double)nVotes / (double)totalVotes) * 100;
return (int)Math.round(percent);
}
}

class Valg {
public static void main(String[] args) throws IOException {
Scanner file = new Scanner(new File("stemmer.txt"));
String[] lines = new String[456];
int i;

HashMap<String, Party> parties = new HashMap<String, Party>();
int totalVotes = 0;

//Build array of line
i = 0;
while (file.hasNextLine()) {
String line = file.nextLine();
lines[i] = line;
i += 1;
}

//Go through the array, adding votes to parties
for (i = 0; i < lines.length; ++i) {
String line = lines[i];

//Create the party if it doesn't exist yet
if (!parties.containsKey(line))
parties.put(line, new Party(line));

//Add a vote to the party
parties.get(line).addVote();
}

//Loop through the parties, printing their results and get the winner
Party winner = null;
for (Party p: parties.values()) {
if (winner == null)
winner = p;

if (p.getVotes() > winner.getVotes())
winner = p;

System.out.println(
p.name+" got "+p.getVotes()+" votes, or "+
p.getPercentage()+" percent of all the votes."
);
}

System.out.println(winner.name+" got the most votes.");
}
}

+ 456
- 0
inf1000/hw4/stemmer.txt View File

@@ -0,0 +1,456 @@
Sp
Ap
Ap
Sp
Ap
Ap
Ap
Ap
Ap
H
Ap
Ap
Ap
Ap
Sp
Ap
Ap
Sp
Sp
KrF
Ap
Sp
Ap
Ap
Ap
Sp
Ap
H
Sp
Ap
Ap
Ap
Ap
H
Ap
Ap
H
KrF
Ap
Ap
Ap
Ap
Ap
Sp
Ap
Ap
Sp
Sp
Sp
Ap
Ap
Ap
Ap
Ap
Ap
H
Ap
Ap
Sp
Ap
Ap
H
Ap
Ap
Ap
Sp
Ap
Ap
H
Sp
Ap
Ap
Ap
Ap
KrF
Ap
Sp
H
Ap
Ap
Ap
Sp
H
Sp
Ap
Ap
Sp
Ap
Sp
Ap
Ap
H
Ap
Sp
Ap
Ap
Ap
Ap
Ap
Sp
Ap
Ap
H
Ap
Ap
Ap
Ap
Ap
Ap
Ap
KrF
Ap
Ap
KrF
Sp
Ap
H
Ap
Ap
Ap
Ap
KrF
KrF
Ap
Ap
Sp
Ap
Sp
Ap
H
Ap
Ap
H
Ap
Sp
Ap
H
Sp
Sp
Sp
H
H
Ap
Ap
Ap
H
H
Ap
Ap
Ap
Ap
Sp
Ap
Ap
Ap
Ap
Ap
KrF
Sp
Ap
Sp
Ap
H
Ap
Ap
Sp
KrF
H
Ap
Sp
H
Ap
KrF
Ap
Sp
Ap
Sp
Sp
Ap
Ap
Ap
Ap
Ap
KrF
Ap
Ap
Sp
Sp
Sp
Ap
Ap
Sp
Ap
H
H
Sp
Ap
Sp
Ap
Ap
Ap
KrF
Ap
Ap
KrF
Ap
Ap
H
Ap
KrF
Ap
Ap
Ap
Ap
Ap
Ap
Ap
Ap
Ap
Sp
Sp
KrF
KrF
H
H
Sp
Ap
Ap
Ap
Ap
Ap
H
H
Sp
KrF
H
H
H
KrF
Sp
Sp
H
Sp
H
H
Sp
H
Sp
Sp
H
H
H
H
Sp
Sp
H
Sp
H
H
Sp
KrF
Sp
Sp
H
H
H
KrF
Sp
KrF
H
Sp
Sp
H
H
H
Sp
Sp
Sp
Sp
Sp
H
Sp
KrF
H
H
Sp
H
H
H
Sp
Sp
H
KrF
Sp
Sp
H
Sp
H
H
Sp
H
H
H
H
Sp
Sp
Sp
H
H
H
KrF
H
Sp
H
Sp
H
H
Sp
H
H
KrF
Sp
Sp
H
H
Sp
Sp
KrF
Sp
Sp
H
Sp
Sp
KrF
Sp
Sp
Sp
H
H
Sp
H
H
H
KrF
H
H
H
Sp
Sp
Sp
H
Sp
KrF
Sp
Ap
Ap
Ap
Ap
Ap
Sp
Ap
Sp
Ap
Ap
H
H
Sp
KrF
H
Sp
KrF
Sp
Sp
Sp
H
H
Sp
H
H
H
Sp
Sp
H
Ap
Ap
Ap
Ap
Ap
Sp
H
Sp
H
Sp
H
KrF
H
H
Sp
Sp
Sp
Sp
Sp
Sp
KrF
H
H
H
Sp
H
KrF
KrF
H
Sp
Sp
Sp
Sp
H
H
H
Sp
H
Sp
H
H
Sp
H
H
H
Sp
Sp
Sp
H
H
H
Sp
H
Sp
H
Sp
Sp
Sp
Sp
Sp
H
H
KrF
H
H
H
Ap
Ap
Ap
Ap
H
H
H

+ 12
- 0
inf1000/hw4/temperatur.txt View File

@@ -0,0 +1,12 @@
0
2
2
8
12
16
21
16
12
8
4
2

+ 485
- 0
inf1000/hw4/winnie.txt View File

@@ -0,0 +1,485 @@
WINNIE-THE-POOH
CHAPTERI
In
Which
We
Are
Introduced
to
Winnie-the-Pooh
and
Some
Bees,
and
the
Stories
Begin
HERE
IS
EdwardBear,
coming
downstairs
now,
bump,
bump,
bump,
on
the
back
of
his
head,
behind
Christopher
Robin.
It
is,
as
far
as
he
knows,
the
only
way
of
coming
downstairs,
but
sometimes
he
feels
that
there
really
is
another
way,
if
only
he
could
stop
bumping
for
a
moment
and
think
of
it.
And
then
he
feels
that
perhaps
there
isn't.
Anyhow,
herehe
is
at
the
bottom,
and
ready
to
be
introduced
to
you.
Winnie-the-Pooh.
When
I
first
heard
his
name,
I
said,
just
as
you
are
going
to
say,
"But
I
thought
he
was
a
boy?"
"So
did
I,"
said
Christopher
Robin.
'Then
you
can't
call
him
Winnie."
"I
don't."
"But
you
said"
"He's
Winnie-ther-Pooh.
Don't
you
know
what
'ther'
means?"
"Ah,
yes,
now
I
do,"
I
said
quickly;
and
I
hope
you
do
too,
because
it
is
all
the
explanation
you
are
going
to
get.

Sometimes
Winnie-the-Pooh
likes
a
game
of
some
sort
when
he
comes
downstairs,
and
sometimes
he
likes
to
sit
quietly
in
front
of
the
fire
and
listen
to
a
story.
This
evening
"What
about
a
story?"
said
Christopher
Robin.
''What
about
a
story?"
I
said.
"Could
you
very
sweetly
tellWinnie-the-Pooh
one?"
"I
suppose
I
could,"
I
said.
"What
sort
of
stories
does
he
like?"
"About
himself.
Because
he's
that
sort
of
Bear."
"Oh,
I
see."
"So
could
you
very
sweetly?"
"I'll
try,"
I
said.
So
I
tried.
Once
upon
a
time,
a
very
long
time
ago
now,
about
last
Friday,
Winnie-the-Pooh
lived
in
a
forest
all
by
himself
under
the
name
of
Sanders.
("What
does
'underthename'
mean?"
asked
Christopher
Robin.
"It
means
he
had
the
name
over
the
door
in
gold
letters,
and
lived
under
it."
"Winnie-the-Pooh
wasn't
quite
sure,"
said
Christopher
Robin.
"Now
I
am,"
said
a
growly
voice.
"Then
I
will
go
on,"
said
I.)
One
day
when
he
was
out
walking,
he
came
to
an
open
place
in
the
middle
of
the
forest,
and
in
the
middle
of
this
place
was
a
large
oak-tree,
and,
from
the
top
of
the
tree,
there
came
a
loud
buzzing-
noise.
Winnie-the-Pooh
sat
down
at
the
foot
of
the
tree,
put
his
head
between
his
paws
and
began
to
think.
First
of
all
he
said
to
himself:
"That
buzzing-noise
means
something.
You
don't
get
a
buzzing-noise
like
that,
just
buzzing
and
buzzing,
without
its
meaning
something.
If
there's
a
buzzing-noise,
somebody's
making
a
buzzing-noise,
and
the
only
reason
for
making
a
buzzing-noise
that
I
know
of
is
because
you're
a
bee."
Then
he
thought
another
long
time,
and
said:
"And
the
only
reason
for
being
a
bee
that
I
know
of
is
making
honey."
And
then
he
got
up,
and
said:
"And
the
only
reason
for
making
honey
is
so
as
I
can
eat
it."
So
he
began
to
climb
the
tree.

+ 1
- 0
inf1000/hw4/www/foo/a View File

@@ -0,0 +1 @@
This is a file.

+ 1
- 0
inf1000/hw4/www/foo/b View File

@@ -0,0 +1 @@
This is another file.

+ 1
- 0
inf1000/hw4/www/foo/c View File

@@ -0,0 +1 @@
Yet another file here.

+ 1
- 0
inf1000/hw4/www/foo/somedir/somefile View File

@@ -0,0 +1 @@
This is a file.

+ 6
- 0
inf1000/hw4/www/pythonScript.py View File

@@ -0,0 +1,6 @@
from time import gmtime, strftime

time = strftime("%Y-%m-%d %H:%M:%S", gmtime())

print("Hello from Python!")
print("Current time: "+time)

+ 6
- 0
inf1000/hw4/www/somefile.html View File

@@ -0,0 +1,6 @@
<!DOCTYPE html>
<html>
<body>
Morning.
</body>
</html>

BIN
inf1000/hw5/Bil.class View File


+ 36
- 0
inf1000/hw5/Bil.java View File

@@ -0,0 +1,36 @@
class Bil {
private int kilometerstand;
private int bensin;
private final int tankStorrelse;
private final int kmPerLiter;

public void kjorTur(int km) throws Exception {
if (km > hentMaksDistanse()) {
throw new Exception("Du har ikke nok bensin..");
} else {
kilometerstand += km;
bensin -= km / kmPerLiter;
}
}

public void refuel(double liter) throws Exception {
if (bensin + liter > tankStorrelse)
throw new Exception("Tanken din har ikke plass til saa mye benin.");
else
bensin += liter;
}

public double hentMaksDistanse() {
return (double)bensin * (double)kmPerLiter;
}

public int hentKilometerstand() {
return kilometerstand;
}

Bil(int tankStorrelse, int kmPerLiter) {
this.tankStorrelse = tankStorrelse;
this.kmPerLiter = kmPerLiter;
this.bensin = tankStorrelse;
}
}

BIN
inf1000/hw5/Coin.class View File


BIN
inf1000/hw5/Enemy.class View File


BIN
inf1000/hw5/EnemyFlyer.class View File


BIN
inf1000/hw5/EnemyJumper.class View File


BIN
inf1000/hw5/EnemyWalker.class View File


BIN
inf1000/hw5/Entity.class View File


BIN
inf1000/hw5/Game$State.class View File


BIN
inf1000/hw5/Game.class View File


BIN
inf1000/hw5/GraphicsUtils.class View File


BIN
inf1000/hw5/Isbod.class View File


+ 28
- 0
inf1000/hw5/Isbod.java View File

@@ -0,0 +1,28 @@
class Isbod {
private String[] ansatte;
private int antallAnsatte;

public void ansett(String navn) throws Exception {
if (antallAnsatte + 1 > ansatte.length)
throw new Exception("Du kan ikke ansette saa mange folk.");
else
ansatte[antallAnsatte++] = navn;
}

public void giSistemannSparken() throws Exception {
if (antallAnsatte - 1 <= 0)
throw new Exception("Det er ikke flere ansatte igjen.");
else
ansatte[--antallAnsatte] = null;
}

public void printAlleAnsatte() {
for (int i = 0; i < antallAnsatte; ++i) {
System.out.println(ansatte[i]);
}
}

Isbod() {
ansatte = new String[10];
}
}

BIN
inf1000/hw5/Key.class View File


BIN
inf1000/hw5/MinOppgave5.class View File


+ 907
- 0
inf1000/hw5/MinOppgave5.java View File

@@ -0,0 +1,907 @@
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.Clip;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import java.awt.event.WindowEvent;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.BasicStroke;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.HashMap;
import java.util.Date;
import java.io.File;
import java.io.FileNotFoundException;
import java.lang.Thread;

class Key {
static int LEFT = 65;
static int RIGHT = 68;
static int JUMP = 32;
static int RESTART = 82;
}

class GraphicsUtils {
public static void boxShadow(Graphics2D gfx, int x, int y, int width, int height) {
Color c = new Color(0, 0, 0, 20);
for (int i = 40; i >0; i -= 1) {
gfx.setColor(c);
gfx.fillRect(
x - i,
y - i,
width + (i * 2),
height + (i * 2)
);
}
}

public static void drawDoneMessage(Graphics2D gfx, Game.State state, JFrame window) {
Color textColor = null;
String str = "";
if (state == Game.State.WON) {
textColor = Color.GREEN;
str = "Congratulations! You won!";
} else if (state == Game.State.LOST) {
textColor = Color.RED;
str = "You lost!";
}

gfx.setFont(new Font("Serif", Font.PLAIN, 32));

FontMetrics metrics = gfx.getFontMetrics();
Rectangle2D bounds = metrics.getStringBounds(str, gfx);

GraphicsUtils.boxShadow(
gfx,
(window.getWidth() / 2) - ((int)bounds.getWidth() / 2) - 5,
window.getHeight() / 2 - (int)bounds.getHeight() - 40,
(int)bounds.getWidth() + 10,
(int)bounds.getHeight() + 10
);
gfx.setColor(textColor);
gfx.drawString(
str,
(window.getWidth() / 2) - ((int)bounds.getWidth() / 2),
(window.getHeight() / 2) - 40
);

gfx.setFont(new Font("Serif", Font.PLAIN, 20));
gfx.setColor(Color.BLACK);
gfx.drawString(
"Press R to play again.",
(window.getWidth() / 2) - ((int)bounds.getWidth() / 2),
(window.getHeight() / 2) + 60
);

if (Coin.totalCoins != 0) {
gfx.drawString(
"you got "+(Coin.totalCoins - Coin.curCoins)+"/"+(Coin.totalCoins)+" coins.",
(window.getWidth() / 2) - ((int)bounds.getWidth() / 2),
(window.getHeight() / 2) + 90
);
}
}
}

enum Side {
LEFT,
RIGHT,
TOP,
BOTTOM
}

class Vec2 {
public double x;
public double y;

Vec2(double x, double y) {
this.x = x;
this.y = y;
}

public Vec2 clone() {
return new Vec2(x, y);
}

public Vec2 scale(double n) {
x *= n;
y *= n;
return this;
}

public Vec2 set(Vec2 vec) {
return set(vec.x, vec.y);
}
public Vec2 set(double ax, double ay) {
x = ax;
y = ay;
return this;
}

public Vec2 add(Vec2 vec) {
return add(vec.x, vec.y);
}
public Vec2 add(double ax, double ay) {
x += ax;
y += ay;
return this;
}

public String identify() {
return "Vec2, x: "+x+", y: "+y;
}
}

class Entity {
protected double mass;
private Vec2 force;
private boolean shouldBounceX;
private boolean shouldBounceY;
private double bounceForceX;
private Vec2 bounceForce;
public Vec2 vel;
public Vec2 pos;
public int width;
public int height;
public int lastDTime = 0;
public boolean dead = false;;
public Game game;

Entity(int x, int y, int w, int h) {
pos = new Vec2(x, y);

width = w;
height = h;
mass = width * height;

bounceForce = new Vec2(0, 0);
vel = new Vec2(0, 0);
force = new Vec2(0, 0);
}

public void bounceX(double n) {
bounceX();
bounceForce.x += n;
}
public void bounceX() {
shouldBounceX = true;
}

public void bounceY(double n) {
bounceY();
bounceForce.y += n;
}
public void bounceY() {
shouldBounceY = true;
}

public Vec2 getCenter() {
return new Vec2(pos.x + (width * 0.5), pos.y + (height * 0.5));
}

//Apply force; move for an arbitrary number of frames (e.g movement)
public void force(Vec2 vec) {
force.add(vec);
}

//Apply impulse; set velocity for one frame (e.g jumping)
public void impulse(Vec2 vec) {
vel.add(vec);
}

//Move, accounting for variable frame rate
public void move(int deltaTime) {
if (shouldBounceX)
vel.x = -vel.x + bounceForce.x;
if (shouldBounceY)
vel.y = -vel.y + bounceForce.y;

shouldBounceX = false;
shouldBounceY = false;
bounceForce.set(0, 0);

lastDTime = deltaTime;
vel.add(force.scale(1/mass).scale(deltaTime));
pos.add(vel.clone().scale(deltaTime));
force.set(0, 0);
}

public boolean shouldUpdate() {
return !(
-game.camera.x > pos.x + width ||
(-game.camera.x + game.window.getWidth()) + 100 < pos.x
);
}

public void init() {};

public void update() {};

public void draw(Graphics2D gfx) {};

public void die() {
dead = true;
}

public Side intersects(Entity e) {
if (!(
pos.x < e.pos.x + e.width && pos.x + width > e.pos.x &&
pos.y < e.pos.y + e.height && pos.y + height > e.pos.y
)) {
return null;
}

if (pos.y + (height / 2) <= e.pos.y + (vel.y + e.vel.y) * lastDTime) {
return Side.TOP;
} else if (pos.y >= e.pos.y + e.height - (-vel.y + e.vel.y) * lastDTime) {
return Side.BOTTOM;
} else if (pos.x + width < e.pos.x + (e.width / 2)) {
return Side.LEFT;
} else {
return Side.RIGHT;
}
}

public String identify() {
return this.getClass().getName()+" at "+pos.x+", "+pos.y;
}
}

class Victory extends Entity {
Victory(int x, int y) {
super(x, y, 30, 30);
}

@Override public void update() {
if (intersects(game.player) != null)
game.win();
}

@Override public void draw(Graphics2D gfx) {
gfx.setColor(new Color(20, 20, 255));
gfx.fillRect(0, 0, width, height);
gfx.setColor(new Color(10, 10, 155));
gfx.drawRect(0, 0, width, height);
}
}

class Coin extends Entity {
public static int totalCoins = 0;
public static int curCoins = 0;

Coin(int x, int y) {
super(x, y, 10, 10);
totalCoins += 1;
curCoins += 1;
}

//We always want to update coins, as we always want to show
//how many coins are left in the upper left
@Override public boolean shouldUpdate() {
return true;
}

@Override public void update() {
if (intersects(game.player) != null) {
curCoins -= 1;
die();
if (totalCoins <= 0)
game.win();
}
}

@Override public void draw(Graphics2D gfx) {
gfx.setColor(new Color(255, 255, 20));
gfx.fillOval(0, 0, width, height);
gfx.setColor(new Color(155, 155, 10));
gfx.setStroke(new BasicStroke(3));
gfx.drawOval(0, 0, width, height);

game.displayText(this, "Coins left: "+curCoins);
}

public static void reset() {
totalCoins = 0;
curCoins = 0;
}
}

class Platform extends Entity {
Platform(int x, int y, int w, int h) {
super(x, y, w, h);
}

@Override public void draw(Graphics2D gfx) {
gfx.drawRect(0, 0, width, height);
}
}

class Player extends Entity {
private final double moveForce = 0.4;
private final double gravityForce = 0.6;
private final double jumpForce = 0.6;
private final double airResistance = 0.5;
private final double friction = 2;
private boolean onGround = false;

Player(int x, int y) {
super(x, y, 20, 20);
}

@Override public void init() {
game.camera.x = -pos.x + (game.window.getWidth() / 2);
game.camera.y = -pos.y + (game.window.getHeight() / 2);
}

@Override public void update() {
//Movement
if (game.isKeyPressed(Key.LEFT))
force(new Vec2(-moveForce, 0));
if (game.isKeyPressed(Key.RIGHT))
force(new Vec2(moveForce, 0));

//Collide with platforms
onGround = false;
for (Entity e: game.entities) {
if (e == this)
continue;

Side side = intersects(e);
if (e instanceof Platform && side != null) {
if (side == Side.TOP) {
onGround = true;

if (vel.y > 0)
vel.y = 0;

pos.y = e.pos.y - height;
} else if (side == Side.LEFT) {
bounceX();
pos.x = e.pos.x - width;;
} else if (side == Side.RIGHT) {
bounceX();
pos.x = e.pos.x + e.width;
} else if (side == Side.BOTTOM) {
bounceY();
}
}
}

//Jump
if (onGround && game.isKeyPressed(Key.JUMP))
impulse(new Vec2(0, -jumpForce));

//Gravity
if (!onGround)
force(new Vec2(0, gravityForce));

//"Friction" (kind of) and air resistance
if (onGround)
force(new Vec2(-vel.x * friction, 0));
else
force(new Vec2(-vel.x * airResistance, 0));

//Update camera
Vec2 dist = new Vec2(
-pos.x + (game.window.getWidth() / 2) - game.camera.x,
-pos.y + (game.window.getHeight() / 2) - game.camera.y
);

game.camera.set(dist.scale(0.1).add(game.camera));

//Die if we fall through the ground
if (pos.y > 300)
die();
}

@Override public void draw(Graphics2D gfx) {
gfx.setColor(new Color(20, 255, 20));
gfx.fillRect(0, 0, width, height);
gfx.setColor(new Color(10, 155, 10));
gfx.drawRect(0, 0, width, height);
}

@Override public void die() {
super.die();
game.lose();
}
}

class Enemy extends Entity {
protected final double moveForce = 0.1;
protected final double gravityForce = 0.4;
protected final double jumpForce = 0.3;
protected final double airResistance = 0.5;
protected final double friction = 2;
protected double resurrectTimeout = 0;
protected boolean onGround = false;
protected boolean collidedTop;
protected boolean collidedBottom;
protected boolean collidedLeft;
protected boolean collidedRight;
private int timesJumped = 0;
protected int maxResurrectTimeout = 5000;

Enemy(int x, int y, int w, int h) {
super(x, y, w, h);
}

@Override public void update() {

//Check if we're on ground
onGround = false;
collidedTop = false;
collidedLeft = false;
collidedRight = false;
collidedBottom = false;
for (Entity e: game.entities) {
if (e == this)
continue;

Side side = intersects(e);

//Collide with platforms
if (e instanceof Platform && side != null) {
collidedTop = true;
if (side == Side.TOP) {
collidedTop = true;
onGround = true;

if (vel.y > 0)
vel.y = 0;

pos.y = e.pos.y - height;
} else if (side == Side.LEFT) {
collidedLeft = true;
vel.x = -vel.x;
pos.x = e.pos.x - width;
} else if (side == Side.RIGHT) {
collidedRight = true;
vel.x = -vel.x;
pos.x = e.pos.x + e.width;
} else if (side == Side.BOTTOM) {
collidedBottom = true;
bounceY();
}
}
}

//Die when a player hits the enemy on top,
//kill the player if it's hit on the sides or bottom
Side side = intersects(game.player);
if (side != null) {
if (side == Side.BOTTOM) {
game.player.bounceY(vel.y);
if (maxResurrectTimeout > 0 && timesJumped < 1) {
resurrectTimeout = maxResurrectTimeout / lastDTime;
onGround = false;
timesJumped += 1;
height = height / 2;
}
else {
die();
}
} else {
if (timesJumped == 0) {
game.player.die();
} else {
vel.x = game.player.vel.x * 2;
}
}
}

//Gravity
if (!onGround)
force(new Vec2(0, gravityForce));

//Friction and air resistance
if (onGround)
force(new Vec2(-vel.x * friction, 0));
else
force(new Vec2(-vel.x * airResistance, 0));

if (resurrectTimeout > 0) {
resurrectTimeout -= 1;
if (resurrectTimeout == 0) {
height *= timesJumped + 1;
timesJumped = 0;
}
}
}

@Override public void draw(Graphics2D gfx) {
gfx.setColor(new Color(255, 20, 20));
gfx.fillRect(0, 0, width, height);
gfx.setColor(new Color(155, 10, 10));
gfx.drawRect(0, 0, width, height);
}
}

class EnemyWalker extends Enemy {
private int direction = -1;

EnemyWalker(int x, int y, int dir) {
super(x, y, 30, 30);
direction = dir;
}

@Override public void update() {
super.update();

if (resurrectTimeout > 0)
return;

if (collidedLeft) {
direction = -1;
} else if (collidedRight) {
direction = 1;
}

force(new Vec2(moveForce * direction, 0));
}
}

class EnemyJumper extends Enemy {
EnemyJumper(int x, int y) {
super(x, y, 20, 30);
}

@Override public void update() {
super.update();

if (resurrectTimeout > 0)
return;

if (!collidedRight && game.player.pos.x + game.player.width <= pos.x)
force(new Vec2(-moveForce, 0));
else if (!collidedLeft && game.player.pos.x >= pos.x + width)
force(new Vec2(moveForce, 0));

if (onGround && (collidedRight || collidedLeft))
impulse(new Vec2(0, -jumpForce));

if (collidedLeft || collidedRight)
vel.x = 0;
}
}

class EnemyFlyer extends Enemy {
private final double gravityForce = 0;
private double flyForce = 1;
private int targetY;

EnemyFlyer(int x, int y) {
super(x, y, 30, 15);
targetY = y;
impulse(new Vec2(0, -0.5));
}

@Override public void update() {
super.update();

if (resurrectTimeout > 0)
return;

if (pos.y > targetY) {
force(new Vec2(0, -flyForce));
} else {
force(new Vec2(0, flyForce));
}
}
}

@SuppressWarnings("serial")
class Game extends JPanel implements KeyListener {
private static Clip playAudio(String filename) throws Exception {
File file = new File(filename);
AudioInputStream stream = AudioSystem.getAudioInputStream(file);
AudioFormat format = stream.getFormat();
DataLine.Info info = new DataLine.Info(Clip.class, format);
Clip clip = (Clip)AudioSystem.getLine(info);

clip.open(stream);
clip.start();

return clip;
}

public enum State {
RUNNING,
WON,
LOST
}
private State state;

private ArrayList<Integer> pressedKeys;
private final int targetDTime = 16;
private HashMap<String, String> entityMessages;
private File level;
public ArrayList<Entity> entities;
public Vec2 camera;
public Entity player;
public Clip music;
public boolean gameEnded;
public JFrame window;

Game(JFrame window) {
state = State.RUNNING;
pressedKeys = new ArrayList<Integer>();
entityMessages = new HashMap<String, String>();
entities = new ArrayList<Entity>();
camera = new Vec2(0, 0);
player = null;
music = null;
gameEnded = false;

this.window = window;
window.addKeyListener(this);
window.add(this);
}

public void addEntity(Entity e) {
System.out.println("adding "+e.identify());
e.game = this;
entities.add(e);
e.init();
if (e instanceof Player)
player = e;
}

public void run() throws InterruptedException {
while (true) {
if (state != State.RUNNING) {
Thread.sleep(100);
continue;
}

long startTime = new Date().getTime();

for (int i = 0; i < entities.size(); ++i) {
Entity e = entities.get(i);

if (e.dead) {
entities.remove(i);
continue;
}

if (!e.shouldUpdate())
continue;

e.move(targetDTime);
}

for (int i = 0; i < entities.size(); ++i) {
Entity e = entities.get(i);

if (!e.shouldUpdate())
continue;

e.update();
}

paintComponent((Graphics2D)getGraphics());
window.revalidate();
window.repaint();

int sleepTime = targetDTime - (int)(new Date().getTime() - startTime);
if (sleepTime > 0)
Thread.sleep(sleepTime);

//Reset entity messages
entityMessages = new HashMap<String, String>();
}
}

@Override public void paintComponent(Graphics g) {
Graphics2D gfx = (Graphics2D)g;

resetGfx(gfx);
if (state == State.RUNNING) {
gfx.translate(camera.x, camera.y);
for (int i = 0; i < entities.size(); ++i) {
Entity e = entities.get(i);

if (!e.shouldUpdate())
continue;

gfx.translate(e.pos.x, e.pos.y);
e.draw(gfx);
resetGfx(gfx);
gfx.translate(-e.pos.x, -e.pos.y);
}
gfx.translate(-camera.x, -camera.y);

int i = 0;
for (String s: entityMessages.values()) {
gfx.drawString(s, 10, 20 * (i + 1));
i += 1;
}
} else {
GraphicsUtils.drawDoneMessage(gfx, state, window);
}
}

public void win() {
System.out.println("Congratulations! You win!");
state = State.WON;
window.repaint();
gameEnded = true;
}

public void lose() {
System.out.println("You lost!");
state = State.LOST;
window.repaint();
gameEnded = true;
}

public void displayText(Entity e, String str) {
entityMessages.put(e.getClass().getName(), str);
}

public void loadLevel(File file) throws Exception {
System.out.println("Loading level...");
Coin.reset();
level = file;
Scanner s = new Scanner(file);
int lineNum = 0;

try {
while (s.hasNextLine()) {
lineNum += 1;

String line = s.nextLine();

String[] tokens = line.split("\\s+");
String name = tokens[0];

//If the line starts with #, it's a comment
if (name.equals("#"))
continue;

//Play audio if the line starts with 'audio'
if (name.equals("audio")) {
if (music == null)
music = playAudio(line.replace("audio", "").trim());

continue;
}

//Ignore empty lines
if (name.equals(""))
continue;

int[] args = new int[tokens.length - 1];

for (int i = 0; i < args.length; ++i) {
args[i] = Integer.parseInt(tokens[i + 1]);
}

switch (name) {
case "player":
addEntity(new Player(args[0], args[1]));
break;
case "platform":
addEntity(new Platform(args[0], args[1], args[2], args[3]));
break;
case "enemyWalker":
addEntity(new EnemyWalker(args[0], args[1], args[2]));
break;
case "enemyJumper":
addEntity(new EnemyJumper(args[0], args[1]));
break;
case "enemyFlyer":
addEntity(new EnemyFlyer(args[0], args[1]));
break;
case "victory":
addEntity(new Victory(args[0], args[1]));
break;
case "coin":
addEntity(new Coin(args[0], args[1]));
break;
default:
System.out.println("Unknown entity "+name+" on line "+lineNum);
}
}
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Too few arguments on line "+lineNum);
}

System.out.println("Done.");
}

public void resetGfx(Graphics2D gfx) {
gfx.setStroke(new BasicStroke(1));
gfx.setColor(new Color(0, 0, 0));
gfx.setFont(new Font("Serif", Font.PLAIN, 13));
}

public boolean isKeyPressed(int c) {
return (pressedKeys.indexOf(c) != -1);
}

@Override public void keyPressed(KeyEvent e) {
if (pressedKeys.indexOf(e.getKeyCode()) == -1)
pressedKeys.add(e.getKeyCode());

if (gameEnded && isKeyPressed(Key.RESTART)) {
gameEnded = false;
System.out.println("restarting");
state = State.RUNNING;
entities.clear();
window.repaint();
try {
loadLevel(level);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
@Override public void keyReleased(KeyEvent e) {
int i = pressedKeys.indexOf(e.getKeyCode());

if (i != -1)
pressedKeys.remove(i);
}

@Override public void keyTyped(KeyEvent e) {}
}


class MinOppgave5 {
private static JFrame window;

private static void start(File file) throws Exception {
window = new JFrame("Game");
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setSize(800, 800);
window.setVisible(true);

Game game = new Game(window);
game.loadLevel(file);
game.run();
}

public static void main(String[] args) throws Exception {
Scanner in = new Scanner(System.in);

File level;

if (args.length != 1) {
System.out.println("Usage: MinOppgave5 <level>");
System.out.println("Available levels:");
for (File f: new File(".").listFiles()) {
String name = f.toPath().getFileName().toString();
if (!name.endsWith(".level"))
continue;

System.out.println("* "+name);
}

System.exit(1);
return;
} else {
level = new File(args[0]);
start(level);
}

System.out.println(" ---------------- ");
System.out.println("| Controls: |");
System.out.println("| A: Move Left |");
System.out.println("| D: Move Right |");
System.out.println("| Space: Jump |");
System.out.println(" ---------------- ");
System.out.println("Press Enter to start.");
in.nextLine();
}
}

BIN
inf1000/hw5/Oppgave51.class View File


+ 23
- 0
inf1000/hw5/Oppgave51.java View File

@@ -0,0 +1,23 @@
class Oppgave51 {
public static void main(String[] args) throws Exception {
Bil bil = new Bil(60, 5);

try {
System.out.println("Kjorer 10 km.");
bil.kjorTur(10);

System.out.println("Kjorer 250 km.");
bil.kjorTur(250);

System.out.println("Kjorer 3 km.");
bil.kjorTur(3);

System.out.println("Kjorer 9001 km.");
bil.kjorTur(9001);
} catch (Exception e) {
System.out.println(e.getMessage());
}

System.out.println("Bilen har kjort "+bil.hentKilometerstand()+" km.");
}
}

BIN
inf1000/hw5/Oppgave54.class View File


+ 23
- 0
inf1000/hw5/Oppgave54.java View File

@@ -0,0 +1,23 @@
class Oppgave54 {
public static void main(String[] args) throws Exception {
Isbod bod = new Isbod();

try {
bod.ansett("Alice");
bod.ansett("Bob");
bod.ansett("Carol");
System.out.println("Ansatte:");
bod.printAlleAnsatte();

System.out.println("");
System.out.println("Gir sistemann sparken.");
bod.giSistemannSparken();

System.out.println("");
System.out.println("Ansatte:");
bod.printAlleAnsatte();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}

BIN
inf1000/hw5/Platform.class View File


BIN
inf1000/hw5/Player.class View File


+ 2
- 0
inf1000/hw5/README.txt View File

@@ -0,0 +1,2 @@
* Jeg syntes oppgavene var enkle.
* Jeg brukte en god del timer paa MinOppgave5, og 30-60 minutter paa de andre oppgavene.

BIN
inf1000/hw5/Side.class View File


+ 5
- 0
inf1000/hw5/Teori.txt View File

@@ -0,0 +1,5 @@
A) Innkapsling er å gjøre verdier og metoder usynlige utenfor en klasse eller instans. Dette er veldig nyttig, da det lar oss forsikre oss om at alle som bruker klassen bruker den på den måten vi definerer, så vi kan endre detaljer om hvordan klassen ser ut uten at den ser anderledes ut utenfra, og uten at kode som allerede bruker klassen må endres.

B) Grensesnittet er hvordan en klasse ser ut utenfra, metoder og verdier som det er meningen at folk som bruker klassen skal bruke. Implementasjonen er den faktiske koden inne i metoder, samt innkapslede (private) metoder og verdier, som brukere av klassen ikke skal røre.

C) En statisk metode deles av alle instanser av klassen, og kan brukes selv før noen instanser er laget. En statisk metode kan kun røre statiske verdier, som er verdier som er delt av alle instanser. Instansmetoder er kun tilgjengelige på instanser, ikke på selve klassen, og kan endre på verdier som er spesifikke til en bestemt instans, som `kilometerstand`-verdien i Bil-klassen min.

+ 0
- 0
inf1000/hw5/Vec2.class View File


Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save