Programmeringsprojekt, STS1

1. Inledning

Nedan följer ett antal större programmeringsuppgifter.

En av dessa uppgifter skalösas och senare presenteras på ett seminarium (se särskilda anvisningar för detta). Egna idéer till uppgifter är välkomna.

Uppgiften ska lösas igrupper om två eller tre personer. Det maximala antalet grupper som får välja en och samma uppgift är begränsat.

 

2. Redovisning, slutredovisning

En skriftlig rapport med programlistningar ska lämnas in i två exemplar 2 juni kl 10.15 till Mayank Saksena, postfacket på plan 4, hus 1, vid kopiatorerna. Anders och Mayank tilldelar varje grupp en seminarietid. Listan över seminarietider anslås senast 3 juni 10.15. Önskemål om en viss tid accepteras inte, annat än av mycket starka skäl, såsom exempelvis att någon vill undvika en viss tid pga. av en nära släktings studentexamen eller liknande. Den som lämnar sådana önskemål ska på begäran kunna visa dokument som styrker argumentet. Sådana önskemål ska lämnas på ett separat blad, fasthäftat först i båda exemplaren av den inlämnade rapporten.

Muntligt samarbete mellangrupper är tillåtet och rekommenderat, så länge olika uppgiftslösningar "inte liknar varandra". Samarbete med grupper som löser samma uppgift ska redovisas i rapporten.

I rapporten ska åtminstoneföljande punkter ingå:

Dessutom skaprogramlistningar lämnas in.

Rapporten får skrivas påsvenska eller engelska.

 

3. Redovisning, delredovisning

Vid en delredovisning ska en plan för programmet, som beskriver de viktigaste klasserna samt designöverväganden diskuteras gruppvis med Mayank med utgångspunkt från skriftliga underlag från varje grupp. Syftet med denna är att ge en organiserad handledning, som ska underlätta arbetet med att skapa ett bra projekt.

För delredovisningengäller:

4. Uppgiftslösningen

Lösningen ska spegla god programmeringssed för objektorienterad programmering, och ska på ett relevant sätt spegla klassbegreppet.

Du behöver inte använda en mer avancerad in och utmatning än den som ges av paketet extra.* annat än för de uppgifter där det uttryckligen anges att ett grafiskt eller mer avancerat användarsnitt ska användas. Du behöver heller inte kontrollera indata annat än i de uppgifter då detta anges som ett krav.

Du kan också göra din bildskärmshantering mycket enkel och mycket ful. Det är tillfyllest om skärmen skrivs om för varje drag i samband med spel, reservation i samband med bokning etc. som visas, om inte uppgiftstexten specificerar något annat.

Många uppgifter blir lättare att lösa eller, i vissa fall, kräver programspråkskonstruktioner som inte är centrala i kursen och som inte är detaljstuderade i undervisningen. Exempel på sådana konstruktioner är arrayer med fler dimensioner än en (såsom matriser) eller arrayer som innehåller objekt ur klasser. Inga av dessa konstruktioner är komplicerade, men en lässtund i Skansholm kan rekommenderas. Olika "exotiska" eller "märkliga" konstruktioner, som förvisso existerar i Java behövs inte för någon uppgift och rekommenderas inte heller.

Bestäm dig för en ambitionsnivå och håll dig till den. Att låta uppgiften växa volymmässigt ger dig inte några större meriter, att i stället göra ett dåligt arbete innebär att uppgiften måste kompletteras eller blir underkänd och skapar extra, onödiga problem.

 

5. Ett gott råd

Vi rekommenderar varmt att du diskuterar din lösningsstruktur (val av klasser, viktiga metoder och fält) med Mayank, innan du börjar koda större avsnitt. På så sätt kan du säkert undvika många strukturella problem med din lösning.

 

6. Om uppgiften blir för stor

Om du tycker att det känns som om uppgiften "växer" eller att du inte "rår på den", finns det möjligheter att "beskära uppgiften". Sådana beskärningar (eller förenklingar i formuleringen) ska göras i dialog med Mayank och ska noga dokumenteras. Att "inte hinna med" eller "chansa" och lämna in ofullständiga lösningar/rapporter är däremot inte acceptabelt. Anstånd med inlämningen kan inte heller beviljas, pga av seminarierna.

 

7. Uppgifter

Uppgifterna nedan är skissartat formulerade. Du kommer att själv vara tvungen att göra antaganden av olika slag. Dessa ska redovisas. Rimliga antaganden, som du kan förklara och motivera vid en fråga godkänns.

 

7.1 Egen uppgift

Välj själv en uppgift. Hangman är ett typiskt exempel på en lagom stor uppgift, som är ett lämpligt projekt, sålänge in och utmatningen sköts enkelt.

Diskutera gärna medAnders eller Mayank.

 

7.2 Fia med knuff (3 pers)

Implementera det gamla brädspelet "Fia med knuff" med en datormotståndare.

I spelplanen nedan har blå inte fått ut någon pjäs, medan Gul har fått ut tre varav en redan är i boet.


          000
          0r0
  G = 3   0rY    R = 3
          0r0             
          Rr0
0 0 0 0 0 0 0 0 0 Y 0 0
0 g g g g     y Y y y 0 
0 0 G 0 0 0 0 0 0 0 0 0
          0b0
          0b0
  B = 4   0b0     Y = 1
          0b0
          000  
          000
          0r0        
    

Reglerna är enkla: Plupparna för sig moturs, kan knuffa ut motståndarens pluppar, man får endast gå ut på en 6a. Man får slå ett extra slag på en 6a (dock högts tre gånger i rad). Den spelare som först får in sina pluppar i boet har vunnit.

Datormotståndaren behöver inte vara smart, utan ska enbart hålla sig till reglerna.

Människospelare (tre stycken) ska dock kunna välja vilken plupp de flyttar på, ta eller gå in i boet med.

Programmet utser vinnare samt håller reda på hur många pluppar som är inne.

För den ambitiöse:
  1. Skriv en snyggare bildhantering
  2. Gör en smart datormotståndare
  3. Låt datorn kunna spela för en två eller tre personer, beroende på hur många människor som vill spela.
  4. Programmet ser till att reglerna följs.

 

7.3 Platsbokning på SJ (2-3 beroende på ambitionsnivå)

Skriv ett program som hjälper SJ med platsbokning i en järnvägsvagn. När programmet startas ska användaren ange vilken vagn som ska bokas. (Systemet kan således enbart göra bokningar i en vagn i taget.) På skärmen ska bilden nedan (eller en liknande bild) ritas upp. Bokade platser ska sedan markeras på ett rimligt sätt.


--------------------------------------
| 1   5   9  13   |   17  21  25  29 |
| 2   6  10  14   |   18  22  26  30 |
|    Tyst kupé    | Nalle tillåten   |
| 3   7  11  17   |   19  23  26  31 |
| 4  10  12  18   |   20  24  28  32 |
--------------------------------------
    

Man bokar genom att fylla i ett eller flera platsnummer, eller genom att ange önskemål (såsom fönster mm) om platserna. Därefter ritas skärmen om med det aktuella bokningsläget. När man inte vill boka mer, skrivs en eller vid behov flera platsbiljetter ut (på bildskärmen) med ungefär följande utseende:

Platsbiljett
Sth - Göteborg 9.05
Plats 19
Nallekupé
Gång
    

 

7.4 Räkna med stora tal (2 pers)

Ta fram ett program som kan räkna med stora tal. Begränsningar, om de införs, ska ha sin utgångspunkt i radlängder vid inmatning eller dylikt, inte i lagringskapacitet i en viss variabler av en viss typ.

Programmet ska klara addition, subtraktion och multiplikation.

Exempel på dialog (användarens svar är understrukna):

Räknesätt: +
Tal 1: 87345171325167
Tal 2: 5319213411
87345171325167 + 5319213411 = 873457032465078

Ledning: Klassen Vector är värdatt studera.

 

7.5 Spelet Life (2 pers)

En familj av encelliga organismer lever i en platt (tvådimensionell) värld. Celler föds och dör enligt givna regler. Beroende på utgångsläget kan en koloni expandera, dö ut eller nå ett stabilt tillstånd.

Uppgiften består i att göra en simulator där man simulerar en godtycklig uppsättning celler i världen. I en tvådimensionell värld har celler (normalt) åtta platser för grannar. Du bör kunna hantera minst 20* 20 = 400 celler. Simuleringen bör skrivas ut på skärmen (på ett enkelt sätt) efter varje steg.

Levnadsregler för cellerna:

Några kul starttillstånd för en koloni:

*  *
 ****
*    *
* ** *
*    *
 ****
	    
Cheshirekatten från Alice i underlandet. Efter ett par generationer återstår den grinande munnen.



 *  
  *
***
	    
Glidare. Rör sig snett uppåt.


    *
    *             
*    *
*****
	    
Rymdskeppet. Rör sig i sidled.

 

7.6 Romerska årtal (2 pers)

Skriv ett program som omvandlar "siffertal" till romerska årtal och tvärtom. Årtalen ska kunna variera från 1 till 3999. Systemet ska reagera ordnat på inmatning av större årtal eller år 0.

Vill du konverteratill romerskt eller till arabiskt [r/a]? r
Årtal: 1990
1990 skrivs MCMXC
Vill du konvertera ett nytt tal [j/n]? n

De romerska talen skrivs I, V, X, L, C, D, M och motsvarar 1, 5, 10, 50, 100, 500, 1000. Kombinationer som IV betecknar 4, IX betyder 9, XC 90 etc. I övrigt adderas bokstäverna. Läs gärna mer, exempelvis i Nationalencyklopedin.

För den ambitiöse:
Låt programmet avgöra om det inmatade talet är romerskt eller ett tal (arabiskt). Denna utveckling är relativt enkel. Ledning: Titta på klassen String och/eller Skansholms paket extra.

 

7.7 Yahtzee

Implementera Yahtzee för en spelare. (Om ni vill spela flera stycken kan ni köra flera instanser av programmet.)

Spelbeskrivning

Mål
Få så hög poäng som möjligt!

Spelregler
  1. Yahtzee spelas i rundor (13 st). Se beskrivningen av en spelrunda nedan.
  2. Poängen bokförs löpande i ett formulär. Se exempel nedan.
  3. Varje poängkategori får endast användas en gång. Om man inte uppfyller kravet för att få poäng i en given kategori, får man 0 poäng där.
  4. Poängkategorierna delas in i två grupper: topp och botten. (Det är helt enkelt kategorierna i den övre respektive nedre delen av formuläret.)
  5. Bonus: när/om ens toppsumma överskrider 62 poäng får man en engångsbonus på 35 poäng, som bokförs i dedikerat fält på formuläret.
Spelrundan
Varje spelrunda går tillsom följer.
  1. Rulla 5 tärningar. Plocka bort alla oönskade tärningar, rulla om dessa. Rulla om på samma sätt en gång till, om du vill. Man får alltså rulla om maximalt 2 ggr.
  2. Tärningarnas utfall efter steg 1 kallar vi för denna rundas resultat. (Vi kan beskriva resultatet som en påse (bag) av tärningsutfall, det vill säga en mängd med repetitioner.)
  3. Välj en hittills ovald poängkategori för ditt resultat. Poängen bokförs på formuläret.

Poängkategorier och poäng
Så här beräknas poängenför resultat och kategori.

Ettor: 1 p per etta.
Tvåor: 2 p per tvåa.
o.s.v.
Sexor: 6 p per sexa.
Triss: resultatets summa, om det innehåller ett triss.
Fyrtal: resultatets summa, om det innehåller ett fyrtal.
Liten stege: 30 p om resultatet är {1, 2, 3, 4, 5}.
Stor stege: 40 p om resultatet är {2, 3, 4, 5, 6}.
Kåk: resultatets summa om det är en kåk, d.v.s. ett triss och ett par.
Yahtzee: 50 p om resultatet är ett femtal.
Chans: resultatets summa.

T.ex. skulle resultatet {3, 3, 3, 4, 6} ge 19 p som Triss, 0 p som Fyrtal, och 9 p som Treor.

Implementationstips

Man kan "rulla tärningarna" på t.ex. följande sätt. Tärningarnas utfall och antalet kvarstående omrullningar visas. Användaren kan välja vilka tärningar som ska rullas om.

--------------------------------------------------
6  3  5  6  6   (1 omrullning kvar)
Tärningar markerade för omrullning: 2, 3
 
1-5    markera/avmarkera respektive tärning
space  rulla
enter  välj poängkategori
--------------------------------------------------
    

I exemplet ovan skulle användaren troligen behålla 6:orna, för att satsa på någon av Sexor, Triss, Fyrtal, Yahtzee, Kåk eller Chans. Det beror förstås på vilka poängkategorier som var kvar.

Varje runda ska poängformuläret skrivas ut. Förslagsvis som följer.

--------------------
Ettor
Tvåor              4
Treor
Fyror
Femmor
Sexor
BONUS (topp > 62)
Toppsumma          4
--------------------
Triss             19
Fyrtal
Liten stege       30
Stor stege
Kåk
Yahtzee
Chans
Bottensumma       49
--------------------
Total poäng       53