DM34-1. Obligatorisk opgave Dilemma spillet. Jacob Aae Mikkelsen 191076 kok04



Relaterede dokumenter
DM01 DM Obl. Afl. Jacob Christiansen, , D12, Elias 18/ Side 1 af 11

Sekvensafstand DM34 - Eksamensopgave. Jacob Aae Mikkelsen

Civilingeniøreksamen januar Skriftelig prøve den 12. januar 2001 Kursusnummer 49104

Kursusgang 11. Oversigt: Sidste kursusgang Værktøjer til udvikling og implementering af HCI-design Oversigt over Java Swing

Forelæsning Uge 13 Torsdag

AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007

Kursus navn: Indledende programmering Kursus nr

Forelæsning Uge 13 Mandag

Løsning af skyline-problemet

Serialization i Java

DANMARKS TEKNISKE UNIVERSITET

Skriftlig eksamen i Datalogi

BRP Kursusintroduktion og Java-oversigt

University of Southern Denmark Syddansk Universitet. DM503 Forelæsning 11

Videregående programmering i Java

import java.awt.event.*; import java.awt.*; Container <- Panel <- Applet Component <- Button <- Checkbox <- ScrollPane <- Label

Kursusgang 12. Oversigt: Sidste kursusgang Layout-manager Event-håndtering. Design af brugerflader 12.1

COMPUTERSPIL 1. Opgave 1

Software Construction 1 semester (SWC) Spørgsmål 1

COMPUTERSPIL 1. Opgave 1. Opgave 2

b) Udvid din implementation af forme til at understøtte.equals. To objekter af samme form er ens hvis de har samme værdier i felterne.

Software Construction 1. semester (SWC) januar 2014 Spørgsmål 1

Abstrakte datatyper C#-version

Forelæsning Uge 5 Mandag

Forelæsning Uge 4 Mandag

Databaseadgang fra Java

Software 1 with Java. Recitation No. 7 (Servlets, Inheritance)

dintprog Manual Revision: 1241 August 24, 2010 I Introduktion 3 1 Notation 3 II Begreber 4 2 Grundbegreber om programmering 4

Ugeseddel 4 1. marts - 8. marts

Løsning af møntproblemet

Grundlæggende Programmering ITU, Efterår Skriftlig eksamen i Grundlæggende Programmering

Forelæsning Uge 6 Mandag

Bilag 1 Rige billeder Ordremodtagelse

Videregående Programmering Obligatorisk opgave - 3. semester, efterår 2004

Videregående programmering i Java

Webserverprogrammering

Forelæsning Uge 5 Mandag

Datalogi OB, Efterår 2002 OH er, forelæsning 10/ Klasser og nedarvning

Hvordan organiseres et programs grafik-elementer? OOP e uge kursusgang. Advarsel! Component-objekter

Specifikation Abstrakt OO OS-API Rev Specifikation. Abstrakt, objektorienteret operativsystem-api

Programmering 2. dprog2 E

Konstruktion af grafiske brugergrænseflader (GUI'er)

Forelæsning Uge 5 Mandag

Dag 10 Flertrådet programmering

MySQL i Java. Tutorial lavet af Jákup W. Hansen TSU semester 05.januar 2007

DATALOGI 0GB. Skriftlig eksamen tirsdag den 6. januar 2004

DM507 Algoritmer og datastrukturer

Skriftlig eksamen i Datalogi

DM507 Algoritmer og datastrukturer

Videregående programmering i Java

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 2

A Profile for Safety Critical Java

PROGRAM. using System; using System.Collections.Generic; using System.Text; using System.Collections;

Programmering 2. dprog2 E

DM507 Algoritmer og datastrukturer

SWC eksamens-spørgsmål. Oversigt

Over Forelæsning omponenter ogrammering sigt 14, 1999 freda containere 15. oktober 1999 Eksempel: out GUI til beregning fakultet.

DM507 Algoritmer og datastrukturer

Forelæsning Uge 3 Torsdag

Forelæsning Uge 3 Mandag

DM507 Algoritmer og datastrukturer

Klienten. import java.util.*;

DM01 DM Obl. Afl. Jacob Christiansen, , D12, Elias 13/ Side 1 af 7

Klasser og objekter. (Afsnit i manualen)

Eksempel: Skat i år 2000

Forelæsning Uge 4 Mandag

Forelæsning Uge 12 Torsdag

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 3

Programmering i C. Lektion december 2008

Hvordan vælger jeg dokumentprofilen?

Forelæsning Uge 4 Torsdag

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 4

Dag 10 Flertrådet programmering

DM01 DM Obl. Afl. Jacob Christiansen, , D12, Elias 18/ Side 1 af 9

IT Support Guide. Installation af netværksprinter (direkte IP print)

Videregående Programmering for Diplom-E Noter

Klasser og nedarvning

//Udskriver System.out.println("Hej " + ditfornavn + " " + ditefternavn + "."); System.out.println("Du er " + dinalder + " aar gammel!

Singleton pattern i C#

Forelæsning Uge 3 Mandag

Forelæsning Uge 4 Mandag

Forelæsning Uge 2 Mandag

Introduktion til ActionScript, fortsat

Vejledning til listings-pakken

I profil-feltet kan imastra-kunder vælge om upload skal ske ligesom filerne var indsendt til mailboksen eller

Program Dokumentation PC Software Skrevet af. Gruppen. Version 1.0

Forelæsning Uge 12 Mandag

DM02 - Obligatorisk opgave E.05 Rejseplanlægning. Jacob Aae Mikkelsen

Vejledende løsninger

dmasark Aflevering - Uge 50

Forelæsning Uge 4 Torsdag

JavaScript. nedarvning.

Installation af Elektronisk APV på flere PC er

DATALOGI 1E. Skriftlig eksamen torsdag den 3. juni 2004

Forelæsning Uge 3 Mandag

DM507 Algoritmer og datastrukturer

Java Klasse nedarvninger

Automatisering Af Hverdagen

Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java

Forelæsning Uge 2 Torsdag

Transkript:

DM34-1. Obligatorisk opgave Dilemma spillet Jacob Aae Mikkelsen 191076 kok04 April 2005

Kapitel 1 Resumé Denne rapport dokumenterer udviklingsforløbet og afprøvningen af et spil Dilemma. Spillet går ud på at opbygge en tillid i byttehandel, hvor der også kan snydes. Der er implementeret forskellige spillere, ved hjælp af nedarving og polymorfi. 1

Indhold 1 Resumé 1 2 Indledning 3 3 Kravspecifikation 4 4 Design 5 4.1 Udviklingsstrategi.......................... 5 4.2 Klasseopbygning........................... 5 5 Kok04 strategien 6 6 Implementation 7 6.1 High score tabel........................... 7 6.2 Sortere tabellen............................ 7 6.3 Fejl afværgning............................ 8 7 Afprøvning 9 7.1 Test.................................. 9 7.2 Mulig udvidelse............................ 10 7.3 Evaluering af kodens kvalitet.................... 10 8 Konklusion 12 A Testkørsels udskrifter 14 A.1 samarbejde.............................. 15 A.2 udnytte................................ 16 B Kilde kode 17 B.1 Main.java............................... 17 B.2 Gui.java................................ 17 B.3 Tabel.java............................... 23 B.4 Spiller.java.............................. 25 B.5 Moede.java.............................. 27 B.6 RandomPlayer.java.......................... 28 B.7 Udnytte.java............................. 29 B.8 Samarbejde.java........................... 29 B.9 Kok04.java.............................. 30 2

Kapitel 2 Indledning Spillet Dilemma, som denne rapport omhandler, går i alt sin enkelthed ud på at to spillere mødes og udveksler en vare, med mulighed for at aflevere varen, eller at snyde modstanderen. Hvis begge snyder, opnås ingen point, og da én spiller nok hurtigt bliver træt af at blive snydt, er det smarteste at opbygge en tillid, spillerne imellem, hvorved spillerens hukommelse kan benyttes. Rapporten her er udarbejdet af Jacob Aae Mikkelsen ( Kokken ) i faget DM34, foråret 2005. Det er i forbindelse med den første afleveringsopgave, der tæller som en del af eksamen. Denne udgave af Dilemma er lavet med en simpel grafisk brugerflade, seks spillere, hvoraf én er interaktiv, så dette program er et ét personers spil, og hver spiller mødes 10 til 40 gange. Der er i opgaven lagt op til en større ekstern turnering, der har spillet ind, ved udarbejdelsen af strategien. Der er endvidere kort beskrevet de umiddelbare muligheder for at forbedre spillet, og givet en vurdering af kodens kvalitet. 3

Kapitel 3 Kravspecifikation Der er udtrykkeligt blevet stillet disse krav til opgaven Et Dilemma spil med 6 spillere De seks spiller skal være: - Interaktiv, brugeren bestemmer - Altid udnytte - Altid samarbejde - Random, tilfældigt udvalgt - Edmund (forelæserens) strategi - Vores egen, navngivet med vores IMADA brugernavn Designbeskrivelse af struktur og hovedprogram Specifikation og design af vores egen strategi Programudskrift Afprøvning Resultat og konklusion af afprøvningen Ud over de i opgaven stillede krav er der udarbejdet en grafisk brugerflade. 4

Kapitel 4 Design 4.1 Udviklingsstrategi Da der allerede var standardiserede klasser til spiller og moede klasserne, samt en ret udførlig beskrivelse af opgaven, valgtes vandfaldsmodellen som udviklingsstrategi. Der var enkelte småfejl, der blev fundet under testning, som så sendte udviklingen tilbage et skridt, men ellers er modellen fulgt med succes. 4.2 Klasseopbygning De seks spillere nedarver alle fra Spiller klassen, ligesom de benytter Moede klassen. I kraft af den enumererede type Handling der er placeret i denne klasse, har den mange koblinger til de andre klasser, hvilket til dels kunne være undgået, hvis Handling havde været lagt i spiller. Den største klasse i programmet er uden tvivl Gui. Denne klasse står for den grafiske brugerflade, og selve afviklingen af spillet. Selve afviklingen af spillet kunne være placeret i en klasse for sig selv, men da den ikke er så omfattende endda, var den behagelig at have i samme klasse som de tekstfelter denne del hele tiden opdaterer, derfor er denne løsning foretrukket. Gui klassen gør brug af Tabel klassen, der laver de to evalueringsskemaer. Der er i opgaven implementeret en metode i Spiller klassen, der kan sammenligne to spillere, men da Tabel klassen løbende får informationerne om pointene, efter hvert møde, er det fortrukket at den benytter sig af sine egne oplysninger, frem for at koble til Spiller klassen. Der er desuden lavet en Main klasse, der kun har et formål, nemlig at lave og initialisere den første instans variabel, og dermed starte den grafiske brugerflade. 5

Kapitel 5 Kok04 strategien Personligt, tror jeg på det bedste i folk, også at man kan ændre sig til det bedre. Dette er grundidéen med kok04 strategien. Den er opbygget på de tre seneste møder, fordelt med halvdelen på det seneste, to sjettedele på det næstsidste og én sjettedel på det tredjesidste. Resten af historien er uden betydning. I dette spil med flere ukomplicerede strategier, klarer den sig fornuftigt, men taber selvfølgeligt hver gang mødet med strategien der kun udnytter. Det er til gengæld ikke med ret mange point, og derfor tror jeg kok04 har en bedre chance i en turnering, med mange spillere, der har implementeret forskellige strategier, men det må jo stå sin prøve senere. 6

Kapitel 6 Implementation 6.1 High score tabel Der er forskellige måder at bygge tabeller op på, men her er valgt en enkel måde, der bygger på string-concatenation. Tabel klassen arbejder uafhængigt af spiller klassen, hvilket giver en bedre struktur med mindre kobling. Specielt den sorterede high-score tabel benytter et lidt naivt design, der dog virker uden problemer. totalliste.add(formatnumber(total)+ " " + nametable[i]); Spillerne med point forrest, bliver indsat i en Arrayliste, men med pointene forrest med foranstillede nuller op til længden 7. Her ses tydeligt at denne tilgang ville få problemer med flere point end 9999999, men da dette svarer til maksimalt point udbytte i (999999999 / 4 møder) 2500000 møder, og med 6spillere skal hver spiller så mødes 41666666 gange. Dette er ikke muligt, og derfor er der ingen problemer. 6.2 Sortere tabellen Da der er foran stillede nuller til en fast længde, kan listen sorteres ganske enkelt efter sinpel alfabetisk orden. Til dette formål benyttes javas egen funktion til at sortere liste. Da den så ender i modsat rækkefølge, concateneres strengen ved at tilføje nye dele før det eksisterende i strengen public String highscoretabel() { Collections.sort(totalListe); String highscore = ""; Iterator it = totalliste.iterator(); for(int i=1; it.hasnext() ; i++) { highscore = "" + (7-i) + it.next() + "\n" + highscore; } } highscore = "High Score Liste - Hall of Fame\nPlads Point Spiller\n" + highscore; return highscore; 7

6.3. FEJL AFVÆRGNING 6.3 Fejl afværgning Hvis spilleren fortsat trykker på samarbejde eller udnytte knapperne efter spillet er slut, udnyttes den ArrayOutOfBounds exception der opstår til at skrive en ny tekst i det lille tektfelt over knapperne ved de fælgende catch: catch(exception e) { count.settext("\n } Tryk på \n \"Nyt spil\""); 8

Kapitel 7 Afprøvning 7.1 Test I kraft af at programmet er lavet med en grafisk brugerflade, er der kun tre knapper, og ingen indtastning fra brugeren, der jo kan modtage alverdens input, og derfor også skal grundigt testes. Start nyt spil knappen, starter et nyt spil, også uanset om man ikke er færdig med det spil. Dette er der intet gjort for at forhindre, og kan derfor ikke betegnes som en bug, nærmere en feature, idet der jo heller ikke kommer nogen irriterende dialogbokse med Er du sikker beskeder. Når spillet er startet, giver udnytte/samarbejde knapperne informationen videre til spillet, men under afprøvning, konstateredes det at når spillet var slut, udløste det en exception, at trykke på det. Denne fejl er rettet med en try/catch, og resulterer i stedet for med en meddelelse om at trykke på nyt spil. Med hensyn til de enkelte strategier, afprøves ved hjælp af den interaktive, ved to testkørsler, én der samarbejder medalle i 10 spil og en der udnytter mod alle i 10 spil. 7.1.1 Samarbejde i 10 spil Idet vi samarbejder i 10 spil, skulle vores resultater minde meget om det samarbejde spilleren opnår. det vil sige at: Mod udnytte forventes -10 Mod samarbejde forventes 20 Mod Kok04 strategien/kokkens forventes 20 Mod Random forventes at samarbejde ca 5 gange og blive udnyttet ca 5 gange, men er ikke nem at teste på. Udnytte mod Dig selv opnår 40 Samarbejde mod Dig selv opnår 20 Kokken mod Dig selv opnår 20 Disse resultater kan ifølge bilag A.1. bekræftes. Ud fra tabellen testes også total scoren, og konstaterer at: 9

7.2. MULIG UDVIDELSE 20-10+20+20+11 faktisk giver 61 20-4+20+20+3 faktisk giver 59 40+15+40+12+28 faktisk giver 136 (Resten er også adderet og kontrolleret) Slutteligt konstateres at de samlede totaler er de samme i begge skemaer, samt at Samarbejde og Dig selv kun er adskilt af de tre point der er i forskel mod Random Denne del af testen er altså godkendt, uden konstaterede fejl. 7.1.2 Udnytte i 10 spil Idet vi udnytter i alle spil, forventes resultater der skal ligne resultaterne fra Udnytte spilleren, det vil sige: Mod udnytte forventes 0 Mod samarbejde forventes 40 Mod Kok04 strategien/kokkens forventes 12 (Kun point i de tre forste runder) Mod Random forventes at samarbejde ca 5 gange og blive udnyttet ca 5 gange, men er ikke nem at teste på. Udnytte mod Dig selv opnår 0 Samarbejde mod Dig selv opnår -10 Kokken mod Dig selv opnår -3 Disse resultater kan verificeres, se bilag A.2. Ud fra tabellen testes også total scoren, og konstaterer at: 16+40+12+24 giver 92-4-4+20+20+12 giver 44 (Resten er også adderet og kontrolleret) Også her konstateredes at de samlede totaler er identiske i de to skemaer, og at vi opnår de helt samme resultater som Udnytte spilleren. Vi finder i denne test heller ingen fejl. 7.2 Mulig udvidelse Der kunne implementeres en brugsanvisning til spillet, der kunne hentes fra menulinien. Dette er udeladt, da reglerne er meget simple, og dem der stifter bekendskab med spillet kender dem. 7.3 Evaluering af kodens kvalitet Som i ethvert projekt, er der jo positive og negative ting. Ting der er positive, er at programmet overholder de retningslinier for pæn kode (Coding Guidelines) som Michael Kölling beskriver[1]. Dette gør at koden er til at overskue, og der er lavet kommentarer til alle metoder, også i spiller klasssen, der var mangelfuld, 10

7.3. EVALUERING AF KODENS KVALITET i den udleverede version. Af negative ting kan nævnes at der er en del af koden i Spiller klassen der ikke benyttes, men der ikke kan ændres, grundet krav i opgaven om kompatibilitet. 11

Kapitel 8 Konklusion Der er i processen løst og besvaret de stillede opgaver. Programmet virker efter hensigten, og de fejl der dukkede op under afprøvningen er rettet. Af personlige erfaringer, kan konkluderes at tidsplaner kan snyde; når en platform skal opgraderes som i dette tilfælde JAVA fra 1.4 til 5, kan det tage nogen tid at få compileren til at køre ordenligt. Der er ganske givet også klasser i JAVA, der er lavet til den slags skemaer, som voldte problemer i Tabel klassen, men denne fremgangsmåde virker, omend den er møjsommelig. 12

Litteratur [1] Objects First with JAVA - A practical introduction using BlueJ (2nd Edition), Michael Kölling, David J. Barnes, Pearson Educational Limited 2004 13

Bilag A Testkørsels udskrifter 14

A.1. SAMARBEJDE A.1 samarbejde Figur A.1: 10 runder med kun samarbejde 15

A.2. UDNYTTE A.2 udnytte Figur A.2: 10 runder med kun udnytte 16

Bilag B Kilde kode B.1 Main.java 1 2 public class Main { 3 4 / 5 Main c l a s s f o r t h e game Dilemma, i n i t i a l i z e s t h e 6 Graphical user i n t e r f a c e 7 8 / 9 public s t a t ic void main ( S t r i n g [ ] a r g s ) { 10 Gui gui = new Gui ( ) ; 11 } 12 } B.2 Gui.java 1 import java. awt. BorderLayout ; 2 import java. awt. Container ; 3 import java. awt. Dimension ; 4 import java. awt. Font ; 5 import java. awt. GridLayout ; 6 import java. awt. event. ActionEvent ; 7 import java. awt. event. A c t i o n L i s t e n e r ; 8 import java. u t i l. ArrayList ; 9 10 import javax. swing. JButton ; 11 import javax. swing. JFrame ; 12 import javax. swing. JLabel ; 13 import javax. swing. JMenu ; 14 import javax. swing. JMenuBar ; 15 import javax. swing. JMenuItem ; 16 import javax. swing. JPanel ; 17 import javax. swing. JTextArea ; 18 import javax. swing. border. EmptyBorder ; 19 import javax. swing. border. EtchedBorder ; 20 17

B.2. GUI.JAVA 21 / 22 @author Kokken 23 24 This c l a s s c r e a t e s t h e g r a p h i c a l user i n t e r f c e f o r t h e a p p l i c a t i o n 25 And c o n t r o l s t h e game a c t i o n 26 / 27 public class Gui { 28 private JFrame frame ; 29 private JTextArea textarea ; 30 private JTextArea r e s u l t A r e a ; 31 private JTextArea count ; 32 private ArrayList<S p i l l e r > s p i l l e r e ; 33 private int a n t a l ; 34 private int spillernummer ; 35 private int rounds ; 36 private Tabel t a b e l ; 37 38 / 39 Constructor o f t h e GUI 40 I n i t i a l i z e s t h e f i e l d s, and 41 C a l l s t h e method makeframe to d i s p l a y t h e GUI 42 / 43 public Gui ( ) { 44 frame = new JFrame ( "Dilemma" ) ; 45 textarea = new JTextArea ( ) ; 46 r e s u l t A r e a = new JTextArea ( ) ; 47 count = new JTextArea ( ) ; 48 s p i l l e r e = new ArrayList<S p i l l e r >() ; 49 rounds = 1 1 ; 50 51 makeframe ( ) ; 52 newgame ( ) ; 53 } 54 55 56 / 57 This methods c r e a t e s t h e GUI d i s p l a y, 58 and s e t s up a l i s t e n e r to t h e b u t t o n s 59 / 60 private void makeframe ( ) { 61 62 //The frame, and i t s p r o p e r t i e s 63 Container contentpane = frame. getcontentpane ( ) ; 64 contentpane. setlayout (new BorderLayout ( ) ) ; 65 frame. s e t D e f a u l t C l o s e O p e r a t i o n ( JFrame.EXIT_ON_CLOSE) ; 66 67 //The menu bar in t h e top op t h e frame, and i t s o p e r a t i o n s 68 JMenuBar menubar = new JMenuBar ( ) ; 69 frame. setjmenubar ( menubar ) ; 70 JMenu countmenu = new JMenu( " Antal Runder" ) ; 71 menubar. add ( countmenu ) ; 72 73 JMenuItem ten = new JMenuItem ( "10 runder " ) ; 74 countmenu. add ( ten ) ; 18

B.2. GUI.JAVA 75 ten. addactionlistener (new A c t i o n L i s t e n e r ( ) { 76 public void actionperformed ( ActionEvent e ) { 77 setrounds ( 1 0 ) ; 78 newgame ( ) ; 79 } 80 }) ; 81 82 JMenuItem twenty = new JMenuItem ( "20 runder " ) ; 83 countmenu. add ( twenty ) ; 84 twenty. addactionlistener (new A c t i o n L i s t e n e r ( ) { 85 public void actionperformed ( ActionEvent e ) { 86 setrounds ( 2 0 ) ; 87 newgame ( ) ; 88 } 89 }) ; 90 91 JMenuItem t h i r t y = new JMenuItem ( "30 runder " ) ; 92 countmenu. add ( t h i r t y ) ; 93 t h i r t y. addactionlistener (new A c t i o n L i s t e n e r ( ) { 94 public void actionperformed ( ActionEvent e ) { 95 setrounds ( 3 0 ) ; 96 newgame ( ) ; 97 } 98 }) ; 99 100 JMenuItem f o r t y = new JMenuItem ( "40 runder " ) ; 101 countmenu. add ( f o r t y ) ; 102 f o r t y. addactionlistener (new A c t i o n L i s t e n e r ( ) { 103 public void actionperformed ( ActionEvent e ) { 104 setrounds ( 4 0 ) ; 105 newgame ( ) ; 106 } 107 }) ; 108 109 //The i n s t r u c t i o n i n t h e top o f t h e screen 110 JLabel label = new JLabel ( " Dette er s p i l l e t dilemma, når du t r y k k e r på s t a r t, bestemmer du, mod de f o r s k e l l i g e s p i l l e r e du møder" ) ; 111 label. s e t P r e f e r r e d S i z e (new Dimension ( 7 0 0, 4 0 ) ) ; 112 contentpane. add ( label, BorderLayout.NORTH) ; 113 114 // t h e l a r g e t e x t areas to t h e l e f t 115 Container textareacontainer = new Container ( ) ; 116 textareacontainer. setlayout (new GridLayout ( 0, 1 ) ) ; 117 118 textarea. s e t P r e f e r r e d S i z e (new Dimension (500, 300) ) ; 119 textarea. setborder (new EtchedBorder ( ) ) ; 120 textarea. setfont (new Font ( "Monospaced", 0, 14) ) ; 121 textareacontainer. add ( textarea ) ; 122 123 r e s u l t A r e a. s e t P r e f e r r e d S i z e (new Dimension (500, 300) ) ; 124 r e s u l t A r e a. setborder (new EtchedBorder ( ) ) ; 125 r e s u l t A r e a. setfont (new Font ( "Monospaced", 0, 14) ) ; 126 textareacontainer. add ( r e s u l t A r e a ) ; 127 19

B.2. GUI.JAVA 128 contentpane. add ( textareacontainer, BorderLayout.CENTER) ; 129 130 //The b u t t o n s and t h e s m a l l t e x t a r e a to t h e r i g h t 131 JPanel buttonpanel = new JPanel ( ) ; 132 buttonpanel. setborder (new EmptyBorder ( 0, 1 6, 0, 1 6 ) ) ; 133 buttonpanel. setlayout (new GridLayout ( 0, 1 ) ) ; 134 135 JButton startbutton = new JButton ( "Nyt s p i l " ) ; 136 startbutton. addactionlistener (new A c t i o n L i s t e n e r ( ) { 137 public void actionperformed ( ActionEvent e ) { 138 newgame ( ) ; 139 } 140 }) ; 141 142 JButton samarbejdebutton = new JButton ( " Samarbejde " ) ; 143 samarbejdebutton. addactionlistener (new A c t i o n L i s t e n e r ( ) { 144 public void actionperformed ( ActionEvent e ) { 145 playgame ( Moede. Handling. sam ) ; 146 } 147 }) ; 148 149 JButton udnyttebutton = new JButton ( " Udnytte " ) ; 150 udnyttebutton. addactionlistener (new A c t i o n L i s t e n e r ( ) { 151 public void actionperformed ( ActionEvent e ) { 152 playgame ( Moede. Handling. udn ) ; 153 } 154 }) ; 155 156 count. s e t P r e f e r r e d S i z e (new Dimension ( 5 0, 5 0 ) ) ; 157 count. setborder (new EtchedBorder ( ) ) ; 158 count. setfont (new Font ( "Monospaced", 0, 12) ) ; 159 buttonpanel. add ( count ) ; 160 161 JLabel empty0 = new JLabel ( ) ; 162 buttonpanel. add ( empty0 ) ; 163 buttonpanel. add ( startbutton ) ; 164 JLabel empty1 = new JLabel ( ) ; 165 buttonpanel. add ( empty1 ) ; 166 buttonpanel. add ( samarbejdebutton ) ; 167 JLabel empty2 = new JLabel ( ) ; 168 buttonpanel. add ( empty2 ) ; 169 buttonpanel. add ( udnyttebutton ) ; 170 JLabel empty3 = new JLabel ( ) ; 171 buttonpanel. add ( empty3 ) ; 172 173 contentpane. add ( buttonpanel, BorderLayout. EAST) ; 174 175 //The bottum t e x t l a b e l 176 JLabel labeldown = new JLabel ( " Design by : Kokken" ) ; 177 labeldown. s e t P r e f e r r e d S i z e (new Dimension ( 5 0 0, 5 0 ) ) ; 178 contentpane. add ( labeldown, BorderLayout.SOUTH) ; 179 180 frame. pack ( ) ; 181 frame. s e t L o c a t i o n R e l a t i v e T o ( null ) ; 20

B.2. GUI.JAVA 182 frame. s e t V i s i b l e ( true ) ; 183 184 } 185 186 / 187 This method i n i t i a l i z e s t h e Dilemma game f o r a 188 new game, c l e a r i n g a l l p l a y e r s memory, and l o a d i n g them 189 / 190 private void newgame ( ) { 191 a n t a l = 1 ; 192 spillernummer = 1 ; 193 t a b e l = new Tabel ( ) ; 194 195 s p i l l e r e. c l e a r ( ) ; 196 s p i l l e r e. add (new Kok04 ( "Dig s e l v " ) ) ; //"Dummy" player, to f i l l t h e space in t h e l i s t 197 s p i l l e r e. add (new Edmund( "Edmund " ) ) ; 198 s p i l l e r e. add (new Udnytte ( " Udnytte " ) ) ; 199 s p i l l e r e. add (new Samarbejde ( " Samarbejde " ) ) ; 200 s p i l l e r e. add (new Kok04 ( "Kokkens " ) ) ; 201 s p i l l e r e. add (new RandomPlayer ( "Random " ) ) ; 202 203 count. settext ( "\n Du kan nu \n s t a r t e " ) ; 204 textarea. settext ( "Vælg nu om du v i l samarbejde e l l e r udnytte " ) ; 205 r e s u l t A r e a. settext ( " R e s u l t a t e r " ) ; 206 } 207 208 209 / 210 Controls t h e gameplay, once i t has s t a r t e d 211 / 212 private void playgame ( Moede. Handling A) 213 { 214 //The p l a y e r namesis arranged in t h e t a b l e 215 for ( int i= 0 ; i < s p i l l e r e. s i z e ( ) ; i ++) { 216 t a b e l. addplayername ( i, s p i l l e r e. get ( i ). getname ( ) ) ; 217 } 218 219 220 // This p a r t c o n t r o l s t h e i n t e r a c t i v e p l a y e r 221 i f ( a n t a l % rounds!= 0 && spillernummer < 6) 222 { 223 count. settext ( "\n Antal Møder\n " + a n t a l ) ; 224 Moede. Handling B = s p i l l e r e. get ( spillernummer ). getaction ( ) ; 225 Moede moedea = new Moede (A, B) ; 226 Moede moedeb = new Moede (B,A) ; 227 228 s p i l l e r e. get ( spillernummer ). savemeet (moedeb) ; 229 s p i l l e r e. get ( 0 ). savemeet (moedea) ; 230 231 S t r i n g t e x t = ""+s p i l l e r e. get ( spillernummer ). getname ( )+" : "+s p i l l e r e. get ( spillernummer ). s c o r e ( )+"\n"+s p i l l e r e. get ( 0 ). getname ( )+" : "+s p i l l e r e. get ( 0 ). s c o r e ( ) + "\ nseneste møde : " + moedea. t o S t r i n g ( ) ; ; 21

B.2. GUI.JAVA 232 233 r e s u l t A r e a. settext ( t e x t ) ; 234 235 a n t a l++; 236 } 237 else 238 { 239 a n t a l =1; 240 try{ 241 t a b e l. addresult ( 0, spillernummer, s p i l l e r e. get ( 0 ). s c o r e ( ) ) ; 242 t a b e l. addresult ( spillernummer, 0, s p i l l e r e. get ( spillernummer ). s c o r e ( ) ) ; 243 s p i l l e r e. get ( 0 ). clearmemory ( ) ; 244 s p i l l e r e. get ( spillernummer ). clearmemory ( ) ; 245 } 246 catch ( Exception e ) 247 { 248 count. settext ( "\n Tryk på \n \"Nyt s p i l \"" ) ; 249 } 250 spillernummer++; 251 i f ( spillernummer <6) {playgame (A) ; } 252 } 253 254 // Here i t i s t h e automatic p l a y e r s 255 i f ( spillernummer == 6) { 256 int a u t o S p i l l e r 1 = 1 ; 257 int a u t o S p i l l e r 2 = 2 ; 258 while ( a u t o S p i l l e r 1 < 5) { 259 for ( int j = 1 ; j % rounds!= 0 ; j ++){ 260 Moede. Handling f i r s t = s p i l l e r e. get ( a u t o S p i l l e r 1 ). getaction ( ) ; 261 Moede. Handling second = s p i l l e r e. get ( a u t o S p i l l e r 2 ). getaction ( ) ; 262 Moede moedefirst = new Moede ( f i r s t, second ) ; 263 Moede moedesecond = new Moede ( second, f i r s t ) ; 264 265 s p i l l e r e. get ( a u t o S p i l l e r 1 ). savemeet ( moedefirst ) ; 266 s p i l l e r e. get ( a u t o S p i l l e r 2 ). savemeet ( moedesecond ) ; 267 } 268 t a b e l. addresult ( a u t o S p i l l e r 1, a u t o S p i l l e r 2, s p i l l e r e. get ( a u t o S p i l l e r 1 ). s c o r e ( ) ) ; 269 t a b e l. addresult ( a u t o S p i l l e r 2, a u t o S p i l l e r 1, s p i l l e r e. get ( a u t o S p i l l e r 2 ). s c o r e ( ) ) ; 270 271 s p i l l e r e. get ( a u t o S p i l l e r 1 ). clearmemory ( ) ; 272 s p i l l e r e. get ( a u t o S p i l l e r 2 ). clearmemory ( ) ; 273 a u t o S p i l l e r 2 ++; 274 i f ( a u t o S p i l l e r 2 > 5) { 275 a u t o S p i l l e r 1 ++; 276 a u t o S p i l l e r 2 = a u t o S p i l l e r 1 + 1 ; 277 } 278 } 279 r e s u l t A r e a. settext ( t a b e l. lavtabel ( ) ) ; 280 textarea. settext ( t a b e l. highscoretabel ( ) ) ; 281 22

B.3. TABEL.JAVA 282 } 283 } 284 285 / 286 S e t s t h e number o f rounds 287 / 288 private void setrounds ( int numberofrounds ) 289 { 290 rounds = numberofrounds + 1 ; 291 } 292 } B.3 Tabel.java 1 import java. u t i l. ArrayList ; 2 import java. u t i l. C o l l e c t i o n s ; 3 import java. u t i l. I t e r a t o r ; 4 5 6 / 7 Denne k l a s s e s t å r f o r at skabe t a b e l l e n med r e s u l t a t e r 8 / 9 public class Tabel { 10 private int [ ] [ ] playertable ; 11 private S t r i n g [ ] nametable ; 12 private int t o t a l ; 13 private ArrayList<String > t o t a l L i s t e ; 14 15 public Tabel ( ) 16 { 17 nametable = new S t r i n g [ 6 ] ; 18 playertable = new int [ 6 ] [ 6 ] ; 19 t o t a l L i s t e = new ArrayList<String >() ; 20 t o t a l = 0 ; 21 22 i n i t i a l i z e ( ) ; 23 } 24 25 / 26 Her t i l f ø j e s r e s u l t a t e r t i l t a b e l l e n 27 / 28 public void addresult ( int player, int opponent, int s c o r e ) 29 { 30 playertable [ p l a y e r ] [ opponent ] = s c o r e ; 31 } 32 33 34 / 35 Adds a p l a y e r name to t h e t a b l e 36 / 37 public void addplayername ( int p l a y e r, S t r i n g name) 38 { 39 int l e n g t h = name. l e n g t h ( ) ; 40 for ( int i = 1 ; i < 14 l e n g t h ; i ++) { 23

B.3. TABEL.JAVA 41 name = name + " " ; 42 } 43 nametable [ p l a y e r ] = name ; 44 } 45 46 / 47 Her l a v e s t a b e l l e n med de e n k e l t e møder 48 mellem s p i l l e r n e 49 / 50 public S t r i n g lavtabel ( ) 51 { 52 S t r i n g r e s u l t a t = "De e n k e l t e møder \ n S p i l l e r 1 2 3 4 5 6 Total \n" ; 53 for ( int i = 0 ; i <6 ; i ++) { 54 r e s u l t a t = r e s u l t a t + nametable [ i ] ; 55 for ( int j = 0 ; j <6 ; j++) { 56 t o t a l += playertable [ i ] [ j ] ; 57 r e s u l t a t = r e s u l t a t + "" + formatnumber ( playertable [ i ] [ j ] ) + "" ; 58 } 59 t o t a l L i s t e. add ( formatnumber ( t o t a l )+ " " + nametable [ i ] ) ; 60 r e s u l t a t = r e s u l t a t + "" + formatnumber ( t o t a l ) + "\n" ; 61 t o t a l = 0 ; 62 } 63 64 return r e s u l t a t ; 65 } 66 67 / 68 Her l a v e s h i g h s c o r e t a b e l l e n, s o r t e r e t e f t e r p o i n t 69 / 70 public S t r i n g highscoretabel ( ) 71 { 72 C o l l e c t i o n s. s o r t ( t o t a l L i s t e ) ; 73 S t r i n g highscore = "" ; 74 I t e r a t o r i t = t o t a l L i s t e. i t e r a t o r ( ) ; 75 for ( int i =1; i t. hasnext ( ) ; i ++) { 76 highscore = "" + (7 i ) + i t. next ( ) + "\n" + highscore ; 77 } 78 79 highscore = "High Score L i s t e Hall o f Fame\ nplads Point S p i l l e r \n" + highscore ; 80 return highscore ; 81 } 82 83 84 / 85 Formatterer e t nummer t i l en streng, med foran s t i l l e d e 86 mellemrum, t i l en samlet længde a f 7 87 / 88 private S t r i n g formatnumber ( int number ) 89 { 90 S t r i n g badnumber = "" + number ; 91 int l e n g t h = badnumber. l e n g t h ( ) ; 92 S t r i n g nicenumber = "" ; 24

B.4. SPILLER.JAVA 93 for ( int i = 0 ; i < 7 l e n g t h ; i++ ) { 94 nicenumber = nicenumber + " " ; 95 } 96 nicenumber = nicenumber + number ; 97 return nicenumber ; 98 } 99 100 / 101 Her f y l d e s d o b b e l t a r r a y e t op med n u l l e r, s p e c i e l t t i l brug 102 f o r de møder der i k k e e k s i s t e r e r / når man i k k e møder s i g s e l v 103 104 / 105 private void i n i t i a l i z e ( ) 106 { 107 for ( int j =0; j <6 ; j++) { 108 for ( int i =0; i <6 ; i ++) { 109 playertable [ i ] [ j ] = 0 ; 110 } 111 } 112 } 113 } B.4 Spiller.java 1 import java. u t i l. ArrayList ; 2 / 3 Dette er en a b s t r a k t s u p e r k l a s s e f o r a l l e s p i l l e r n e 4 i Dilemma s p i l l e t. Klassen d e f i n e r e r en g e n e r e l s p i l l e r. 5 Den k o n k r e t e s p i l l e r, dvs. med implementation a f 6 getaction, d e f i n e r e s i en a f l e d t k l a s s e. 7 Klassen implementerer Comparable f o r at s o r t e r e s p i l l e r n e. 8 / 9 abstract public class S p i l l e r implements Comparable 10 { 11 protected S t r i n g name ; // S p i l l e r e n s navn 12 protected ArrayList<Moede> memory ; // t i l t i d l i g e r e møder 13 private int t o t a l = 0 ; // s p i l l e r e n s t o t a l e s c o r e 14 15 / 16 Constructor t i l s p i l l e r e n 17 18 @param na S p i l l e r e n s navn 19 / 20 public S p i l l e r ( S t r i n g na ) 21 { 22 name = na ; 23 memory = new ArrayList<Moede>() ; // i n i t i a l i s e r hukommelsen 24 } 25 26 / 27 Returneret s p i l l e r e n s navn 28 @return Navnet på s p i l l e r e n 29 / 30 public S t r i n g getname ( ) 25

B.4. SPILLER.JAVA 31 { 32 return name ; 33 } 34 35 / 36 Kan u d s k r i v e hukommelsen f o r denne s p i l l e r 37 / 38 protected void r e c a l l ( ) 39 { 40 System. out. p r i n t ( "Hukommelse f o r "+name+" : " ) ; 41 i f (memory. s i z e ( ) ==0) { 42 System. out. p r i n t ( "tom" ) ; 43 } 44 for ( int i =0; i <memory. s i z e ( ) ; i ++) { 45 System. out. p r i n t ( " " + memory. get ( i ) ) ; 46 System. out. p r i n t l n ( ) ; 47 } 48 } 49 50 // Denne metode implementeres i den a f l e d t e k l a s s e 51 abstract public Moede. Handling getaction ( ) ; 52 53 / 54 f ø l g e n d e metode i n d s æ t t e r e t møde i hukommelsen. 55 / 56 public void savemeet ( Moede m) 57 { 58 memory. add (m) ; 59 } 60 61 / 62 f ø l g e n d e metode s l e t t e r hukommelsen f ø r ny m o d s p i l l e r. 63 / 64 public void clearmemory ( ) 65 { 66 memory. c l e a r ( ) ; 67 } 68 69 / 70 Denne metode beregner scoren ud frahukommelsen 71 @return S p i l l e r e n s s c o r e 72 / 73 public int s c o r e ( ) 74 { 75 int sum=0; // sum er scoren mod een s p i l l e r 76 for ( int i =0; i <memory. s i z e ( ) ; i ++) { 77 sum += (memory. get ( i ) ). value ( ) ; 78 } 79 return sum ; 80 } 81 82 / 83 Denne metode lægger e t t a l t i l scoren 84 @param nyscore Det der s k a l lægges t i l i p o i n t 26

B.5. MOEDE.JAVA 85 / 86 public void addtototal ( int nyscore ) 87 { 88 t o t a l += nyscore ; 89 } 90 91 / 92 Denne metode r e t u r n e r e r s p i l l e r e n s t o t a l e s c o r e 93 @return den samlede s c o r e 94 / 95 public int gettotal ( ) 96 { 97 return t o t a l ; 98 } 99 100 //Her implementeres compareto f r a i n t e r f a c e t Comparable. 101 //Værdien er p o s i t i v, h v i s t h i s p l a y e r kommer e f t e r e f t e r 102 //B i ordningen, dvs. h v i s B har den s t ø r s t e s c o r e. 103 // Dette er modsat normal ordning a f t a l v æ r d i e r! 104 public int compareto ( Object B) 105 { 106 return ( ( S p i l l e r ) B). gettotal ( ) gettotal ( ) ; 107 } 108 } B.5 Moede.java 1 / 2 This c l a s s c r e a t e s t h e t a b l e o f r e s u l t s 3 f o r t h e dilemma game 4 / 5 public class Moede 6 { 7 enum Handling {sam, udn } ; 8 private f i n a l Handling SAM = Handling. sam ; 9 private f i n a l Handling UDN = Handling. udn ; 10 private Handling avalg ; 11 private Handling bvalg ; 12 13 / 14 Constructor, t a k e s t h e two p l a y e r s a c t i o n s 15 as parameters 16 / 17 public Moede ( Handling a, Handling b ) 18 { 19 avalg=a ; 20 bvalg=b ; 21 } 22 23 / 24 Returns p l a y e r a s a c t i o n 25 / 26 public Handling geta ( ) 27 { 27

B.6. RANDOMPLAYER.JAVA 28 return avalg ; 29 } 30 31 / 32 Returns p l a y e r b s a c t i o n 33 / 34 public Handling getb ( ) 35 { 36 return bvalg ; 37 } 38 39 / 40 Returns t h e p o i n t s c o r e o f p l a y e r a 41 / 42 public int value ( ) 43 { 44 int r e s u l t = 100000; // ændres med s i k k e r h e d 45 i f ( avalg==sam && bvalg==sam) r e s u l t= 2 ; 46 i f ( avalg==sam && bvalg==udn) r e s u l t = 1; 47 i f ( avalg==udn && bvalg==sam) r e s u l t= 4 ; 48 i f ( avalg==udn && bvalg==udn) r e s u l t= 0 ; 49 return r e s u l t ; 50 } 51 52 / 53 Overwrites t h e method from o b j e c t, i s 54 used in System. out. p r i n t l i n e s, where 55 t h e method i s i m p l i c i t l y c a l l e d 56 / 57 public S t r i n g t o S t r i n g ( ) 58 { 59 return " ( " + avalg + ", " + bvalg + " ) " ; 60 } 61 62 / 63 This method compares two meetings ( Not used in t h i s p r o j e c t ) 64 / 65 public boolean e q u a l s ( Object m) 66 { 67 return ( ( Moede )m). geta ( ) == avalg && ( ( Moede )m). getb ( ) == bvalg ; 68 } 69 } B.6 RandomPlayer.java 1 import java. u t i l. Random ; 2 3 / 4 A p l a y e r s t r a t e g i f o r t h e Dilemma game 5 Returns a random a c t i o n 6 / 7 public class RandomPlayer extends S p i l l e r 8 { 9 Random random ; 28

B.7. UDNYTTE.JAVA 10 11 public RandomPlayer ( S t r i n g na ) 12 { 13 super ( na ) ; 14 random = new Random ( ) ; 15 } 16 17 // Implements t h e a b s t r a k t method g e t A c t i o n : 18 public Moede. Handling getaction ( ) 19 { 20 int i = random. n extint ( 1 0 ) ; 21 i f ( i < 5) { // 50% chance each 22 return Moede. Handling. sam ; 23 } 24 else { 25 return Moede. Handling. udn ; 26 } 27 } 28 } B.7 Udnytte.java 1 / 2 Dette er en s p i l l e r t y p e t i l Dilemma s p i l l e t 3 4 Denne s p i l l e r u d n y t t e r hver gang 5 / 6 public class Udnytte extends S p i l l e r 7 { 8 public Udnytte ( S t r i n g na ) 9 { 10 super ( na ) ; // bruger Constructor f r a Player 11 } 12 13 // Implementationen a f den a b s t r a k t e metode g e t A c t i o n : 14 public Moede. Handling getaction ( ) 15 { 16 return Moede. Handling. udn ; 17 } 18 } B.8 Samarbejde.java 1 / 2 A p l a y e r s t r a t e g i f o r t h e Dilemma game 3 t h e p l a y e r w i l l a l l w a y s c o o r p e r a t e 4 / 5 public class Samarbejde extends S p i l l e r 6 { 7 public Samarbejde ( S t r i n g na ) 8 { 9 super ( na ) ; 10 } 29

B.9. KOK04.JAVA 11 12 // Implementats t h e a b s t r a k t method g e t A c t i o n : 13 public Moede. Handling getaction ( ) 14 { 15 return Moede. Handling. sam ; 16 } 17 } B.9 Kok04.java 1 / 2 This i s a p l a y e r t y p e 3 f o r t h e Dilemma game, 4 Depending on t h e l a s t t r e e moves 5 / 6 public class Kok04 extends S p i l l e r 7 { 8 9 public Kok04 ( S t r i n g na ) { 10 super ( na ) ; // Constructor from s p i l l e r 11 } 12 13 // Implementation o f t h e a b s t r a k t method g e t A c t i o n : 14 public Moede. Handling getaction ( ) 15 { 16 int s c o r e = 0 ; 17 int l e n g t h = super. memory. s i z e ( ) ; 18 i f ( l e n g t h > 2) { 19 Moede. Handling t h i r d L a s t = super. memory. get ( length 2). getb ( ) ; 20 Moede. Handling secondlast = super. memory. get ( length 1). getb ( ) ; 21 Moede. Handling l a s t = super. memory. get ( length 1). getb ( ) ; 22 i f ( t h i r d L a s t. e q u a l s ( Moede. Handling. sam ) ) { s c o r e += 1 ; } ; 23 i f ( secondlast. e q u a l s ( Moede. Handling. sam ) ) { s c o r e += 2 ; } ; 24 i f ( l a s t. e q u a l s ( Moede. Handling. sam ) ) { s c o r e += 3 ; } ; 25 } 26 i f ( s c o r e < 3 && l e n g t h > 2) { 27 return Moede. Handling. udn ; 28 } 29 else { 30 return Moede. Handling. sam ; 31 } 32 33 } 34 } 30