Forside til eksamensprojekt

Størrelse: px
Starte visningen fra side:

Download "Forside til eksamensprojekt"

Transkript

1 Forside til eksamensprojekt OOPA/MGA- T-401 Sæt X i rubrikken under dit fag: Underviser: Jacob Nordfalk Eksamensform: Eksamensform kan ej vælges - er udelukkende individuel eksamen Enmandsprojekt: Gruppeprojekt Studienr: Studienr: Navn: Allan Hirsch Navn: Titel Android Boulder Dash Fortroligt Må anvendes i undervisningen Dato: Den studerendes underskrift Den studerendes underskrift kun ved

2 Formål...2 Afgrænsning...2 Applikations model:...2 Beskrivelse af aktiviteter og disses funktionalitet...3 Hoved menu (BoulderDash.java):...3 Help (HelpActivity.java):...3 High Score (HighScoreActivity.java):...4 Game (GameActivity.java):...5 GameView.java...5 Spilbaner...6 ControlButton.java...7 ScoreBoard...8 Lyd...9 Vibration...9 HighScore (Skrivning til fil):...9 Tastatur...10 Test...10 Konklusion:...10 Henvisninger og litteraturliste:...11 CD: Hvad er der på CD en:...11 Bilag:...11 KILDEKODE:...11 HighScoreActivity.java...11 BoulderDash.java...12 GameActivity.java...13 GameView.java...17 HelpActivity.java...31 ControlButton.java...32 game.xml...33 main.xml...34 strings.xml...35 AndroidManifest.xml...37 Boulderdash_help.html

3 Formål: Formålet med projektet er at lave en Android applikation, som gør brug af nogle af de emner gennemgået i kurset MGA (Mobil programmering på Google Android). Som projekt har jeg valgt at portere det gamle Commordore64 spil, Boulder Dash, til Android, og anvende nogle af de spændende muligheder Android tilbyder i spillet. Boulder Dash findes allerede som Java applet under open source på: (Se reference liste). Denne applet har jeg skrællet for spil-logik som således bliver brugt i Android Applikationen. Applikationen giver brugeren mulighed for at styre spilfiguren rundt, når der trykkes på spilkontrol knapperne. Spillet går i alt sin enkelthed ud på at navigere figuren rundt i miner og indsamle diamanter og undgå fjender. Undervejs samles der point, som både skrives til skærmen, men også til en highscore fil efter endt spil. Applikationen indeholder også diverse effekter, bl.a. lyd. Der implementeres også en hjælp funktionalitet, som forklarer spillet nærmere. Disse forskellige funktioner tilgås via en hovedmenu. Afgrænsning Spillet er kun implementeret med to levels for overskuelighedens skyld. Men flere levels kan nemt tilføjes ved at lave flere <string-array>-elementer i strings.xml som forklaret i afsnit Spilbaner. Spillet er implementeret uden mulighed for at pause og gemme et igangværende spil. Endvidere kan spillet kun spilles i portrait screenmode. Ligeledes er der kun implementeret to lyde, da de kun skal vise multimediemulighederne for lyd i et spil på Android. Applikations model: Android Applikationen er lavet som en app (applikation) med 4 aktiviteter. En hovedaktivitet (BolulderDash.java), som fungerer som hovedmenu og sikrer navigering til de 3 andre aktivitet i app en: Hoved menu (BoulderDash.java) o HighScoreActivity o HelpActivity o GameActivity. BoulderDash.java main.xml GameActivty.java HighScoreActivity.java HelpActivity.java Game.xml TextView.java WebView.java GameView.java TextView (ScoreBoard) Control Buttons (Fig. 1: Applikations model) 2

4 To af aktiviteterne (BoulderDash.java, GameActivity.java) har contentviews, som er konfigureret via xml, hvorimod highscoreactivity og HelpActivity har contentviews, der konfigureres programatisk i Java kode. Dette gøres for at demonstrere begge metoder til håndtering af Viewgroups og views, og fordi contentviews i disse sidste klasse er simple. Beskrivelse af aktiviteter og disses funktionalitet Hoved menu (BoulderDash.java): Hovedaktiviteten består af et TextView samt 3 knapper, og fungerer som hovedmenu for applikationen. Figur 2:Start menu (BoulderDash.java) TextViewet angiver spillets titel og knapperne navigerer videre til app ens andre aktiviteter ved at kalde med aktiviteternes respektive Intents i BoulderDash.onClick(). Komponenterne er grupperet i 2 LinearLayouts og et TableLayout, for at få stillet dem pænt op med luft til hinanden og til siderne (Se bilag: main.xml på side 34). Aktiviteterne registreres i Android manifest-filen. Help (HelpActivity.java): Forklarer spillet til brugeren. Aktiviteten er implementeret med et WebView som contentview, fordi det gør det meget nemt at vedligeholde og præsentere hjælpdokumentet. WebView help =new WebView(this); help.loadurl("file:///android_asset/boulderdash_help.htm"); LinearLayout help_layout= new LinearLayout(this); help_layout.addview(help,layoutparams.fill_parent,layoutparams.fill_parent); this.settitle("boulder Dash Help"); setcontentview(help_layout); (Udsnit: oncreate() i HelpActivity.java) Dokumentet kan således redigeres og vedligeholdes i et tekstredigeringsprogram, og herefter eksporteres som html dokument. Hermed kan man benytte styrkerne ved html til at præsentere hjælpen. Bl.a kan der vises billeder i dokumentet uden at skulle programmere en masse Java (se fig 3). Browserens scroll funktionalitet får man også med i købet. 3

5 Figur 3: udsnit af hjælp dokument Html dokumentet placeres i Assets mappen, som er pakket ind i.apk filen, hvorfra Applikationen læser det. Ulempen ved at bruge et WebView er, at det tager lidt tid at åbne siden, da det jo er en fuld browser, der startes op. Da hjælpen kun skal læses de første gange spillet spilles er dette acceptabelt. High Score (HighScoreActivity.java): Figur 4: udsnit af high score listen Her kan spilleren se de 5 højst opnåede scorer. Aktiviteten har et TextView som contentview. Denne aktivitets view er oprettet programmatisk i Java (se nedenfor) modsat de views, som er oprettet ved hjælp af xml. TextView highscore=new TextView(this); highscore.settext(readfile());//text is read here and inserted into textview highscore.setgravity(gravity.center); LinearLayout ll = new LinearLayout(this); ll.addview(highscore,layoutparams.fill_parent,layoutparams. WRAP_CONTENT); setcontentview(ll); (Udsnit fra oncreate() i HighScoreActivity.java) Android understøtter almindelig Java fil håndtering, så data læses fra en fil lokalt på telefonen ved først at finde mappen, dernæst filen - hvorefter der læses med en BufferedReader, der jo tillader at læse hele linier ad gangen. File privatmappe = this.getfilesdir(); thefile=new File(privatMappe,"HighScore.txt"); BufferedReader reader = new BufferedReader(new FileReader(theFile)); String line= ""; String tmp=""; while((line=reader.readline())!=null){ tmp=tmp+line+"\n"; reader.close(); return tmp; (Udsnit fra readfile() i HighScoreActivity.java) 4

6 Filens indhold returneres til TextViewet (highscore) i HighScoreActivitet.java som det præsenteres i fig 4. Skrivning til filen foregår i Game Aktiviteten. Game (GameActivity.java): Denne aktivitet er hjertet i app en. Grafikken renderes her, lydene spilles, spil info opdateres og spillet kontrolleres her ved tast på spilknapperne. ContentViewet er bygget op ved hjælp af forskellige viewgroups styret i game.xml (Bilag s.33). Yderst ligger et FrameView, som stabler de overliggende views på hinanden, hvilket gør at der kan lægges et view med gennemsigtig baggrund oven på selve spil-viewet. Dette gennemsigtige view indeholder et TextView, hvor forskellige spilinformationer skrives, bl.a. score, og i bunden af dette gennemsigtige view ses spilknapperne, som selv er gjort halv-gennemsigtige, så de ikke blokerer for grafikken i det underliggende lag. GameView.java Figur 5: GameActivity med Views i to lag Denne klasse sørger for at tegne grafikken. Spillet er som sagt fundet som open source på nettet, så selve spillogikken er ikke noget jeg selv har kodet, men blot tilrettet så det kan køre på Android. Et spil har ofte brug for at udnytte den fulde skærm. Derfor starter jeg med at fjerne titlebar og notification bar. Dette gøres i aktivitetens (GameActivity) oncreate() ved at give window manageren nogle Layout parametre, der fortæller, at jeg ønsker at bruge hele skærmen: requestwindowfeature(window.feature_no_title); getwindow().setflags(windowmanager.layoutparams.flag_fullscreen, WindowManager.LayoutParams.FLAG_FULLSCREEN); (oncreate() i GameActivity.java) 5

7 Figur 6: Et billede 15 bidder Grafikken skabes ud fra ét billede, som klippes i 15 mindre bidder. Hver bid er 20 * 20 pics, så ved hjælp af en for-løkke læses de ind i et Bitmap-array. // Break up source image into individual images // First, load the large image Bitmap sourceimage = BitmapFactory.decodeStream(getResources(). openrawresource(r.drawable.images)); // Now break it up into pieces img = new Bitmap[NUM_IMAGES]; for (int i=0; i<num_images; i++) { img[i] = cropsourceimage(sourceimage,imgcoord[i]); (loadimages() i GameView.java) Spilbaner Hvordan skabes spilbanerne så? Jo, i ressourcefilen strings.xml (Bilag s.35) bruger jeg en <string-array> (level_data_1) til at hente et kort af 20*20 tegn, der angiver, hvor Android skal tegne billede-bidderne på skærmen. <string-array name="level_data_1"> <item>\####################\</item> <item>\#p:::www:oo::#oooo+#\</item> <item>\#::::o.+:wo+:#o++oo#\</item> <item>\#:::ww.::::w:###:###\</item> <item>\#:...:w::o:::::::::#\</item> (string-array element i strings.xml) Ovenstående fortæller bl.a. at P tegner spillerfiguren (P) i øverste venstre hjørne, dog indenfor muren (#). Dette kort af tegn gemmes i en 2 dimensionel char-array (levelmap[][] i GameView.java), som hele tiden opdateres af spillogikken. Og det er dette array som ondraw() bruger til at tegne grafikken, når systemet kalder invalidate. protected void ondraw(canvas canvas) { for (int x = 0; x < X_DIMEN; x++) { for (int y = 0; y < Y_DIMEN; y++) { int index; for (index = 0; index < imgrep.length(); index++) { if (imgrep.charat(index) == levelmap[x][y]) { canvas.drawbitmap(img[index], (x * SQUARE_DIMEN) - shiftviewx, (y *SQUARE_DIMEN) + 40, null); (ondraw() i GameView.java) 6

8 Tegnene i array et oversættes til de rette bitmap-bidder ved hjælp af streng-værdien: private static final String imgrep = ".:#WMPO+*BFA][R"; (Erklæring af variabel i GameView.java) Ud fra index-tal i bitmap-array et kan Android nu opdatere canvas. if (imgrep.charat(index) == levelmap[x][y]) { canvas.drawbitmap(img[index], (x * SQUARE_DIMEN) - shiftviewx, (y *SQUARE_DIMEN) + 40, null); (Udsnit: ondraw() i GameView.java) Variablen shiftviewx bruges til at flytte grafikken, når spilleren bevæger sig længst ud til højre i spillet. Spillet er nemlig for stort til at være på skærmen i x-aksen, så det udersøges hvor stor skærmen er og spilgrafikken flyttes shiftviewx til venstre. Denne beregning foretages i kontrollen af spilleren: public boolean controls(int controlid, int scrwidth, int scrheight) (controls() i GameView.java) Udover spilfiguren har spillet også nogle skurke, såkaldte bots. Dem skal man undgå, og de styres af deres egen tråd. Den startes i GameActivity (botsthread), men er implementeret som indre klasse (GraphicsThread) i GameView.java, da tråden bruger lokale variabler og objekter fra denne klasse. Tråden er lavet til at holde styr på skurkene (Bots) og til at beregne bevægelser for spiller og faldende sten og diamanter, og det er her at levelmap-array et vedligeholdes, det vil sige opdateres med billede koordinater. Til at gøre alt dette, gør koden brug af forskellige lister og koordinat objekter, som jeg dog ikke vil omtale yderligere, da det er kode jeg har lånt fra open source. Dog skal det nævnes at postinvalidate() også kaldes herfra, og derfor er med til at animere grafikken. Denne tråd har også vist sig at skabe lidt problemer i forhold til at gemme spillet i forbindelse med aktivitets livscyklus (oncreate, onresume, onpause() etc.). Dette skyldes problemer med at synkronisere objekter, der gemmer spil-data, bl.a det meget omtalte levelmap array. Derfor er spillet implementeret uden mulighed for at pause og gemme spillet. Endvidere kan spillet kun spilles i portrait screenmode, da en vending af telefonen også vil kalde disse livscyklusmetoder. Skærmens orientering låses ved at tilføje nedenstående i manifest-filen: <activity android:name="org.games.boulderdash.gameactivity" android:screenorientation="portrait"> De andre aktiviteter kan dog godt læses i landscape mode. ControlButton.java For at implementere spilknapperne har jeg lavet min egen knapklasse ControlButton.java (Bilag s.32), nedarvet fra Button. Hver knap er udstyret med ID i ressource filen og dette ID smager jeg på i controlbutton s ondraw metode, og tegner så knappen i den rigtige retning ved hjælp af et path og paint object. Knappens Alpha-værdi sættes til 150 for at gøre den let gennemsigtig, så den kan placeres ovenpå spil-viewet. Nedenfor ses spil-figuren igennem én af knapperne (fig. 7). 7

9 Figur 7: gennmesigtige knapper ovenpå gameview'et I Game aktiviteten tilføjes knapperne en onclick lytter, som håndterer brugerens skærmtryk: private void setlisteners() { for (int i = 0; i < keys.length; i++) { final int t = i ; keys[i].setonclicklistener(new View.OnClickListener(){ public void onclick(view v) { thegame.controls(keys[t].getid(),width, height); scoreboard.settext(thegame.updatescore()); ); (setlisteners() i GameActivity.java) Knapperne tilføjes deres lyttere generisk, da det jo stort set er det samme de skal gøre. OnClick kalder controls() i GameView.java. Her beregnes retning og afstand for spilfiguren, og postinvalidate() kaldes for at tegne spillet igen. I controls() beregnes også om spilfiguren er kommet så langt til højre i banen, at denne del nu skal tegnes. Derfor kaldes controls() med skærmens vidde (width), så variablen shiftviewx kan beregnes, når ondraw() kaldes i GameView.java. Det vil så tegne den del af banen, der ikke er synlig. //move screen to right-side mode if(move.x>=(scrwidth/20)){ shiftviewx=400-scrwidth; //banen er 400 pics, da det er en 20*20 matrix //move screen back to initail mode if(move.x<=(20-(scrwidth/20))&&shiftviewx!=0){ shiftviewx=0; (fra controls() i GameView.java) ScoreBoard Scoren vedligeholdes også i denne metode (controls()), samt andre spilinformationer som brugeren kan se i TextView et øverst i skærmen: Figur 8: ScoreBoard 8

10 Lyd Der er også implementeret to lyde. En lyd, når spilfiguren dør og en anden lyd, når han samler en diamant op. Hver lyd har sin egen mediaplayer, som konstrueres, når Game aktiviteten starter op. diamondmp=mediaplayer.create(this, R.raw.diamond_sound); diamondmp.setvolume(0.5f, 0.5f); (Udsnit af oncreate() i GameActivity) Lydene kaldes henholdsvis fra controls() og run (), da det er her viden om de hændelser, som kræver lyd, opstår. Dette gøres ved at kalde playsound() i GameActivity med ressource id for lyden som parameter. Der ryddes op i livscyklus-metode ondestroy(), dvs at ressourcerne (mp3 lydene) frigives. Vibration Desuden er der også implementeret en vibrationseffekt, når spilleren dør. Vibrator v = (Vibrator) parent.getsystemservice(context.vibrator_service); v.vibrate(300); (Udsnit af run() i GameView.java) At få app en til at vibrere kræver, at der gives tilladelse til dette i Android manifestet: <uses-permission android:name="android.permission.vibrate"/> (Udsnit af AndroidManifest.xml) HighScore (Skrivning til fil): Når spillet lukkes lagres highscoren lokalt i en text fil: /data/data/org.games.boulderdash/highscore.txt Data sorteres og lagres i nedstigende rækkefølge i filen. Dette gøres ved at lagre data midlertidigt i en ArrayList, som så kan sorteres ved hjælp af statiske metoder i Collections klassen: if(newscore>0) ar.add(newscore);//add score Collections.sort(ar);//sorting the collection Collections.reverse(ar);//Descending order if(ar.size()>5)//only 5 scores ar.remove(ar.size() - 1);//so remove last one if(fw==null) fw = new FileWriter(theFile); (Udsnit af storehighscore() i GameActivity.java) Derefter skrives data ind i filen v.hj.a en filwriter. Forlades spillet i utide kaldes denne metode fra livcyklus-metode protected void onpause() { super.onpause(); try { storehighscore(thegame.getscore()); (onpause() i GameActivity.java) 9

11 Spillet kan enten lukkes ved at brugeren selv forlader aktiviteten, eller at spilfiguren dør. Dør figuren kaldes finish() på aktiviteten, som så gennemløber livcyklus metoderne og lukker aktiviteten. Det vil så være den foregående aktivitet, BoulderDash, som vises. if (playerdead) { //give a little pause before returning try { Thread.sleep(2000); catch (InterruptedException ex) { Logger.getLogger(GameView.class.getName()).log(Level.SEVERE, null, ex); parent.finish();//kill aktivity and return to menu. (Udsnit fra run() i GameView) Tastatur Spillet kan også styres ved hjælp af tastaturknapper, hvis sådan nogle er tilgængelige. Ellers bruges denne feature, når spillet testes i emulatoren. Dette er gjort muligt ved at registrere en onkeydown() lytter i GameActivity.java. Her smages på om det er en af pile-tasterne der er trykket på, og hvis det er tilfældet kaldes videre til gameview.controls() med knap ID. Test Applikationen er testet på: Emulatoren. Android version. 2.2 Android telefon: o HTC HERO med Android 2.1 o Sony Ericsson X10 Mini Pro med Android 2.1 Applikationen er testet ved at gennemføre spillet, og se at scoren bliver vist og beregnet, og anden spilinformation bliver opdateret. Spilleren bevæger sig som forventet, når der trykkes på spilknapperne. Grafikken flyttes i x-planet, når spilleren bevæger sig over i den usynlige del af spillet. Lydene gengives som de skal når der samles diamanter og når spillet slutter ved spilfigurs død. Ligeledes vibrerer telefonen også ved figurens død. Highscore-listen opdateres korrekt og viser de fem seneste scorer. Hjælp funktionaliteten virker også efter hensigten. Spillet bliver i portrait mode når telefonen vendes. Emulatorens piletaster virker også korrekt i forhold til navigering af spilfigur. Konklusion: Rapportens formål er nået. Boulder Dash kan nu spilles på Android platformen. Applikationen giver brugeren mulighed for at styre spilfiguren rundt, når der trykkes på spilkontrol knapperne. Der samles point, som både skrives til skærmen og til en highscore fil efter endt spil. Applikationen indeholder lyd og vibrerings- effekter. Hjælp funktionalitet, som forklarer spillet nærmere, er implementeret. De forskellige funktioner tilgås via en hovedmenu. 10

12 Henvisninger og litteraturliste: Bøger: Kildekode: CD: Hvad er der på CD en: Bilag: Hello Android, Ed Burnette. BOULDERDASH, Dave Koelle BoulderDash.apk. Rapporten. Boulderdash.zip (boulderdash som java applet). BoulderDash netbeans projekt. KILDEKODE: HighScoreActivity.java package org.games.boulderdash; import android.app.activity; import android.os.bundle; import android.view.gravity; import android.view.windowmanager.layoutparams; import android.widget.linearlayout; import android.widget.textview; import java.io.bufferedreader; import java.io.file; import java.io.filenotfoundexception; import java.io.filereader; import java.io.ioexception; import java.util.logging.level; import java.util.logging.logger; /** * AH */ public class HighScoreActivity extends Activity { private File thefile; /** Called when the activity is first created. public void oncreate(bundle icicle) { super.oncreate(icicle); try { this.settitle("high SCORE"); TextView highscore=new TextView(this); highscore.settext(readfile()); highscore.setpadding(0, 100, 0,0); highscore.setgravity(gravity.center); highscore.settextsize(30); LinearLayout ll = new LinearLayout(this); ll.addview(highscore,layoutparams.fill_parent,layoutparams.wrap_content); setcontentview(ll); 11

13 catch (FileNotFoundException ex) { Logger.getLogger(HighScoreActivity.class.getName()).log(Level.SEVERE, null, ex); catch (IOException ex) { Logger.getLogger(HighScoreActivity.class.getName()).log(Level.SEVERE, null, ex); public String readfile()throws FileNotFoundException, IOException{ File privatefolder = this.getfilesdir();//data/data/pakkenavn/filnavn thefile=new File(privateFolder,"HighScore.txt"); BufferedReader reader = new BufferedReader(new FileReader(theFile)); String line= ""; String tmp=""; while((line=reader.readline())!=null){ tmp=tmp+line+"\n"; reader.close(); return tmp; BoulderDash.java package org.games.boulderdash; import android.app.activity; import android.content.intent; import android.os.bundle; import android.view.view; import android.view.view.onclicklistener; import android.widget.button; /** * AH */ public class BoulderDash extends Activity implements OnClickListener{ /** Called when the activity is first created. public void oncreate(bundle icicle) { super.oncreate(icicle); setcontentview(r.layout.main); Button game=(button) findviewbyid(r.id.new_game); game.setonclicklistener(this); Button help=(button) findviewbyid(r.id.help_button); help.setonclicklistener(this); 12

14 Button highscore=(button) findviewbyid(r.id.highscore_button); highscore.setonclicklistener(this); /* Hovedmenu : navigering til andre funktioner i app'en */ public void onclick(view button) { Intent i=null; switch(button.getid()){ case R.id.help_button: i =new Intent(this, HelpActivity.class); break; case R.id.new_game: i =new Intent(this, GameActivity.class); break; case R.id.highscore_button: i =new Intent(this, HighScoreActivity.class); break; if(i!=null) startactivity(i); GameActivity.java package org.games.boulderdash; import android.app.activity; import android.app.alertdialog; import android.app.dialog; import android.content.dialoginterface; import android.media.mediaplayer; import android.os.bundle; import android.view.display; import android.view.keyevent; import android.view.view; import android.view.window; import android.view.windowmanager; import android.widget.textview; import java.io.bufferedreader; import java.io.file; import java.io.filenotfoundexception; import java.io.filereader; import java.io.filewriter; import java.io.ioexception; import java.io.printwriter; import java.util.arraylist; import java.util.collections; 13

15 import java.util.logging.level; import java.util.logging.logger; import org.games.boulderdash.gameview.graphicsthread; /** * AH */ public class GameActivity extends Activity { private static final String TAG= "BoulderDash"; private final View keys[] = new View[4]; private GameView thegame; public TextView scoreboard; private int width; private int height; MediaPlayer diamondmp; MediaPlayer explosionmp; GraphicsThread botthread;//thread controlling bots and such /** Called when the activity is first created. public void oncreate(bundle icicle) { super.oncreate(icicle); diamondmp=mediaplayer.create(this, R.raw.diamond_sound); diamondmp.setvolume(0.5f, 0.5f); explosionmp=mediaplayer.create(this, R.raw.explosion_sound); explosionmp.setvolume(0.5f, 0.5f); requestwindowfeature(window.feature_no_title); getwindow().setflags(windowmanager.layoutparams.flag_fullscreen, WindowManager.LayoutParams.FLAG_FULLSCREEN); setcontentview(r.layout.game); thegame =(GameView)findViewById(R.id.gameView); //textview øverst i skærmen der fungerer spil display scoreboard=(textview)findviewbyid(r.id.score_board); this.scoreboard.settext(thegame.updatescore()); //til at beregne hvornår spillen er uden for skærmen Display display = getwindowmanager().getdefaultdisplay(); width = display.getwidth(); height = display.getheight(); findviews(); //finding control buttons setlisteners(); //til at håndtere tastatur public boolean onkeydown(int keycode, KeyEvent event) { boolean bool= super.onkeydown(keycode, event); int direction=0; 14

16 switch(keycode){ case KeyEvent.KEYCODE_DPAD_UP: direction=r.id.up; break; case KeyEvent.KEYCODE_DPAD_DOWN: direction=r.id.down; break; case KeyEvent.KEYCODE_DPAD_LEFT: direction=r.id.left; break; case KeyEvent.KEYCODE_DPAD_RIGHT: direction=r.id.right; break; default: return bool; //delegerer videre til skærmknapperne thegame.controls(direction, width, height); //opdater spilinfo scoreboard.settext(thegame.updatescore()); return true; void playsound(int SoundId){ switch(soundid){ case R.raw.diamond_sound: diamondmp.start(); break; case R.raw.explosion_sound: explosionmp.start(); protected void onpause() { super.onpause(); try { storehighscore(thegame.getscore()); botthread.setactive(false);//releasing runnable catch (IOException ex) { Logger.getLogger(GameActivity.class.getName()).log(Level.SEVERE, null, protected void ondestroy() { super.ondestroy(); diamondmp.release();//releasing resources explosionmp.release(); 15

17 @Override protected void onresume() { super.onresume(); botthread = thegame.newthread(); botthread.start(); private void findviews() { keys[0]= findviewbyid(r.id.up); keys[1] = findviewbyid(r.id.right); keys[2] = findviewbyid(r.id.left); keys[3] = findviewbyid(r.id.down); private void setlisteners() { for (int i = 0; i < keys.length; i++) { final int t = i ; keys[i].setonclicklistener(new View.OnClickListener(){ public void onclick(view v) { thegame.controls(keys[t].getid(),width, height); scoreboard.settext(thegame.updatescore()); ); public void storehighscore(string thescore) throws IOException { BufferedReader reader = null; FileWriter fw=null ; File privatmappe = this.getfilesdir(); File thefile = new File(privatMappe, "HighScore.txt"); try { reader = new BufferedReader(new FileReader(theFile)); catch (FileNotFoundException ex) { fw = new FileWriter(theFile);//if no file, make one Logger.getLogger(GameActivity.class.getName()).log(Level.SEVERE, null, ex); String tmp= ""; String line = ""; ArrayList<Integer> ar = new ArrayList<Integer>(); if(reader!=null){ while ((line = reader.readline())!= null) { 16

18 ar.add(integer.parseint(line)); reader.close(); int newscore=integer.parseint(thescore); if(newscore>0) ar.add(newscore);//add score Collections.sort(ar);//sorting the collection Collections.reverse(ar);//Descending order if(ar.size()>5)//only 5 scores ar.remove(ar.size() - 1);//so remove last one if(fw==null) fw = new FileWriter(theFile); PrintWriter pw = new PrintWriter(fw); for (Integer val : ar) {//for each pw.println(val); fw.close(); GameView.java package org.games.boulderdash; import android.content.context; import android.graphics.bitmap; import android.graphics.bitmapfactory; import android.graphics.canvas; import android.graphics.paint; import android.graphics.picture; import android.view.motionevent; import android.view.view; import android.graphics.drawable.drawable; import android.os.vibrator; import android.util.attributeset; import android.util.log; import java.io.ioexception; import java.util.arraylist; import java.util.logging.level; import java.util.logging.logger; /** * AH */ public class GameView extends View { private final View keys[] = new View[1]; private float shiftviewx=0; 17

19 private float shiftviewy=0; boolean isalive; static boolean runthread; ArrayList<Coord> redraw = new ArrayList<Coord>(); //ArrayList sounds = new ArrayList(); private static final int SLEEP_DELAY = 1750; int maxtimer=1,timer,level; int score,accumulatedscore,scoreperdiamond=5,scoreperextradiamond=10; public static final int UP = 0; public static final int RIGHT = 1; public static final int DOWN = 2; public static final int LEFT = 3; // Game variables Coord coordplayer,coordexit; int numneededdiamonds,numfulfilleddiamonds; boolean leveldone,playeralmostdead,playerdead; // Arrays to handle input from APPLET tag String[] arrnumneededdiamonds,arrscoreperdiamond,arrscoreperextradiamond; int[] arrmaxtimer; String[] arrleveltitle,arrlevelauthor,arrimagefilename; // Image and icon data private Bitmap[] img; private static final int NUM_IMAGES = 15; private static final String imgrep = ".:#WMPO+*BFA][R";//string to set up map private String imagefilename = "images.gif"; private static int[][] imgcoord = {{ 0, 0,20,20, // Space { 20, 0,20,20, // Dirt { 40, 0,20,20, // Titanium Wall { 0,20,20,20, // Brick Wall { 20,20,20,20, // Magic Wall { 40,20,20,20, // Player { 0,40,20,20, // Rock { 20,40,20,20, // Diamond { 40,40,20,20, // Explosion { 0,60,20,20, // Butterfly { 20,60,20,20, // Firefly { 40,60,20,20, // Amoeba { 0,80,20,20, // Closed Exit { 20,80,20,20, // Open Exit { 40,80,20,20; // Robot (not programmed) // Map and level data private static final int X_DIMEN = 20; private static final int Y_DIMEN = 20; private static float SQUARE_DIMEN = 20; private char[][] levelmap; private int NUM_LEVELS; private String[][] leveldata; ArrayList <BotPosition> bots ; Drawable theimage; GameActivity parent; 18

20 public String updatescore(){ String scoreboardtxt="score: "+score+" "; scoreboardtxt=scoreboardtxt+"level: "+level+" / "+NUM_LEVELS; scoreboardtxt=scoreboardtxt+"\ndiamonds: "+numfulfilleddiamonds+" / "+(numfulfilleddiamonds<numneededdiamonds? numneededdiamonds:0); scoreboardtxt=scoreboardtxt+" Diamond Points: "+(numfulfilleddiamonds<numneededdiamonds? scoreperdiamond : scoreperextradiamond); return scoreboardtxt; public GameView(Context context, AttributeSet as) { super(context,as); parent=((gameactivity)context); loadimages(); // Get parameters from the HTML file String numlevels ="2";// getresources().getstring( R.string.levels); if (numlevels == null) return; NUM_LEVELS = Integer.parseInt(numlevels); leveldata = new String[NUM_LEVELS][Y_DIMEN]; arrnumneededdiamonds = getresources().getstringarray(r.array.needed_diamonds); arrscoreperdiamond = getresources().getstringarray(r.array.points_per_diamond); arrscoreperextradiamond = getresources().getstringarray(r.array.points_per_extra_diamond); arrmaxtimer = new int[num_levels]; arrleveltitle = new String[NUM_LEVELS]; arrlevelauthor = new String[NUM_LEVELS]; arrimagefilename = new String[NUM_LEVELS]; int[]level_mapping={r.array.level_data_1,r.array.level_data_2; for (int i=0; i<num_levels; i++) { for (int u=0; u<y_dimen; u++) { String level_data[]=getresources().getstringarray(level_mapping[i]); leveldata[i][u] =level_data[u]; arrleveltitle[i] = getresources().getstring(r.string.level_title_1); if (arrleveltitle[i] == null) arrleveltitle[i] = "Unnamed"; arrlevelauthor[i] = getresources().getstring(r.string.level_author_1); if (arrlevelauthor[i] == null) arrlevelauthor[i] = "Anonymous"; arrimagefilename[i] = getresources().getstring(r.string.imagefile_1); if (arrimagefilename[i] == null) arrimagefilename[i] = "images.gif"; 19

21 // Set up player variables coordplayer = new Coord(); coordexit = new Coord(); // Just in case someone forgets to define these, let's make them exist coordplayer.x = 2; coordplayer.y = 2; coordexit.x = 1; coordexit.y = 1; // Set up the map if(levelmap==null){ levelmap = new char[x_dimen][]; for (int i=0; i<x_dimen; i++) { levelmap[i] = new char[y_dimen]; else isalive=true; level = 1; setuplevel(level); private void setuplevel(int level) { /* if(parent.scoreboard!=null) parent.scoreboard.settext(updatescore()); */ numneededdiamonds = Integer.parseInt(arrNumNeededDiamonds[level-1]); scoreperdiamond = Integer.parseInt(arrScorePerDiamond[level-1]); scoreperextradiamond = Integer.parseInt(arrScorePerExtraDiamond[level-1]); /* Set up the level */ shiftviewx=0; leveldone = false; playeralmostdead = false; playerdead = false; bots = new ArrayList<BotPosition>(); numfulfilleddiamonds = 0; for (int y=0; y<y_dimen; y++) { for (int x=0; x<x_dimen; x++) { levelmap[x][y] = leveldata[level-1][y].charat(x); drawcoord(x,y); if ((levelmap[x][y] == '[') (levelmap[x][y] == ']')) { coordexit.x = x; coordexit.y = y; else if (levelmap[x][y] == 'P') { coordplayer.x = x; coordplayer.y = y; else if ((levelmap[x][y] == 'B') (levelmap[x][y] == 'F')) { int dir = (levelmap[x][y] == 'F')?0:1; 20

22 BotPosition botpos = new BotPosition(x,y,1,dir); bots.add(botpos); private void loadimages() { // Break up source image into individual images // First, load the large image Bitmap sourceimage = BitmapFactory.decodeStream(getResources().openRawResource( R.drawable.images)); // Now break it up into pieces img = new Bitmap[NUM_IMAGES]; for (int i=0; i<num_images; i++) { img[i] = cropsourceimage(sourceimage,imgcoord[i]); private Bitmap cropsourceimage(bitmap simage, int[] icoord){ //then Crop the obtained 'bitmap' Bitmap cropedbitmap= Bitmap.createBitmap(sImage,iCoord[0],iCoord[1],iCoord[2],iCoord[3]); return protected void ondraw(canvas canvas) { for (int x = 0; x < X_DIMEN; x++) { for (int y = 0; y < Y_DIMEN; y++) { int index; for (index = 0; index < imgrep.length(); index++) { if (imgrep.charat(index) == levelmap[x][y]) { canvas.drawbitmap(img[index], (x * SQUARE_DIMEN) - shiftviewx, (y * SQUARE_DIMEN) + 40, null); public boolean controls(int controlid, int scrwidth, int scrheight) { if (playeralmostdead) { return false; 21

23 Coord delta = new Coord(); Coord delta2 = new Coord(); Coord move = new Coord(); Coord move2 = new Coord(); boolean validmove = false; // Interpret the keycode if (controlid == R.id.up) { delta.x = 0; delta.y = -1; else if (controlid == R.id.right) { delta.x = 1; delta.y = 0; else if (controlid == R.id.down) { delta.x = 0; delta.y = 1; else if (controlid == R.id.left) { delta.x = -1; delta.y = 0; // Make move relative to player move.x = coordplayer.x + delta.x; move.y = coordplayer.y + delta.y; //move screen to right-side mode if(move.x>=(scrwidth/20)){ shiftviewx=400-scrwidth; //move screen back to initail mode if(move.x<=(20-(scrwidth/20))&&shiftviewx!=0){ shiftviewx=0; // Range checking on the move if (move.x < 0) { move.x = 0; else if (move.x > X_DIMEN) { move.x = X_DIMEN; if (move.y < 0) { move.y = 0; else if (move.y > Y_DIMEN) { move.y = Y_DIMEN; // Create a "look-ahead" position delta2.x = delta.x*2; delta2.y = delta.y*2; move2.x = coordplayer.x + delta2.x; move2.y = coordplayer.y + delta2.y; // Moving into an empty space? "I'll allow it!" -- Mills Lane if ((levelmap[move.x][move.y] == '.') (levelmap[move.x][move.y] == ':')) { if (levelmap[move.x][move.y] == '.') { redraw(move); // SPACE sound else { redraw(move); // DIRT sound validmove = true; else // Pushing a rock? if ((levelmap[move.x][move.y] == 'O') && (move2.y!= move.y-1)) { if (((move2.x >= 0) && (move2.x <= X_DIMEN)) && 22

24 ((move2.y >= 0) && (move2.y <= Y_DIMEN))) { if (levelmap[move2.x][move2.y] == '.') { // "look-ahead" is an empty space. Move the rock. levelmap[move2.x][move2.y] = levelmap[move.x][move.y]; redraw(move2); redraw(move); validmove = true; else // Grabbing a Diamond? // Add one to the Number of Fulfilled Diamonds, // and see if the exit should be opened if (levelmap[move.x][move.y] == '+') { numfulfilleddiamonds++; score += (numfulfilleddiamonds<numneededdiamonds? scoreperdiamond : scoreperextradiamond); updatescore(); redraw(move); parent.playsound(r.raw.diamond_sound); if (numfulfilleddiamonds == numneededdiamonds) { levelmap[coordexit.x][coordexit.y] = '['; redraw(coordexit); validmove = true; else // If moving into an exit, make sure it's open! if (levelmap[move.x][move.y] == '[') { redraw(move); validmove = true; if (validmove) { levelmap[move.x][move.y] = 'P'; levelmap[coordplayer.x][coordplayer.y] = '.'; drawcoord(coordplayer.x,coordplayer.y); coordplayer.x = move.x; coordplayer.y = move.y; // Redraw coordinates that need to be redrawn redrawcoords(); // Is the level over? if ((coordplayer.x == coordexit.x) && (coordplayer.y == coordexit.y)) { leveldone = true; // All done with the level! Give a little pause... try { Thread.sleep(SLEEP_DELAY); catch (Exception e) { Log.e("CONTROLS()", e.getmessage()); accumulatedscore = score; if (level+1 < NUM_LEVELS+1) { level++; 23

25 else { level = 1; setuplevel(level); return public boolean ontouchevent(motionevent event) { if (event.getaction()!= MotionEvent.ACTION_DOWN) return super.ontouchevent(event); // SQUARE_DIMEN = - event.getx(); //y = - event.getx()/square_dimen; Log.d("onTouchEvent", "ontouchevent: x " + event.getx() +"ontouchevent: y "+ event.gety()); // postinvalidate(); return true; public void drawcoord(int x, int y) { int index; for (index=0; index<imgrep.length(); index++) { if (imgrep.charat(index) == levelmap[x][y]) { postinvalidate();//redraw canvas public void redrawcoords() { // Redraw any coordinates that should be redrawn try { for (int i=0; i<redraw.size(); i++) { Coord display = (Coord)redraw.get(i); drawcoord(display.x,display.y); catch (Exception e) { Log.e("REDRAWCOORDS()", e.getmessage()); redraw.clear(); public void redraw(coord coord) { redraw.add(coord); 24

26 GraphicsThread newthread() { return new GraphicsThread(); public String getscore(){ return score+""; //implicit cast to String public class GraphicsThread extends Thread { public boolean active=true; public GraphicsThread(){ super("graphics thread"); public void setactive(boolean bool){ public void run() { // This will take care of animation boolean botsmash,rocksmash,amoebasmash,explosionsquenched=false; Coord smashcoord = new Coord(); char me = '.'; while (this.isalive() && active) { if (playeralmostdead && explosionsquenched) { for (int y=y_dimen-2; (y>=0) && (explosionsquenched); y--) { for (int x=0; (x<x_dimen) && (explosionsquenched); x++) { if (levelmap[x][y] == '*') { explosionsquenched = false; if (explosionsquenched) { playeralmostdead = false; playerdead = true; explosionsquenched = false; for (int y=y_dimen-2; y>=0; y--) { for (int x=0; x<x_dimen; x++) { botsmash = false; rocksmash = false; amoebasmash = false; // Is this item smashed by amoeba? if (((y-1 > 0) && (levelmap[x][y-1] == 'A')) ((x+1 < X_DIMEN) && (levelmap[x+1][y] == 'A')) ((y+1 < Y_DIMEN) && (levelmap[x][y+1] == 'A')) ((x-1 > 0) && (levelmap[x-1][y] == 'A')) && ((levelmap[x][y] == 'B') (levelmap[x][y] == 'F'))) { 25

27 amoebasmash = true; smashcoord = new Coord(x,y); // Quench all explosions if (levelmap[x][y] == '*') { levelmap[x][y] = '.'; redraw(new Coord(x,y)); explosionsquenched = true; else // If, for any reason, the player is dead, end Game // Do this AFTER the explosions take place if (playerdead) { //give a little pause before returning try { Thread.sleep(2000); catch (InterruptedException ex) { Logger.getLogger(GameView.class.getName()).log(Level.SEVERE, null, ex); parent.finish();//kill aktivity and return to menu. // Is the player standing next to a bot? if (levelmap[x][y] == 'P') { if (((y-1 > 0) && ((levelmap[x][y-1] == 'B') (levelmap[x][y-1] == 'F'))) ((x+1 < X_DIMEN) && ((levelmap[x+1][y] == 'B') (levelmap[x+1][y] == 'F'))) ((y+1 < Y_DIMEN) && ((levelmap[x][y+1] == 'B') (levelmap[x][y+1] == 'F'))) ((x-1 > 0) && ((levelmap[x-1][y] == 'B') (levelmap[x-1][y] == 'F')))) { botsmash = true; smashcoord = new Coord(x,y); playeralmostdead = true; else // Work with rocks and diamonds if ((levelmap[x][y] == 'O') (levelmap[x][y] == '+') (amoebasmash botsmash)) { if (levelmap[x][y] == 'O') { me = 'O'; else if (levelmap[x][y] == '+') { me = '+'; else { me = '?'; // Gravity first... if ((me!= '?') && (levelmap[x][y+1] == '.')) { levelmap[x][y+1] = me; levelmap[x][y] = '.'; redraw(new Coord(x,y)); redraw(new Coord(x,y+1)); //parent.playsound(r.raw.boing); if ((y+2 < Y_DIMEN) && ((levelmap[x][y+2] == 'B') (levelmap[x][y+2] == 'F') (levelmap[x][y+2] == 'P'))) { rocksmash = true; smashcoord = new Coord(x,y+2); 26

28 else //... then handle stack collapsing if ((me!= '?') && ((levelmap[x][y+1] == 'O') (levelmap[x][y+1] == '+'))) { if ((levelmap[x+1][y+1] == '.') && (levelmap[x+1][y] == '.')) { levelmap[x+1][y+1] = me; levelmap[x][y] = '.'; redraw(new Coord(x,y)); redraw(new Coord(x+1,y+1)); if ((y+2 < Y_DIMEN) && ((levelmap[x+1][y+2] == 'B') && (levelmap[x+1][y+2] == 'F') (levelmap[x+1][y+2] == 'P'))) { rocksmash = true; smashcoord = new Coord(x+1,y+2); else if ((levelmap[x-1][y+1] == '.') && (levelmap[x-1][y] == '.')) { levelmap[x-1][y+1] = me; levelmap[x][y] = '.'; redraw(new Coord(x,y)); redraw(new Coord(x-1,y+1)); if ((y+2 < Y_DIMEN) && ((levelmap[x-1][y+2] == 'B') && (levelmap[x-1][y+2] == 'F') (levelmap[x-1][y+2] == 'P'))) { rocksmash = true; smashcoord = new Coord(x-1,y+2); // Smash a butterfly, fly, or player label1: if ((botsmash amoebasmash rocksmash) && ((levelmap[smashcoord.x][smashcoord.y] == 'B') (levelmap[smashcoord.x][smashcoord.y] == 'F') (levelmap[smashcoord.x][smashcoord.y] == 'P'))) { boolean diamond = (levelmap[smashcoord.x][smashcoord.y] == 'B')?true:false; if (levelmap[smashcoord.x][smashcoord.y] == 'P') { if (botsmash rocksmash) { playeralmostdead = true; parent.playsound(r.raw.explosion_sound); Vibrator v = (Vibrator) parent.getsystemservice(context.vibrator_service); v.vibrate(300); else break label1; for (int i=smashcoord.x-1;i<=smashcoord.x+1;i++) { for (int u=smashcoord.y-1;u<=smashcoord.y+1;u++) { if ((levelmap[i][u] == '.') (levelmap[i][u] == ':') (levelmap[i][u] == 'W') (levelmap[i][u] == 'M') (levelmap[i][u] == '+') (levelmap[i][u] == 'A') ((i==smashcoord.x) && (u==smashcoord.y-1)) ((i==smashcoord.x) && (u==smashcoord.y)) && (i > 0) && (i < X_DIMEN) && (u > 0) && (u < Y_DIMEN)) { if (diamond) { levelmap[i][u]='+'; else { levelmap[i][u]='*'; redraw(new Coord(i,u)); for (int b=0; b<bots.size(); b++) { BotPosition bot = (BotPosition)bots.get(b); if ((bot.x == smashcoord.x) && (bot.y == smashcoord.y)) { bots.remove(b); 27

29 '+'))) { // Go into a magic wall if ((levelmap[x][y] == 'M') && (y > 1) && ((levelmap[x][y-1] == 'O') (levelmap[x][y-1] == if (levelmap[x][y+1] == '.') { if (levelmap[x][y-1] == 'O') { levelmap[x][y+1] = '+'; redraw(new Coord(x,y+1)); else { levelmap[x][y+1] = 'O'; redraw(new Coord(x,y+1)); levelmap[x][y-1] = '.'; redraw(new Coord(x,y-1)); // Grow the amoeba if (levelmap[x][y] == 'A') { if (timer >= maxtimer) { if (Math.random() < 0.10) { int dx=0,dy=0; if (Math.random() < 0.5) { dx = (int)((math.round(math.random()*2))-1); dy = 0; else { dy = (int)((math.round(math.random()*2))-1); dx = 0; // Spread it only to places that are empty or have dirt if ((x+dx < X_DIMEN) && (x+dx > 0) && (y+dy < Y_DIMEN) && (y+dy > 0)) { if ((levelmap[x+dx][y+dy] == '.') (levelmap[x+dx][y+dy] == ':')) { levelmap[x+dx][y+dy] = 'A'; redraw(new Coord(x+dx,y+dy)); // for // for // Move any Fireflies clockwise, and Butterflies counterclockwise if (timer >= maxtimer) { for (int b = 0; b < bots.size(); b++) { BotPosition bot = (BotPosition)bots.get(b); Coord c = new Coord(bot.x,bot.y); if (bot.heading == UP) { if ((bot.direction == UP) && (levelmap[bot.x+1][bot.y] == '.')) { bot.x++; bot.heading = RIGHT; else if ((bot.direction == RIGHT) && (levelmap[bot.x-1][bot.y] == '.')) { 28

30 bot.x--; bot.heading = LEFT; else if (levelmap[bot.x][bot.y-1] == '.') { bot.y--; else { bot.heading = DOWN; if (bot.heading == RIGHT) { if ((bot.direction == UP) && (levelmap[bot.x][bot.y+1] == '.')) { bot.y++; bot.heading = DOWN; else if ((bot.direction == RIGHT) && (levelmap[bot.x][bot.y-1] == '.')) { bot.y--; bot.heading = UP; else if (levelmap[bot.x+1][bot.y] == '.') { bot.x++; else { bot.heading = LEFT; if (bot.heading == DOWN) { if ((bot.direction == UP) && (levelmap[bot.x-1][bot.y] == '.')) { bot.x--; bot.heading = LEFT; else if ((bot.direction == RIGHT) && (levelmap[bot.x+1][bot.y] == '.')) { bot.x++; bot.heading = RIGHT; else if (levelmap[bot.x][bot.y+1] == '.') { bot.y++; else { bot.heading = UP; if (bot.heading == LEFT) { if ((bot.direction == UP) && (levelmap[bot.x][bot.y-1] == '.')) { bot.y--; bot.heading = UP; else if ((bot.direction == RIGHT) && (levelmap[bot.x][bot.y+1] == '.')) { bot.y++; bot.heading = DOWN; else if (levelmap[bot.x-1][bot.y] == '.') { bot.x--; else { bot.heading = RIGHT; bots.set(b,bot); 29

31 if ((bot.x!= c.x) (bot.y!= c.y)) { levelmap[c.x][c.y] = '.'; levelmap[bot.x][bot.y] = (bot.direction==0)?'f':'b'; redraw(new Coord(c.x,c.y)); redraw(new Coord(bot.x,bot.y)); // timer // Check if amoeba is suffocated boolean amoebasuffocated = true; for (int i=1; i<x_dimen-1 && amoebasuffocated; i++) { for (int u=1; u<y_dimen-1 && amoebasuffocated; u++) { if (levelmap[i][u] == 'A') { if ((levelmap[i][u-1] == '.') (levelmap[i][u-1] == ':') (levelmap[i-1][u] == '.') (levelmap[i-1][u] == ':') (levelmap[i][u+1] == '.') (levelmap[i][u+1] == ':') (levelmap[i+1][u] == '.') (levelmap[i+1][u] == ':')) { amoebasuffocated = false; // If the amoeba is suffocated, convert all amoeba into diamonds if (amoebasuffocated) { for (int i=1; i<x_dimen-1; i++) { for (int u=1; u<y_dimen-1; u++) { if (levelmap[i][u] == 'A') { levelmap[i][u] = '+'; redraw(new Coord(i,u)); redrawcoords(); if (timer >= maxtimer) { timer = 0; timer++; try { Thread.sleep(150); catch (InterruptedException e) { Log.e("RUN()", e.getmessage()); // while // run 30

32 class Coord { int x,y; public Coord() { x = 0; y = 0; public Coord(int x, int y) { this.x = x; this.y = y; class BotPosition { int x,y; int heading,direction; public BotPosition() { x = 0; y = 0; heading = 1; direction = 0; public BotPosition(int x, int y, int heading, int direction) { this.x = x; this.y = y; this.heading = heading; this.direction = direction; HelpActivity.java package org.games.boulderdash; import android.app.activity; import android.os.bundle; import android.view.viewgroup.layoutparams; import android.webkit.webview; import android.widget.linearlayout; /** * AH */ public class HelpActivity extends Activity { /** Called when the activity is first created. public void oncreate(bundle icicle) { super.oncreate(icicle); WebView help =new WebView(this); //læser filen lokalt fra telefon help.loadurl("file:///android_asset/boulderdash_help.htm"); 31

33 LinearLayout help_layout= new LinearLayout(this); help_layout.addview(help,layoutparams.fill_parent,layoutparams.fill_parent); this.settitle("boulder Dash Help"); setcontentview(help_layout); ControlButton.java package org.games.boulderdash.util; import org.games.boulderdash.r; import android.content.context; import android.graphics.canvas; import android.graphics.color; import android.graphics.paint; import android.graphics.path; import android.util.attributeset; import android.util.log; import android.widget.button; /** * AH */ public class controlbutton extends Button{ public controlbutton(context context, AttributeSet as ){ super(context, as); protected void ondraw(canvas canvas) { super.ondraw(canvas); int h=this.getheight(); int w=this.getwidth(); Paint paint= new Paint(); paint.setantialias(true); paint.setstyle(paint.style.fill); paint.setstrokewidth(2); paint.setcolor(color.red); paint.setalpha(150); Path path = new Path(); int id =this.getid(); switch(id){ case R.id.up: path.moveto(w/2, 0); path.lineto(w, h); path.lineto(0, h); break; case R.id.right: 32

34 path.moveto(0, 0); path.lineto(w, h/2); path.lineto(0, h); break; case R.id.left: path.moveto(0, h/2); path.lineto(w, h); path.lineto(w, 0); break; case R.id.down: path.moveto(0, 0); path.lineto(w/2, h); path.lineto(w, 0); break; default: path.moveto(0, 0); path.lineto(w, 0); path.lineto(w, h); path.lineto(0, h); paint.setcolor(color.black); paint.setalpha(0); path.close(); canvas.drawpath(path, paint); game.xml <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android=" android:layout_width="fill_parent" android:layout_height="fill_parent" > <org.games.boulderdash.gameview android:layout_width="wrap_content" android:layout_height="wrap_content" > </org.games.boulderdash.gameview> <LinearLayout android:orientation="vertical" android:layout_height="fill_parent" android:layout_width="fill_parent" > <TextView android:layout_height="wrap_content" android:layout_width="fill_parent" android:layout_gravity="center" /> </LinearLayout> <TableLayout 33

35 34 android:gravity="bottom" android:layout_width="fill_parent" android:layout_height="fill_parent" android:stretchcolumns="*" > <TableRow android:gravity="center" > <org.games.boulderdash.util.controlbutton </org.games.boulderdash.util.controlbutton> </TableRow> <TableRow android:gravity="center" > <org.games.boulderdash.util.controlbutton > </org.games.boulderdash.util.controlbutton> <org.games.boulderdash.util.controlbutton android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gravity="center" > </org.games.boulderdash.util.controlbutton> <org.games.boulderdash.util.controlbutton android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gravity="center" > </org.games.boulderdash.util.controlbutton> <org.games.boulderdash.util.controlbutton > </org.games.boulderdash.util.controlbutton> </TableRow> <TableRow android:gravity="center" > <org.games.boulderdash.util.controlbutton > </org.games.boulderdash.util.controlbutton> </TableRow> </TableLayout> </FrameLayout> main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=" android:layout_height="fill_parent" android:layout_width="fill_parent"

36 android:padding="15dip" android:orientation="horizontal"> <LinearLayout android:orientation="vertical" android:layout_height="wrap_content" android:layout_width="fill_parent" android:layout_gravity="center" android:paddingleft="20dip" android:paddingright="20dip"> <TextView android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_gravity="center" android:layout_marginbottom="20dip" android:textsize="24.5sp" /> <TableLayout android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_gravity="center" android:stretchcolumns="*"> <TableRow> <Button /> </TableRow> <TableRow> <Button /> </TableRow> <TableRow> <Button /> </TableRow> </TableLayout> </LinearLayout> </LinearLayout> strings.xml <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">boulder Dash</string> <string name="main_title">android Boulder Dash</string> <string name="highscore_label">high Score</string> <string name="new_game_label">new Game</string> <string name="help_label">help</string> <string name="exit_label">exit</string> <string name="help_title">about Android Boulder Dash</string> <string name="levels">10</string> <string name="level_title_1">the Caverns Await</string> <string name="level_author_1">dave Koelle</string> 35

Gode praksisser og arkitekturer i Android-programmering. Android - praksisser og arkitekturer Copyright Lund & Bendsen A/S

Gode praksisser og arkitekturer i Android-programmering. Android - praksisser og arkitekturer Copyright Lund & Bendsen A/S Gode praksisser og arkitekturer i Android-programmering 1 Om oplægsholderen Jacob Nordfalk nordfalk@lundogbendsen.dk Instruktør for Lund&Bendsen Ekstern lektor på IHK Underviser i Java SE, Java EE, Webserverprogrammering,

Læs mere

Løsning af skyline-problemet

Løsning af skyline-problemet Løsning af skyline-problemet Keld Helsgaun RUC, oktober 1999 Efter at have overvejet problemet en stund er min første indskydelse, at jeg kan opnå en løsning ved at tilføje en bygning til den aktuelle

Læs mere

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

I profil-feltet kan imastra-kunder vælge om upload skal ske ligesom filerne var indsendt til mailboksen eller Upload fil Upload fil skal ses som et alternativ til at indsende tællefiler vedhæftet til mails Upload fil kan være en hurtigere og mere håndholdt måde at få data ind i Mastra på. Man starter med via Gennemse

Læs mere

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

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 3 DM502 Forelæsning 3 Indlæsning fra tastatur Udskrift til skærm Repetition Beregning af middelværdi Gentagelse med stop-betingelse (while) Heltalsdivision Division med nul Type-casting ( (double) ) Betinget

Læs mere

DM01 DM01. 3. Obl. Afl. Jacob Christiansen, 130282, jacob.ch@mail.tdcadsl.dk. D12, Elias 18/3-2003. Side 1 af 11

DM01 DM01. 3. Obl. Afl. Jacob Christiansen, 130282, jacob.ch@mail.tdcadsl.dk. D12, Elias 18/3-2003. Side 1 af 11 DM01 DM01 3. Obl. Afl. Jacob Christiansen, 130282, jacob.ch@mail.tdcadsl.dk D12, Elias 18/3-2003 Side 1 af 11 DM01 Indholdsfortegnelse: BILAG:...2 1 FORMÅL:...3 2 KLASSER:...4 2.1 DILEMMA:...4 2.1.1 METODER:...4

Læs mere

Portal Registration. Check Junk Mail for activation . 1 Click the hyperlink to take you back to the portal to confirm your registration

Portal Registration. Check Junk Mail for activation  . 1 Click the hyperlink to take you back to the portal to confirm your registration Portal Registration Step 1 Provide the necessary information to create your user. Note: First Name, Last Name and Email have to match exactly to your profile in the Membership system. Step 2 Click on the

Læs mere

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

Software Construction 1 semester (SWC) Spørgsmål 1 Spørgsmål 1 Objekter #1 Giv en kort præsentation af begrebet objekt, samt hvorledes du erklærer(declare), opretter(create) og bruger objekter Du kan beskrive o Datatyper o Variable / Instans variable /

Læs mere

Serialization i Java

Serialization i Java Serialization i Java Tutorial lavet af Jákup W. Hansen TSU 2006 1.semester 06.novemter 2006 Hvad er Serialization? I vores tekstbog Objects First with Java bliver denne del af Java ikke gennemgået. Men

Læs mere

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

AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007 AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007 Opgavebesvarelsen skal afleveres som enten en printerudskrift eller som et passende dokument sendt via email til fjj@noea.dk. Besvarelsen skal

Læs mere

how to save excel as pdf

how to save excel as pdf 1 how to save excel as pdf This guide will show you how to save your Excel workbook as PDF files. Before you do so, you may want to copy several sheets from several documents into one document. To do so,

Læs mere

Skriftlig eksamen i Datalogi

Skriftlig eksamen i Datalogi Roskilde Universitetscenter side 1 af 9 sider Skriftlig eksamen i Datalogi Modul 1 Vinter 1999/2000 Opgavesættet består af 6 opgaver, der ved bedømmelsen tillægges følgende vægte: Opgave 1 5% Opgave 2

Læs mere

Project Step 7. Behavioral modeling of a dual ported register set. 1/8/ L11 Project Step 5 Copyright Joanne DeGroat, ECE, OSU 1

Project Step 7. Behavioral modeling of a dual ported register set. 1/8/ L11 Project Step 5 Copyright Joanne DeGroat, ECE, OSU 1 Project Step 7 Behavioral modeling of a dual ported register set. Copyright 2006 - Joanne DeGroat, ECE, OSU 1 The register set Register set specifications 16 dual ported registers each with 16- bit words

Læs mere

IBM Network Station Manager. esuite 1.5 / NSM Integration. IBM Network Computer Division. tdc - 02/08/99 lotusnsm.prz Page 1

IBM Network Station Manager. esuite 1.5 / NSM Integration. IBM Network Computer Division. tdc - 02/08/99 lotusnsm.prz Page 1 IBM Network Station Manager esuite 1.5 / NSM Integration IBM Network Computer Division tdc - 02/08/99 lotusnsm.prz Page 1 New esuite Settings in NSM The Lotus esuite Workplace administration option is

Læs mere

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

University of Southern Denmark Syddansk Universitet. DM503 Forelæsning 11 DM503 Forelæsning 11 Generics Pakker Exceptions Indhold Generics Nedarvning og Generics Generics Nedarvning og Generics Husk Box fra sidst Generics public class Box {! private T object;! public void

Læs mere

StarWars-videointro. Start din video på den nørdede måde! Version: August 2012

StarWars-videointro. Start din video på den nørdede måde! Version: August 2012 StarWars-videointro Start din video på den nørdede måde! Version: August 2012 Indholdsfortegnelse StarWars-effekt til videointro!...4 Hent programmet...4 Indtast din tekst...5 Export til film...6 Avanceret

Læs mere

DET KONGELIGE BIBLIOTEK NATIONALBIBLIOTEK OG KØBENHAVNS UNIVERSITETS- BIBLIOTEK. Index

DET KONGELIGE BIBLIOTEK NATIONALBIBLIOTEK OG KØBENHAVNS UNIVERSITETS- BIBLIOTEK. Index DET KONGELIGE Index Download driver... 2 Find the Windows 7 version.... 2 Download the Windows Vista driver.... 4 Extract driver... 5 Windows Vista installation of a printer.... 7 Side 1 af 12 DET KONGELIGE

Læs mere

Eksempel: Skat i år 2000

Eksempel: Skat i år 2000 Kursus 02199: Programmering afsnit 2.1-2.7 Anne Haxthausen IMM, DTU 1. Værdier og typer (bl.a. char, boolean, int, double) (afsnit 2.4) 2. Variable og konstanter (afsnit 2.3) 3. Sætninger (bl.a. assignments)

Læs mere

3D NASAL VISTA 2.0

3D NASAL VISTA 2.0 USER MANUAL www.nasalsystems.es index index 2 I. System requirements 3 II. Main menu 4 III. Main popup menu 5 IV. Bottom buttons 6-7 V. Other functions/hotkeys 8 2 I. Systems requirements ``Recommended

Læs mere

Hvordan vælger jeg dokumentprofilen?

Hvordan vælger jeg dokumentprofilen? Hvordan vælger jeg dokumentprofilen? Valget af OIOUBL profil i en konkret dokumentudveksling vil bl.a. afhænge af, hvilke OIOUBL profiler den anden part i udvekslingen understøtter. Et konkret eksempel

Læs mere

3D NASAL VISTA TEMPORAL

3D NASAL VISTA TEMPORAL USER MANUAL www.nasalsystems.es index index 2 I. System requirements 3 II. Main menu 4 III. Main popup menu 5 IV. Bottom buttons 6-7 V. Other functions/hotkeys 8 2 I. Systems requirements ``Recommended

Læs mere

A Profile for Safety Critical Java

A Profile for Safety Critical Java A Profile for Safety Critical Java Martin Schoeberl Hans Søndergaard Bent Thomsen Anders P. Ravn Præsenteret af: Henrik Kragh-Hansen November 8, 2007 Forfatterne Martin Schoeberl Udvikler af JOP processoren

Læs mere

Netværk & elektronik

Netværk & elektronik Netværk & elektronik Oversigt Ethernet og IP teori Montering af Siteplayer modul Siteplayer teori Siteplayer forbindelse HTML Router (port forwarding!) Projekter Lkaa Mercantec 2009 1 Ethernet På Mars

Læs mere

Videregående programmering i Java

Videregående programmering i Java Videregående programmering i Java Dag 9 Andre designmønstre Andre designmønstre: Uforanderlig, Fluevægt, Lagdelt Initialisering, Komposit/Rekursiv Komposition, Kommando/Ændring Fremlæggelse af programmering/status

Læs mere

Nye features i Java 1.7/7.0

Nye features i Java 1.7/7.0 Denne guide er oprindeligt udgivet på Eksperten.dk Nye features i Java 1.7/7.0 Denne artikel beskriver nye features i Java 1.7/7.0, som blev releaset 28. juli 2011. Den forudsætter et vist kendskab til

Læs mere

Draco vs. Harry. Interactive Multimedia E2010 DIAM. 15. december 2010. Vejledt af: Kevin Cook McLean, Hans Christian Asmussen & Søren Vibjerg

Draco vs. Harry. Interactive Multimedia E2010 DIAM. 15. december 2010. Vejledt af: Kevin Cook McLean, Hans Christian Asmussen & Søren Vibjerg Draco vs. Harry 15. december 2010 Interactive Multimedia E2010 DIAM Vejledt af: Kevin Cook McLean, Hans Christian Asmussen & Søren Vibjerg Spillet kan findes på: http://www.itu.dk/people/rfog/draco_vs_harry.html

Læs mere

Værktøjer fra værktøjskassen. Søren Breddam, Stevns Kommune

Værktøjer fra værktøjskassen. Søren Breddam, Stevns Kommune Værktøjer fra værktøjskassen Søren Breddam, Stevns Kommune sb@stevns.dk 1stevns kommune Mapbasic i Stevns Kommune Data Kørsel af planlagte opgaver, så data altid er opdaterede. Logfil til overvågning Dagligt

Læs mere

Help / Hjælp

Help / Hjælp Home page Lisa & Petur www.lisapetur.dk Help / Hjælp Help / Hjælp General The purpose of our Homepage is to allow external access to pictures and videos taken/made by the Gunnarsson family. The Association

Læs mere

Boligsøgning / Search for accommodation!

Boligsøgning / Search for accommodation! Boligsøgning / Search for accommodation! For at guide dig frem til den rigtige vejledning, skal du lige svare på et par spørgsmål: To make sure you are using the correct guide for applying you must answer

Læs mere

Introduktion til ActionScript

Introduktion til ActionScript Introduktion til ActionScript Kaspar Rosengreen Nielsen kaspar@interactivespaces.net i n t e r a c t i v e s p a c e s. n e t Kaspar Nielsen, kaspar@interactivespaces.net 1 Dagens program Opsamling på

Læs mere

Vejledning til at tjekke om du har sat manuel IP på din computer.

Vejledning til at tjekke om du har sat manuel IP på din computer. Indhold Vejledning til at, komme på nettet. (DANSK)... 2 Gælder alle systemer.... 2 Vejledning til at tjekke om du har sat manuel IP på din computer.... 2 Windows 7... 2 Windows Vista... 2 Windows XP...

Læs mere

Abstrakte datatyper C#-version

Abstrakte datatyper C#-version Note til Programmeringsteknologi Akademiuddannelsen i Informationsteknologi Abstrakte datatyper C#-version Finn Nordbjerg 1/9 Abstrakte Datatyper Denne note introducerer kort begrebet abstrakt datatype

Læs mere

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

Datalogi OB, Efterår 2002 OH er, forelæsning 10/ Klasser og nedarvning Datalogi OB, Efterår 2002 OH er, forelæsning 10/9-2002 Klasser og nedarvning Hvad er formålet? Typer, generisk kode, typeparameterisering Kritisk kig på, hvordan man gør i Java. Eftermiddagens opgave:

Læs mere

SWC eksamens-spørgsmål. Oversigt

SWC eksamens-spørgsmål. Oversigt SWC eksamens-spørgsmål Oversigt #1 Typer og variable #2 Aritmetik og logik #3 Klasser (definition, objekter) #4 Klasser (metoder) #5 Klasser (nedarvning, polymorfi) #6 Conditional statements #7 Repetition

Læs mere

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

Videregående Programmering Obligatorisk opgave - 3. semester, efterår 2004 Overvågningssystem Beskrivelse Bagagesorteringssystemet består af et antal skranker (check-in) til modtagelse og registrering af bagage, et automatiseret sorteringsanlæg samt et antal terminaler (gates),

Læs mere

PDFmaps på smartphones

PDFmaps på smartphones PDFmaps på smartphones Kort udbyder - en enkel og (gratis) mulighed for at stille orienteringskort til rådighed på iphone/ipad og Android Bruger - en enkel og (gratis) mulighed for at downloade og anvende

Læs mere

Google App Engine. Google App Engine som platform. Claus Myglegaard Vagner og Jacob von Eyben

Google App Engine. Google App Engine som platform. Claus Myglegaard Vagner og Jacob von Eyben GoogleAppEngine GoogleAppEnginesomplatform ClausMyglegaardVagnerogJacobvonEyben Abstract CloudcomputingerenteknologidervinderfremidengenerelleITinfrastruktur. SocialemediersåsomLinkedIn,TwitterogFacebookharøgetbehovetfor

Læs mere

Sådan laver du en billed-lyd fortælling med Soundslides Plus / Ole Rode Jensen, oktober 2011

Sådan laver du en billed-lyd fortælling med Soundslides Plus / Ole Rode Jensen, oktober 2011 Sådan laver du en billed-lyd fortælling med Soundslides Plus / Ole Rode Jensen, oktober 2011 1 Soundslides samler billeder og lyd - ikke andet Soundslides er IKKE billedredigering og IKKE lydredigering,

Læs mere

Klasser og nedarvning

Klasser og nedarvning Datalogi C, Efterår 2004 OH er, forelæsning 21/9-2004 Klasser og nedarvning Hvad er formålet? Typer, generisk kode, typeparameterisering Kritisk kig på, hvordan man gør i Java. Opgaven til senere: Generalisere

Læs mere

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

//Udskriver System.out.println(Hej  + ditfornavn +   + ditefternavn + .); System.out.println(Du er  + dinalder +  aar gammel! Denne guide er oprindeligt udgivet på Eksperten.dk Brugerinput i Java Denne her artikel gennemgår diverse ting ved brug af brugerinput i Java. Den starter med det simple og fortæller derefter skridt for

Læs mere

Introduktion til ActionScript, fortsat

Introduktion til ActionScript, fortsat Introduktion til ActionScript, fortsat Kaspar Rosengreen Nielsen kaspar@interactivespaces.net i n t e r a c t i v e s p a c e s. n e t Kaspar Nielsen, kaspar@interactivespaces.net 1 Dagens program Opsamling

Læs mere

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

Civilingeniøreksamen 49104 12. januar 2001. Skriftelig prøve den 12. januar 2001 Kursusnummer 49104 Skriftelig prøve den 12. januar 2001 Kursusnummer 49104 Kursusnavn: Programmering. Tilladte hjælpemidler: Alle skriftlige hjælpemidler Opgavesættet består af fire opgaver, der har følgende vægtning: Opgave

Læs mere

Privat-, statslig- eller regional institution m.v. Andet Added Bekaempelsesudfoerende: string No Label: Bekæmpelsesudførende

Privat-, statslig- eller regional institution m.v. Andet Added Bekaempelsesudfoerende: string No Label: Bekæmpelsesudførende Changes for Rottedatabasen Web Service The coming version of Rottedatabasen Web Service will have several changes some of them breaking for the exposed methods. These changes and the business logic behind

Læs mere

Vores mange brugere på musskema.dk er rigtig gode til at komme med kvalificerede ønsker og behov.

Vores mange brugere på musskema.dk er rigtig gode til at komme med kvalificerede ønsker og behov. På dansk/in Danish: Aarhus d. 10. januar 2013/ the 10 th of January 2013 Kære alle Chefer i MUS-regi! Vores mange brugere på musskema.dk er rigtig gode til at komme med kvalificerede ønsker og behov. Og

Læs mere

PDFmaps på smartphones

PDFmaps på smartphones PDFmaps på smartphones Kort udbyder - en enkel og (gratis) mulighed for at stille orienteringskort til rådighed på iphone/ipad og Android Bruger - en enkel og (gratis) mulighed for at downloade og anvende

Læs mere

MS Visual Studio Basic 2010. En kort vejledning

MS Visual Studio Basic 2010. En kort vejledning Du kan hente programmet gratis her: MS Visual Studio Basic 2010 Express http://www.microsoft.com/visualstudio/eng/downloads#d-2010-express Tryk på Install Now og følg vejledningen. Indholdsfortegnelse

Læs mere

Android 2.x CodeJam. Android CodeJam 2.x Copyright Lund & Bendsen A/S

Android 2.x CodeJam. Android CodeJam 2.x Copyright Lund & Bendsen A/S Velkommen Android 2.x CodeJam 1 Om oplægsholderen Jacob Nordfalk nordfalk@lundogbendsen.dk Instruktør for Lund&Bendsen Ekstern lektor på IHK Underviser i Java SE, Java EE, Webserverprogrammering, OOAD,

Læs mere

Magic Systems. Byg et lille hus med. 2008 Magic Systems

Magic Systems. Byg et lille hus med. 2008 Magic Systems Byg et lille hus med 2008 1 Værktøjer Vælg de værktøjsstave, du skal bruge; se illustration. Du får denne menu frem ved at klikke med højre musetast på en af værktøjsstavene. 2 Måleenheder Sæt den måleenhed

Læs mere

Netværksalgoritmer 1

Netværksalgoritmer 1 Netværksalgoritmer 1 Netværksalgoritmer Netværksalgoritmer er algoritmer, der udføres på et netværk af computere Deres udførelse er distribueret Omfatter algoritmer for, hvorledes routere sender pakker

Læs mere

Programmering i C. Lektion 4. 5. december 2008

Programmering i C. Lektion 4. 5. december 2008 Programmering i C Lektion 4 5. december 2008 Funktioner Eksempel Fra sidst 1 Funktioner 2 Eksempel Funktioner Eksempel Eksempel: 1 / f u n k t i o n s p r o t o t y p e r / i n t i n d l a e s ( void )

Læs mere

Hvor er mine runde hjørner?

Hvor er mine runde hjørner? Hvor er mine runde hjørner? Ofte møder vi fortvivlelse blandt kunder, når de ser deres nye flotte site i deres browser og indser, at det ser anderledes ud, i forhold til det design, de godkendte i starten

Læs mere

Bemærk, der er tale om ældre versioner af softwaren, men fremgangsmåden er uændret.

Bemærk, der er tale om ældre versioner af softwaren, men fremgangsmåden er uændret. Check dine svar på: https://dtu.codejudge.net/02101-e18/ Exercise 1: Installer Eclipse og Java. Dette kan f.eks. gøres ved at følge instuktionerne i dokumentet eclipse intro.pdf som ligger under Fildeling

Læs mere

Det er muligt at chekce følgende opg. i CodeJudge: og

Det er muligt at chekce følgende opg. i CodeJudge: og Det er muligt at chekce følgende opg. i CodeJudge:.1.7 og.1.14 Exercise 1: Skriv en forløkke, som producerer følgende output: 1 4 9 16 5 36 Bonusopgave: Modificer dit program, så det ikke benytter multiplikation.

Læs mere

MultiProgrammer Manual

MultiProgrammer Manual MultiProgrammer Manual MultiProgrammeren bruges til at læse og skrive værdier til ModBus register i LS Controls frekvensomformer E 1045. Dansk Version side 2 til 4 The MultiProgrammer is used for the writing

Læs mere

PARALLELIZATION OF ATTILA SIMULATOR WITH OPENMP MIGUEL ÁNGEL MARTÍNEZ DEL AMOR MINIPROJECT OF TDT24 NTNU

PARALLELIZATION OF ATTILA SIMULATOR WITH OPENMP MIGUEL ÁNGEL MARTÍNEZ DEL AMOR MINIPROJECT OF TDT24 NTNU PARALLELIZATION OF ATTILA SIMULATOR WITH OPENMP MIGUEL ÁNGEL MARTÍNEZ DEL AMOR MINIPROJECT OF TDT24 NTNU OUTLINE INEFFICIENCY OF ATTILA WAYS TO PARALLELIZE LOW COMPATIBILITY IN THE COMPILATION A SOLUTION

Læs mere

Design by Contract. Design and Programming by Contract. Oversigt. Prædikater

Design by Contract. Design and Programming by Contract. Oversigt. Prædikater Design by Contract Design and Programming by Contract Anne Haxthausen ah@imm.dtu.dk Informatics and Mathematical Modelling Technical University of Denmark Design by Contract er en teknik til at specificere

Læs mere

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

IT Support Guide. Installation af netværksprinter (direkte IP print) IT Support Guide Denne guide er hentet på www.spelling.dk Program: Microsoft Windows Vista Program sprog version: ENG (US) Guide emne: Installation af netværksprinter (direkte IP print) Publikationsnr.:

Læs mere

Referencer i MicroStation V8i SelectSeries1

Referencer i MicroStation V8i SelectSeries1 Referencer i MicroStation V8i SelectSeries1 Indhold Saved views... 2 LAV ET SAVED VIEW... 2 TILKNYT SAVED VIEWS SOM REFERENCE... 3 Annotation scale og referencer... 7 ØVELSE MED ANNOTATION SCALE... 8 ÆNDRE

Læs mere

Kursusarbejde 3 Grundlæggende Programmering

Kursusarbejde 3 Grundlæggende Programmering Kursusarbejde 3 Grundlæggende Programmering Arne Jørgensen, 300473-2919 klasse dm032-1a 21. november 2003 Indhold 1. Kode 2 1.1. forestillinger.h............................................. 2 1.2. forestillinger.cc.............................................

Læs mere

Processer og tråde. dopsys 1

Processer og tråde. dopsys 1 Processer og tråde dopsys 1 Motivation.. parallelle processer udnytter hardwaren bedre: Batch operativsystemer (50 erne) hhv. små systemer: Multiprogrammering og time-sharing (fra 60 erne og frem): dopsys

Læs mere

Dag 10 Flertrådet programmering

Dag 10 Flertrådet programmering Videregående programmering i Java Dag 10 Flertrådet programmering Fremlæggelse af programmering/status for projekter Dokumentation med javadoc Flertrådede designmønstre: Arbejdstråd, Producent Konsument,

Læs mere

BRP 6.9.2006 Kursusintroduktion og Java-oversigt

BRP 6.9.2006 Kursusintroduktion og Java-oversigt BRP 6.9.2006 Kursusintroduktion og Java-oversigt 1. Kursusintroduktion 2. Java-oversigt (A): Opgave P4.4 3. Java-oversigt (B): Ny omvendings -opgave 4. Introduktion til næste kursusgang Kursusintroduktion:

Læs mere

Webserverprogrammering

Webserverprogrammering Webserverprogrammering WSP fortsat - dag 11 Behandling af XML (StAX) Syndikering og RSS med XML JAXB - XML Java-objekter Projekthjælp Dette materiale er under Åben Dokumentlicens, se http://www.sslug.dk/linuxbog/licens.html

Læs mere

Videregående programmering i Java

Videregående programmering i Java Videregående programmering i Java Dag 6 Komponenter (og lidt Swing og MVC) Læsning: VP 4, evt. VP 6 Dette materiale er under Åben Dokumentlicens, se http://www.sslug.dk/linuxbog/licens.html Grafiske komponenter

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2016 Projekt, del I Institut for matematik og datalogi Syddansk Universitet 29. februar, 2016 Dette projekt udleveres i tre dele. Hver del har sin deadline, således

Læs mere

Varenr.: 553925 90 højre 553926 90 venstre 554027 90º højre med coating 554028 90º venstre med coating

Varenr.: 553925 90 højre 553926 90 venstre 554027 90º højre med coating 554028 90º venstre med coating DK GH Skiftespor Varenr.: 55395 90 højre 55396 90 venstre 55407 90º højre med coating 55408 90º venstre med coating 553991 60º højre 553995 60º venstre 551058 60º højre med coating 551059 60º venstre med

Læs mere

The EAL Jobportal. How to get started

The EAL Jobportal. How to get started The EAL Jobportal How to get started Be prepared Before you start You need to know the ID of your Uni login (WAYF login) You need a browser like Firefox, Safari, Google Chrome (or IE 9 or higher) You need

Læs mere

Kom hurtigt i gang. med. FloorPlan 3D. FloorPlan 3D er et program med mange anvendelsesmuligheder!

Kom hurtigt i gang. med. FloorPlan 3D. FloorPlan 3D er et program med mange anvendelsesmuligheder! Kom hurtigt i gang med FloorPlan 3D FloorPlan 3D er et program med mange anvendelsesmuligheder! Formålet med denne guide, er at give et overblik over de grundlæggende funktioner i FloorPlan 3D og at få

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2019 Projekt, del I Institut for matematik og datalogi Syddansk Universitet 27. februar, 2019 Dette projekt udleveres i tre dele. Hver del har sin deadline, således

Læs mere

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

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 4 DM502 Forelæsning 4 Flere kontrolstrukturer for-løkke switch-case Metoder Indhold Arrays og sortering af arrays String-funktioner for-løkke Ofte har man brug for at udføre det samme kode, for en sekvens

Læs mere

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

MySQL i Java. Tutorial lavet af Jákup W. Hansen TSU 2006 2.semester 05.januar 2007 MySQL i Java Tutorial lavet af Jákup W. Hansen TSU 2006 2.semester 05.januar 2007 Hvad er MySQL? Det er et database system, som er gratis for os at bruge. Det er lidt mere besværligt i starten at bruge

Læs mere

XML parsning i Java. Denne artikel beskriver hvordan man parser XML i Java. Den beskriver W3C DOM, SAX og JDOM.

XML parsning i Java. Denne artikel beskriver hvordan man parser XML i Java. Den beskriver W3C DOM, SAX og JDOM. Denne guide er oprindeligt udgivet på Eksperten.dk XML parsning i Java Denne artikel beskriver hvordan man parser XML i Java. Den beskriver W3C DOM, SAX og JDOM. Den forudsætter kendskab til Java og XML.

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2018 Projekt, del II Institut for matematik og datalogi Syddansk Universitet 20. marts, 2019 Dette projekt udleveres i tre dele. Hver del har sin deadline, således

Læs mere

QUICK START Updated:

QUICK START Updated: QUICK START Updated: 24.08.2018 For at komme hurtigt og godt igang med dine nye Webstech produkter, anbefales at du downloader den senest opdaterede QuickStart fra vores hjemmeside: In order to get started

Læs mere

Kursus navn: Indledende programmering Kursus nr. 02101

Kursus navn: Indledende programmering Kursus nr. 02101 Danmarks Tekniske Universitet Side 1 af 8 sider Skriftlig prøve, den 15. december 2007 Kursus navn: Indledende programmering Kursus nr. 02101 Tilladte hjælpemidler: Alle skriftlige hjælpemidler Vægtning

Læs mere

SigmaT.

SigmaT. Java + Groovy Disposition Om SigmaT Eksempel på indlejring af Groovy Overvågning af PEM Ønske om dynamisk loaded Java uden at fifle med classloaderen Groovy til hjælp Opsamling hvad jeg ikke har fortalt

Læs mere

Shooting tethered med Canon EOS-D i Capture One Pro. Shooting tethered i Capture One Pro 6.4 & 7.0 på MAC OS-X 10.7.5 & 10.8

Shooting tethered med Canon EOS-D i Capture One Pro. Shooting tethered i Capture One Pro 6.4 & 7.0 på MAC OS-X 10.7.5 & 10.8 Shooting tethered med Canon EOS-D i Capture One Pro Shooting tethered i Capture One Pro 6.4 & 7.0 på MAC OS-X 10.7.5 & 10.8 For Canon EOS-D ejere der fotograferer Shooting tethered med EOS-Utility eller

Læs mere

Aftenskole i programmering sæson Registrering af tid. Sæson 2 - Lektion 5

Aftenskole i programmering sæson Registrering af tid. Sæson 2 - Lektion 5 Registrering af tid Sæson 2 - Lektion 5 Før jul Vi har designet og bygget en model til håndtering af en timeregistrering Vi har kigget på hvordan vi håndterer fejl Vi har kopieret koden over i Bents x-code

Læs mere

Bentleyuser.dk Årsmøde 2010 Nordic Civil 2010

Bentleyuser.dk Årsmøde 2010 Nordic Civil 2010 Bentleyuser.dk Årsmøde 2010 Nordic Civil 2010 8.-10. November 2010, Munkebjerg Hotel, Vejle Workshop W2 Annotation Scale i MicroStation V8i Underviser: Tine Lai Andersen, Bentley Systems (Danmark) Bentley

Læs mere

DANMARKS TEKNISKE UNIVERSITET

DANMARKS TEKNISKE UNIVERSITET DANMARKS TEKNISKE UNIVERSITET Skriftlig prøve, 14. december 2018, 4 timer Side 1 af 18 Kursus navn: 02101 Indledende Programmering Kursus : 02101 Tilladte hjælpemidler: Ikke-digitale skriftlige hjælpemidler

Læs mere

Brug sømbrættet til at lave sjove figurer. Lav fx: Få de andre til at gætte, hvad du har lavet. Use the nail board to make funny shapes.

Brug sømbrættet til at lave sjove figurer. Lav fx: Få de andre til at gætte, hvad du har lavet. Use the nail board to make funny shapes. Brug sømbrættet til at lave sjove figurer. Lav f: Et dannebrogsflag Et hus med tag, vinduer og dør En fugl En bil En blomst Få de andre til at gætte, hvad du har lavet. Use the nail board to make funn

Læs mere

Threads i Java. Denne artikel giver en introduktion til threads i Java. Den beskriver hvad tråde er og forklarer hvordan de bruges i Java

Threads i Java. Denne artikel giver en introduktion til threads i Java. Den beskriver hvad tråde er og forklarer hvordan de bruges i Java Denne guide er oprindeligt udgivet på Eksperten.dk Threads i Java Denne artikel giver en introduktion til threads i Java. Den beskriver hvad tråde er og forklarer hvordan de bruges i Java Den forudsætter

Læs mere

Black Jack --- Review. Spring 2012

Black Jack --- Review. Spring 2012 Black Jack --- Review Spring 2012 Simulation Simulation can solve real-world problems by modeling realworld processes to provide otherwise unobtainable information. Computer simulation is used to predict

Læs mere

Aarhus Universitet, Science and Technology, Computer Science. Exam. Wednesday 27 June 2018, 9:00-11:00

Aarhus Universitet, Science and Technology, Computer Science. Exam. Wednesday 27 June 2018, 9:00-11:00 Page 1/12 Aarhus Universitet, Science and Technology, Computer Science Exam Wednesday 27 June 2018, 9:00-11:00 Allowed aid: None The exam questions are answered on the problem statement that is handed

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2018 Projekt, del II Institut for matematik og datalogi Syddansk Universitet 13. marts, 2018 Dette projekt udleveres i tre dele. Hver del har sin deadline, således

Læs mere

RefWorks Workshop Medicinsk Bibliotek Aalborg Universitetshospital. Oprettelse af konto/log in... 2. RefWorks-databasen... 2

RefWorks Workshop Medicinsk Bibliotek Aalborg Universitetshospital. Oprettelse af konto/log in... 2. RefWorks-databasen... 2 RefWorks vejledning Indhold Oprettelse af konto/log in... 2 RefWorks-databasen... 2 Import af referencer... 2 Pubmed... 3 Embase/Psycinfo/Medline (Ovid)... 4 Cinahl... 5 RefGrab-it... 6 Organisering af

Læs mere

Undervisningsbeskrivelse

Undervisningsbeskrivelse Undervisningsbeskrivelse Stamoplysninger til brug ved prøver til gymnasiale uddannelser Termin Institution Uddannelse Fag og niveau Lærer(e) Hold Termin hvori undervisningen afsluttes: maj-juni 2014 HTX

Læs mere

Adobe Elements Lektion 2

Adobe Elements Lektion 2 Adobe Elements Lektion 2 Så er det igen tid til at lege lidt med billeder. Jeg går ud fra, at du nu har fået opsat Elements efter de anvisninger du fik i sidste lektion. Start Elements op Gå ind i Edit

Læs mere

GUIDE TIL DIN STREM BOX.

GUIDE TIL DIN STREM BOX. GUIDE TIL DIN STREM BOX. HVAD KAN JEG GØRE I IPTV BOXEN 1. Hvordan ser jeg ud TV, FILM, høre radiokanaler, bruger YouTube 2. Lav en favoritliste 3. Skifte lydsprog når du ser video og tv-kanaler 4. Ændre

Læs mere

Program Dokumentation PC Software Skrevet af. Gruppen. Version 1.0

Program Dokumentation PC Software Skrevet af. Gruppen. Version 1.0 Program Dokumentation PC Software Skrevet af Gruppen. Version 1.0 Indholds fortegnelse 1. INDLEDNING...3 1.1. FORMÅL...3 1.2. REFERENCER...3 1.3. VERSIONSHISTORIE...3 1.4. DEFINITIONER...3 1.5. DOKUMENTATIONENS

Læs mere

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.

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. Exercise 1: Opgave 9.1 på CodeJudge. a) Lav klasserne Cirkel, Rektangel og Kvadrat, som implementerer vedhæftede interface From.java (se CodeJudge). Lav Rektangel før du laver Kvadrat. Kan du bruge nedarvning

Læs mere

Første møde med skærmbilledet i After Effects 6,5 PRO Lidt om animering

Første møde med skærmbilledet i After Effects 6,5 PRO Lidt om animering Bent Sehested Side - 1 Første møde med skærmbilledet i After Effects 6,5 PRO Lidt om animering Hvert lag i Compositionen har et afmærket ankerpunkt. Det er koordinaterne for diagonalernes skæring. Der

Læs mere

Flotte mosaikbilleder

Flotte mosaikbilleder 1 af 5 08-07-2008 22:24 Forside Programmer Tips & tricks Diverse Hjælp Forum Søgefelt Trin for trin: Flotte mosaikbilleder Download Centarsia Centarsia fylder mindre end 1 MB, så det hentes typisk på mindre

Læs mere

Ugeseddel 4 1. marts - 8. marts

Ugeseddel 4 1. marts - 8. marts Ugeseddel 4 1. marts - 8. marts Læs følgende sider i kapitel 6 i lærebogen: s. 233 258 og s. 291 317 (afsnit 6.3 overspringes). Begynd at overveje, hvad afleveringsopgaven skal omhandle. Læs vejledningen,

Læs mere

Databaseadgang fra Java

Databaseadgang fra Java Databaseadgang fra Java Grundlæggende Programmering med Projekt Peter Sestoft Fredag 2007-11-23 Relationsdatabasesystemer Der er mange databaseservere Microsoft Access del af Microsoft Office MySQL god,

Læs mere

Tree klassen fra sidste forelæsning

Tree klassen fra sidste forelæsning Programmering 1999 Forelæsning 12, fredag 8. oktober 1999 Oversigt Abstrakte klasser. Grænseflader. Programmering 1999 KVL Side 12-1 Tree klassen fra sidste forelæsning class Tree { int age; // in years

Læs mere

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

import java.awt.event.*; import java.awt.*; Container <- Panel <- Applet Component <- Button <- Checkbox <- ScrollPane <- Label Programmering 1999 Forelæsning 13, tirsdag 12. oktober 1999 Oversigt Grafiske brugergrænseflader. Komponenter: Knapper, tekstfelter, checkbokse... Vinduer (containere). Hændelser, hændelsesstyret programmering.

Læs mere

Terese B. Thomsen 1.semester Formidling, projektarbejde og webdesign ITU DMD d. 02/11-2012

Terese B. Thomsen 1.semester Formidling, projektarbejde og webdesign ITU DMD d. 02/11-2012 Server side Programming Wedesign Forelæsning #8 Recap PHP 1. Development Concept Design Coding Testing 2. Social Media Sharing, Images, Videos, Location etc Integrates with your websites 3. Widgets extend

Læs mere

Opsætning af Backup. Hvis programmet registreres korrekt vises nedenstående skærmbillede. Genstart herefter programmet.

Opsætning af Backup. Hvis programmet registreres korrekt vises nedenstående skærmbillede. Genstart herefter programmet. Opsætning af Backup Dette er en guide til opsætning af backup med Octopus File Synchronizer. Det første der skal ske er, at programmet skal registreres (programmet kan dog bruges i 30 dage, hvis det ikke

Læs mere

Exceptions i Delphi. Try except

Exceptions i Delphi. Try except Exceptions i Delphi Exceptions er en teknik til at fange fejl under programafviklingen. Ikke programmeringsfejl, men fejl der opstår i forskellige situationer, f.eks. en fil der mangler en fil der er skrivebeskyttet,

Læs mere

Kilder: Troldspejlets Spilskolen, yoyogames.com

Kilder: Troldspejlets Spilskolen, yoyogames.com Kilder: Troldspejlets Spilskolen, yoyogames.com Indholdsfortegnelse Gamemaker 7.0... 3 Installation... 3 Det første spil.... 5 Trin 1: Spilidéen... 5 Trin 2: Grafik og lyd.... 6 Trin 3: Objekter og spilpladen....

Læs mere