TECHNISCHE
UNIVERSITÄT
MÜNCHEN
FAKULTÄT FÜR INFORMATIK
Lehrstuhl für Sprachen und Beschreibungsstrukturen
Praktikum Grundlagen der Programmierung
F. Forster, T. Gawlitza, A. Flexeder
Übungen zu
WS 2007/2008
Lösungsvorschläge zu Blatt 13
25. Januar 2008
Praktikum Grundlagen der Programmierung
Aufgabe 58 Applets: Album (Lösungsvorschlag)
a) HTML-Code: album.html
<html>
<head>
<title> Album </title>
</head>
<body>
<h1> Album </h1>
<applet codebase="." code=" Album . class " width=500
height=300 alt=" Your browser has to be Java - enabled to see the ap
<param name=" urls " value=" mac . jpeg : tux . jpeg : windows . jpeg "/ >
</applet>
</body>
</html>
b) Applet-Code: Album.java
import
import
import
import
import
java . applet . Applet ;
java . awt .*;
java . awt . event .*;
java . util .*;
java . util . List ;
public class Album extends Applet implements ActionListener {
int crt = 0;
Label label;
Button prev , next ;
String [] names ;
Image [] imgs ;
public void init () {
List < String > urls = new LinkedList < String >();
StringTokenizer t = new StringTokenizer ( getParameter (" urls "), ":" );
while (t. hasMoreTokens ())
urls . add (t. nextToken ());
setBackground ( Color . white );
setFont (new Font (" SansSerif " , Font . BOLD , 18));
label = new Label ();
Lösung 13/ Seite 2
add (label);
prev = new Button (" Prev " );
prev . setBackground ( Color . orange );
prev . addActionListener (this);
add ( prev );
next = new Button (" Next " );
next . setBackground ( Color . orange );
next . addActionListener (this);
add ( next );
names = new String [ urls . size ()];
imgs = new Image [ urls . size ()];
int id = 0;
for( String url : urls ) {
names [ id ] = url ;
id ++;
}
label. setText ( names [0]);
}
public void paint ( Graphics page ) {
if ( imgs [ crt ] == null)
imgs [ crt ] = getImage ( getDocumentBase () , names [ crt ]);
page . drawImage ( imgs [ crt ] ,100 ,100 ,this);
}
public void actionPerformed ( ActionEvent e) {
if(e. getSource ()== next )
crt = ( crt +1)% imgs . length ;
else
crt = ( crt + imgs . length -1)% imgs . length ;
label. setText ( names [ crt ]);
repaint ();
}
}
Test durch Aufrufen der HTML-Datei im WWW-Browser oder mit appletviewer.
Aufgabe 59 (Ü)
Tabellenkalkulation
a)
public abstract class Expr {
public abstract int eval ();
}
public class Const extends Expr {
private int value ;
public Const (int v) {
value = v;
}
public int eval () {
return value ;
}
Lösung 13/ Seite 3
}
public class Add extends Expr {
private Expr lhs , rhs ;
public Add ( Expr x , Expr y) {
lhs =x;
rhs =y;
}
public int eval () {
return lhs . eval () + rhs . eval ();
}
}
public class UnMinus extends Expr {
private Expr e;
public UnMinus ( Expr x) {
e=x;
}
public int eval () {
return -e. eval ();
}
}
public class Ref extends Expr {
private Tabelle tab ;
private int col ;
private int row ;
public Ref ( Tabelle t , int r , int c) {
tab = t;
col = c;
row = r;
}
public int eval () {
return tab . evalZelle (row , col );
}
}
b)
public class Tabelle {
private
private
private
private
private
final int ROWS = 30;
final int COLS = 30;
Expr [][] zellen = new Expr [ ROWS ][ COLS ];
int[][] values = new int[ ROWS ][ COLS ];
boolean[][] isValid = new boolean[ ROWS ][ COLS ];
public Expr get (int i , int j) {
if (i >= 0 && i < ROWS && j >= 0 && j < COLS )
return zellen [i ][ j ];
Lösung 13/ Seite 4
else
return null;
}
public int evalZelle (int i , int j) {
if (i >= 0 && i < ROWS && j >= 0 && j < COLS && zellen [i ][ j] != null) {
if (! isValid [i ][ j ]) {
values [i ][ j] = zellen [i ][ j ]. eval ();
isValid [i ][ j] = true;
}
return values [i ][ j ];
}
throw new IllegalArgumentException (" Cell not set " );
}
public void setExpression (int i , int j , Expr e) {
// set cell
if (i >= 0 && i < ROWS && j >= 0 && j < COLS )
zellen [i ][ j] = e;
// invalid cache
for (int a = 0; a < ROWS ; a ++) {
for (int b = 0; b < COLS ; b ++) {
isValid [a ][ b] = false;
}
}
}
public static void main ( String [] args ) {
Tabelle t = new Tabelle ();
t. setExpression (1 ,1 , new Const (1));
t. setExpression (2 , 3, new Ref (t ,1 ,1));
System . out . println (t. evalZelle (2 ,3));
t. setExpression (1 ,1 , new Const (3));
System . out . println (t. evalZelle (2 ,3));
}
}
Aufgabe 60 (H) Minensuche
import
import
import
import
(15+5 Punkte)
java . awt .*;
java . applet . Applet ;
java . awt . Frame ;
java . awt . event .*;
public class Minensuche extends Applet implements ActionListener {
int breite , hoehe , minen ;
int[] minenpos ;
Feld [] felder ;
boolean[] scharf ;
int punktestand = 0;
Button start = new Button (" Start " );;
Panel p1 ;
TextField t1 ,t2 ,t3 , t4 ;
Image bomb , att ;
Lösung 13/ Seite 5
Thread uhrThread ;
private class Uhr extends Panel implements Runnable {
int uhrzeit ;
public Uhr (int uhrzeit ){
this. uhrzeit = uhrzeit ;
}
public void run (){
for(int i = uhrzeit ; i !=2*( uhrzeit /3); i - -){
try{
Thread . sleep (1000);
}catch( InterruptedException ie ){}
uhrzeit - -;
repaint ();
}
for(int i =0; i < minen ;i ++){
try{
Thread . sleep ((new java . util . Random ()). nextInt (3000));
}catch( InterruptedException ie ){}
felder [ minenpos [i ]]. explodiere ();
}
}
public Dimension getMinimumSize (){
return new Dimension (100 ,20);
}
public Dimension getPreferredSize (){
return getMinimumSize ();
}
public void paint ( Graphics g ){
g. drawRect (0 ,0 , getBounds (). width , getBounds (). height );
g. drawString (""+ uhrzeit , getBounds (). width /2 , getBounds (). height /2);
}
}
public void vermine (){
int[] m = new int[ minen ];
for(int i =0;i < minen ;i ++){
int s = (new java . util . Random ()). nextInt ( breite * hoehe );
boolean gleich = true; //vermeide doppelte eintraege
while( gleich && i !=0){
for(int j =0;j <i;j ++){
if(m[j] == s ){
s = (new java . util . Random ()). nextInt ( breite * hoehe );
break;
}else
gleich = false;
}
}
minenpos [i] = s;
m[i] = s;
}
}
Lösung 13/ Seite 6
public void init (){
bomb = getImage ( getCodeBase () , " bomb . jpeg " );
att = getImage ( getCodeBase () , " attention . jpeg " );
setLayout (new BorderLayout ());
setBackground ( Color . white );
Panel p2 = new Panel (new GridLayout (2 ,5));
p2 . add (new Label (" Hoehe des Spielfeldes " ));
p2 . add ( t1 =new TextField (" 10 " ));
p2 . add (new Label (" Breite des Spielfeldes " ));
p2 . add ( t2 =new TextField (" 10 " ));
p2 . add (new Label (" Anzahl der Minen " ));
p2 . add ( t3 =new TextField (" 10 " ));
p2 . add (new Label (" maximale Spielzeit in Sekunden " ));
p2 . add ( t4 =new TextField (" 60 " ));
start . addActionListener (this);
add (p2 , BorderLayout . NORTH );
add ( start , BorderLayout . SOUTH );
p1 = new Panel ();
add (p1 , BorderLayout . CENTER );
}
public void actionPerformed ( ActionEvent e) {
if (e. getSource () == start ){
p1 . removeAll ();
//setze parameter hoehe, breite
hoehe = new Integer ( t1 . getText ());
breite = new Integer ( t2 . getText ());
minen = new Integer ( t3 . getText ());
Uhr uhr = new Uhr (new Integer ( t4 . getText ()));
add (uhr , BorderLayout . EAST );
uhrThread = new Thread ( uhr );
uhrThread . start ();
minenpos = new int[ minen ];
felder = new Feld [ breite * hoehe ];
scharf = new boolean[ minen ];
p1 . setLayout (new GridLayout ( breite , hoehe ));
for(int i =0;i < breite * hoehe ; i ++)
p1 . add ( felder [i ]=new Feld (i ));
vermine ();
p1 . repaint ();
}
}
public int berechneMinen (int s ){
int summe = 0;
int x = s% breite ;
int y = s/ breite ;
for(int i =0; i < minenpos . length ;i ++){
Lösung 13/ Seite 7
int minenx = minenpos [i ]% breite ;
int mineny = minenpos [i ]/ breite ;
if( Math . abs ( minenx -x) <2 && Math . abs ( mineny -y ) <2) summe ++;
}
return summe ;
}
public class Feld extends Panel {
int x;
boolean aufgedeckt = false;
boolean scharf = true;
boolean markiert = false;
boolean explodiert , gameOver = false;
public void verdecke (int s ){
int xKoor = s% breite ;
int yKoor = s/ breite ;
for (int i = Math . max (0 , xKoor -1); i < Math . min ( xKoor +2 , breite ); i ++) {
for (int j = Math . max (0 , yKoor -1); j < Math . min ( yKoor +2 , hoehe ); j ++) {
if( felder [i+j* breite ]. aufgedeckt ){
punktestand -= berechneMinen (s );
felder [i+j* breite ]. aufgedeckt =false;
}
if(! felder [i+j* breite ]. scharf ){
punktestand -= 5;
felder [i+j* breite ]. scharf =true;
}
if( felder [i+j* breite ]. markiert ){
punktestand -= 5;
felder [i+j* breite ]. markiert =false;
}
}
}
}
public void explodiere (){
if(! scharf ) return;
aufgedeckt = true; explodiert = true;
verdecke (x );
repaint ();
}
public void endExplosion (){
for(int i =0; i < minen ;i ++)
felder [ minenpos [i ]]. explodiert =true;
getParent (). repaint ();
}
public Feld (int x ){
this.x=x;
addMouseListener (new MouseAdapter (){
public void mouseClicked ( MouseEvent e ){
if(e. getButton () == MouseEvent . BUTTON3 )
markiere ();
else
aufdecken ();
Lösung 13/ Seite 8
}
});
}
public void markiere (){
for(int i =0;i < minen ;i ++){
if( minenpos [i ]== x ){
punktestand +=10;
scharf = false;
}
}
markiert = true;
repaint ();
}
public void aufdecken (){
aufgedeckt = true;
for(int i =0;i < minen ;i ++){
if( minenpos [i ]== x ){
explodiert = true; gameOver = true;
}
}
punktestand += berechneMinen (x );
repaint ();
}
public void paint ( Graphics g ){
g. drawRect (0 ,0 , g. getClipBounds (). width , g. getClipBounds (). height );
if( gameOver ){
endExplosion ();
uhrThread = null; //uhrThread.stop();
p1 . removeAll ();
p1 . add (new Label (" Game over " ));
}
if( aufgedeckt ) {
g. drawString (""+ berechneMinen (x), getBounds (). width /2 , getBounds (). height /2)
}
if((! scharf ) || markiert ){
if( att != null) g. drawImage (att , getBounds (). width /2 , getBounds (). height /2 , g
}
if( explodiert ){
if( bomb != null)g. drawImage ( bomb , getBounds (). width /4 , getBounds (). height /4 ,
getBounds (). width /2 , getBounds (). height /2 ,this);
}
}
}
}