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="http://schemas.android.com/apk/res/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="http://schemas.android.com/apk/res/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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

//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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Forside til eksamensprojekt

Forside til eksamensprojekt Forside til eksamensprojekt INGENIØR HØJSKOLEN KØBENHAVN OOPA/MGA-T- 401 Center for Videreuddannelse Lautrupvang 15, Indgang 19 B DK- 2750 Ballerup Tlf: 44 80 51 00 Fax: 44 80 51 10 Mail: cv@ihk.dk Sæt

Læs mere

Aktivering af Survey funktionalitet

Aktivering af Survey funktionalitet Surveys i REDCap REDCap gør det muligt at eksponere ét eller flere instrumenter som et survey (spørgeskema) som derefter kan udfyldes direkte af patienten eller forsøgspersonen over internettet. Dette

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

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

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

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

Introduktion til ActionScript

Introduktion til ActionScript Introduktion til ActionScript Kaspar Rosengreen Nielsen kaspar@interactivespaces.net HUSK: Studentermøde for datalogistuderende Torsdag d. 11/2 kl. 15 - i lokale Ada 333 Har du en mening om dit studie?

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

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

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

DK - Quick Text Translation. HEYYER Net Promoter System Magento extension

DK - Quick Text Translation. HEYYER Net Promoter System Magento extension DK - Quick Text Translation HEYYER Net Promoter System Magento extension Version 1.0 15-11-2013 HEYYER / Email Templates Invitation Email Template Invitation Email English Dansk Title Invitation Email

Læs mere

Servlets, Tomcat & BlueJ

Servlets, Tomcat & BlueJ Servlets, Tomcat & BlueJ Tutorial lavet af Jákup W. Hansen TSU 2006 3.semester 05.october 2007 Hvad er Servlets: For at forstå det, må vi først få styr på to begreber, nemlig statiske og dynamiske hjemmesider

Læs mere

Wii Software Modificering. Uber Guide

Wii Software Modificering. Uber Guide Wii Software Modificering Uber Guide Af Michael Bartholin (og Alice Raunsbæk) http://wii.m-r-a.dk Side 1 af 21 Indholdsfortegnelse Indholdsfortegnelse...2 Introduktion...3 Krav...3 Forberedelse...3 Historik...3

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

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

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

MapBasic hvad kan det bruges til? Insights Danmark 2011

MapBasic hvad kan det bruges til? Insights Danmark 2011 MapBasic hvad kan det bruges til? Insights Danmark 2011 Peter Horsbøll Møller September 2011 Program MapBasic - Hvad er det? MapBasic Eksempel 1 MapBasic Eksempel 2 Links MapBasic hvad er det? MapBasic

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

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

PROGRAM. using System; using System.Collections.Generic; using System.Text; using System.Collections; PROGRAM using System; using System.Collections.Generic; using System.Text; using System.Collections; namespace EventManager class Program static void Main(string[] args) string hovedmenu = ""; string svar;

Læs mere

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

Design by Contract Bertrand Meyer Design and Programming by Contract. Oversigt. Prædikater Design by Contract Bertrand Meyer 1986 Design and Programming by Contract Michael R. Hansen & Anne Haxthausen mrh@imm.dtu.dk Informatics and Mathematical Modelling Technical University of Denmark Design

Læs mere

Integrationsmanual. Anvendelse af webservice til kursusoversigt i Campus. Brugervejledning til udviklere

Integrationsmanual. Anvendelse af webservice til kursusoversigt i Campus. Brugervejledning til udviklere Integrationsmanual Anvendelse af webservice til kursusoversigt i Campus Brugervejledning til udviklere Moderniseringsstyrelsen Webservice manual til udviklere 2016 1 1. Indholdsfortegnelse Nyt kapitel

Læs mere

1. Stak og kort. 1. Vælg New Stack i File menu - - Vælg: Save. 2. Vælg No for at ændre størrelsen på kortet.

1. Stak og kort. 1. Vælg New Stack i File menu - - Vælg: Save. 2. Vælg No for at ændre størrelsen på kortet. 1. Stak og kort 1. Vælg New Stack i File menu - - Vælg: Save. 2. Vælg No for at ændre størrelsen på kortet. 3. Vælg 14-640x480 i Standard Hyperstudio Card. 4. Klik Ok. 1 I Windows ser det sådan ud. Vælg

Læs mere

QUICK START Updated: 18. Febr. 2014

QUICK START Updated: 18. Febr. 2014 QUICK START Updated: 18. Febr. 2014 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

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

Status på det trådløse netværk

Status på det trådløse netværk Status på det trådløse netværk Der er stadig problemer med det trådløse netværk, se status her: http://driftstatus.sdu.dk/?f=&antal=200&driftid=1671#1671 IT-service arbejder stadig med at løse problemerne

Læs mere

Klienten. import java.util.*;

Klienten. import java.util.*; Klienten import java.util.*; * Aktiviteter er et model element, som indeholder blandt andet psimetiks beskrivleser. * @author rling public class Aktivitet extends Beholder implements HarEOgA, HarTilknytning,

Læs mere

The purpose of our Homepage is to allow external access to pictures and videos taken/made by the Gunnarsson family.

The purpose of our Homepage is to allow external access to pictures and videos taken/made by the Gunnarsson family. General The purpose of our Homepage is to allow external access to pictures and videos taken/made by the Gunnarsson family. Formålet med vores hjemmesiden er at gøre billeder og video som vi (Gunnarsson)

Læs mere

Brugsanvisning. Installation Manual

Brugsanvisning. Installation Manual Manual size: 148 x 210 mm 175g copper paper(铜版纸印刷) UNIVERSAL BIL TAGBAGAGEBÆRER Brugsanvisning UNIVERSAL CAR ROOF RACK Installation Manual Model no. 10889 Tak fordi du valgte dette produkt, som vi håber

Læs mere

En textbox har et Validating event, med dette kan vi samme med en errroprovider checke input:

En textbox har et Validating event, med dette kan vi samme med en errroprovider checke input: Inputvalidering i Windows Forms Applikationer Rolf Therkildsen (6. nov 2008) Krav til inputvalidering Brugeren må aldrig blive forhindret i at flytte til en anden kontrol. Brugeren skal informeres om fejl

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

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

Wii Software Modificering. Uber Guide

Wii Software Modificering. Uber Guide Wii Software Modificering Uber Guide Af Michael Bartholin (og Alice Raunsbæk) http://wii.m-r-a.dk Revision: 2.2 Side 1 af 13 Sidst opdateret: 01/03/2010 Indholdsfortegnelse Indholdsfortegnelse...2 Introduktion...3

Læs mere

Datalogi OB, Efterår 2002 OH er, forelæsning 3/9-2002 - forstå datastrukturer og algoritmer (teoretisk forståelse og intuition)

Datalogi OB, Efterår 2002 OH er, forelæsning 3/9-2002 - forstå datastrukturer og algoritmer (teoretisk forståelse og intuition) Datalogi OB, Efterår 2002 OH er, forelæsning 3/9-2002 Datastrukturer og algoritmer Henning Christiansen henning@ruc.dk http://www.ruc.dk/~henning Formål: at kunne - forstå datastrukturer og algoritmer

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

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

Geografisk lokalisering i JSP

Geografisk lokalisering i JSP Denne guide er oprindeligt udgivet på Eksperten.dk Geografisk lokalisering i JSP Denne artikel forklarer lidt om hvorfor og hvordan man laver geografisk lokalisering og viser noget kode. Der er andre artikler

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

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

Parallelle algoritmer

Parallelle algoritmer Parallelle algoritmer Von Neumann s model John von Neumann 1903-57 Von Neumanns model: Instruktioner og data er lagret i samme lager, og én processor henter instruktioner fra lageret og udfører dem én

Læs mere

ROTERENDE TABURET 360 GRADER MED HYL Brugsanvisning. ROTATING SHOWER STOOL WITH TRAY Installation Manual. Size: 148 x 210 mm 105g copper paper

ROTERENDE TABURET 360 GRADER MED HYL Brugsanvisning. ROTATING SHOWER STOOL WITH TRAY Installation Manual. Size: 148 x 210 mm 105g copper paper Size: 148 x 210 mm 105g copper paper ROTERENDE TABURET 360 GRADER MED HYL Brugsanvisning ROTATING SHOWER STOOL WITH TRAY Installation Manual Model. 10853 1. Fjern emballagen. 2. Taburettens ben samles

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

Remember the Ship, Additional Work

Remember the Ship, Additional Work 51 (104) Remember the Ship, Additional Work Remember the Ship Crosswords Across 3 A prejudiced person who is intolerant of any opinions differing from his own (5) 4 Another word for language (6) 6 The

Læs mere

Aalborg Universitet. Økonomisk ulighed og selvværd Hansen, Claus Dalsgaard. Publication date: 2011

Aalborg Universitet. Økonomisk ulighed og selvværd Hansen, Claus Dalsgaard. Publication date: 2011 Aalborg Universitet Økonomisk ulighed og selvværd Hansen, Claus Dalsgaard Publication date: 2011 Document Version Tidlig version også kaldet pre-print Link to publication from Aalborg University Citation

Læs mere

SPSS introduktion Om at komme igang 1

SPSS introduktion Om at komme igang 1 SPSS introduktion Om at komme igang 1 af Henrik Lolle, oktober 2003 Indhold Indledning 1 Indgang til SPSS 2 Frekvenstabeller 3 Deskriptive statistikker gennemsnit, standardafvigelse, median osv. 4 Søjlediagrammer

Læs mere

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

Grundlæggende Programmering ITU, Efterår 1999. Skriftlig eksamen i Grundlæggende Programmering Skriftlig eksamen i Grundlæggende Programmering ITU, 20. januar 2000 Alle hjælpemidler tilladt, dog ikke datamat. Eksamen er skriftlig, fire timer, og bedømmes efter 13-skalaen. Opgavesættet består af

Læs mere

Under 'Microsoft Block Editor', klik 'New project' for at åbne block editor-værktøjet.

Under 'Microsoft Block Editor', klik 'New project' for at åbne block editor-værktøjet. 8 3. Nedtælling Nu skal du lave en nedtæller. Det er en god måde at lære variabler på og hvordan du skal kode micro:bit til at gøre dét, du vil have, at den skal vise. Du skal bruge: 1 x BBC micro:bit

Læs mere

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

Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java Kursus i OOP og Java Kursus i Objektorienteret programmering i Java Åben Dokumentlicens Dette foredragsmateriale er under Åben Dokumentlicens (ÅDL) Du har derfor lov til frit at kopiere dette værk Bruger

Læs mere

3. PROJEKT, 2 SEMESTER

3. PROJEKT, 2 SEMESTER 3. PROJEKT, 2 SEMESTER Bruger undersøgelse, af sociale medie. KENDSKAB TIL OG BRUG AF ONLINE SOCIALE MEDIER FORENINGEN AF DANSKE INTERAKTIVE MEDIER, FÅET TIL OPGAVE AT AFDÆKKE DANSKERNES BRUG AF SOCIALE

Læs mere

Vejledning til det digitale eksamenssystem. Heilesen, Simon. Publication date: Document Version Peer-review version

Vejledning til det digitale eksamenssystem. Heilesen, Simon. Publication date: Document Version Peer-review version Vejledning til det digitale eksamenssystem Heilesen, Simon Publication date: 2014 Document Version Peer-review version Citation for published version (APA): Heilesen, S. (2014). Vejledning til det digitale

Læs mere

Workshop G4 MicroStation V8 XM edtion nye værktøjer 2

Workshop G4 MicroStation V8 XM edtion nye værktøjer 2 Workshop G4 MicroStation V8 XM edtion nye værktøjer 2 FØR I BEGYNDER......1 ACCUDRAW...2 ROTATE VIEW...2 ROTATE ELEMENT...2 ANDRE NYE ACCUDRAW SHORTCUTS...2 SHORTCUTS...3 DE VIGTIGSTE...3 CTRL OG EN FUNKTIONSTAST

Læs mere