Subtrees hinzugefügt

This commit is contained in:
Dirk Zechnall 2025-01-05 21:22:02 +01:00
parent 155d0786a6
commit 3cc08a2004
443 changed files with 131415 additions and 0 deletions

7
Quellcodes/Alg_DS_Snake/.gitignore vendored Normal file
View file

@ -0,0 +1,7 @@
**/*.sh
**/*.class
**/*.ctxt
repo.adoc
repo_subtree.adoc
/alt
/hide

View file

@ -0,0 +1,12 @@
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
/**
* Stellt einen Apfel dar, den die Schlange fressen soll
*
* @author Rainer Helfrich
* @version April 2020
*/
public class Apple extends Actor
{
}

View file

@ -0,0 +1,32 @@
/**
* Abstrakte Basisklasse für Queues
*
* @author Rainer Helfrich
* @version Oktober 2020
*/
public abstract class Queue<T>
{
/**
* Gibt zurück, ob die Queue leer ist
* @return true, wenn die Queue leer ist; false sonst
*/
public abstract boolean isEmpty();
/**
* Fügt ein neues Element hinten in der Schlange ein
* @param x Das neue Element
*/
public abstract void enqueue(T x);
/**
* Entfernt das vorderste Element aus der Queue (falls sie nicht leer ist) und gibt es zurück
* @return Das bisherige vorderste Element
*/
public abstract T dequeue();
/**
* Gibt das vorderste Element der Queue zurück (falls sie nicht leer ist)
* @return Das vorderste Element
*/
public abstract T front();
}

View file

@ -0,0 +1,7 @@
PROJECT TITLE: Snake
PURPOSE OF PROJECT: Implementieren Sie ein Snake-Spiel
VERSION or DATE: April 2020
HOW TO START THIS PROJECT: Klicken Sie nach dem Kompilieren auf "Run" und drücken Sie die Leertaste
AUTHORS: Rainer Helfrich, ZPG Informatik
Verwendete Bilder aus der Greenfoot-Bibliothek

View file

@ -0,0 +1,102 @@
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.util.List;
/**
* Die Schlange, die vom Spieler gesteuert wird
*
* @author Rainer Helfrich
* @version April 2020
*/
public class Snake extends Actor
{
/**
* Die Queue, die die Körperelemente enthält
*/
private Queue<SnakeElement> theQueue;
/**
* Die aktuelle Bewegungsrichtung der Schlange
*/
private char richtung;
/**
* Konstanten für die vier Bewegungsrichtungen
*/
private final char OBEN = 'w';
private final char UNTEN = 's';
private final char LINKS = 'a';
private final char RECHTS = 'd';
/**
* Erzeugt eine neue Schlange und platziert sie in der Welt.
*/
public Snake(World w)
{
//# TODO: Erzeugen Sie eine neue Queue
//# Ende TODO
if (theQueue != null)
{
SnakeElement el = new SnakeElement();
w.addObject(el, 15, 10);
theQueue.enqueue(el);
el = new SnakeElement();
w.addObject(el, 14, 10);
theQueue.enqueue(el);
}
richtung = RECHTS;
}
/**
* Prüft, ob die Taste zum Buchstaben c gedrückt ist
* @param c Die Taste, die überprüft wird
* @return true, wenn die Taste gedrückt ist; false sonst
*/
private boolean isKeyDown(char c)
{
return Greenfoot.isKeyDown(""+c);
}
/**
* Wird in jedem Zeitschritt aufgerufen
*/
public void act()
{
if (isKeyDown(OBEN) && richtung != UNTEN)
{
richtung = OBEN;
}
else if (isKeyDown(UNTEN) && richtung != OBEN)
{
richtung = UNTEN;
}
else if (isKeyDown(LINKS) && richtung != RECHTS)
{
richtung = LINKS;
}
else if (isKeyDown(RECHTS) && richtung != LINKS)
{
richtung = RECHTS;
}
SnakeWorld sw = (SnakeWorld)getWorld();
int x = getX();
int y = getY();
//# TODO
//# Bestimmen Sie die neue Position (x,y) der Schlange
//# Achtung: Was passiert, wenn die Schlange aus dem Spielfeld herausfährt?
//# Finden Sie heraus, ob sich an der Position des Kopfes ein Apfel befindet
//# Wenn ja, entfernen Sie den Apfel aus der Welt und platzieren Sie einen neuen Apfel in der Welt.
//# Wenn nein: Befindet sich ein Körperteil der Schlange an der Position des Kopfes? Wenn ja, ist das Spiel verloren.
//# Wenn auch das nicht der Fall ist, wird nur der letzte Teil des Schwanzes entfernt.
//# In jedem Fall wird an der neuen Position ein neuer Kopf erzeugt und in die Schlange eingefügt.
//# Ende TODO
setLocation(x, y);
}
}

View file

@ -0,0 +1,12 @@
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
/**
* Ein Körperelement der Schlange
*
* @author Rainer Helfrich
* @version April 2020
*/
public class SnakeElement extends Actor
{
}

View file

@ -0,0 +1,71 @@
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
/**
* Die Welt, in der sich die Schlange bewegt
*
* @author Rainer Helfrich
* @version 2020-04-08
*/
public class SnakeWorld extends World
{
/**
* Die Ausführungsgeschwindigkeit
*/
private int speed;
/**
* Erzeugt eine neue Welt
*/
public SnakeWorld()
{
super(30, 20, 20);
}
/**
* Platziert einen neuen Apfel an einer freien Stelle in der Welt
*/
public void placeApple()
{
Apple a = new Apple();
int x, y;
do
{
x = Greenfoot.getRandomNumber(getWidth());
y = Greenfoot.getRandomNumber(getHeight());
} while (getObjectsAt(x, y, SnakeElement.class).size() > 0);
addObject(a, x, y);
if (speed < 49) // danach nicht mehr spielbar
{
speed++;
Greenfoot.setSpeed(speed);
}
}
/**
* Wird aufgerufen, wenn das Spiel verloren ist.
* Zeigt eine Nachricht und die Punktezahl an.
*/
public void setGameOver()
{
int points = getObjects(SnakeElement.class).size() - 2;
removeObjects(getObjects(null));
getBackground().drawImage(new GreenfootImage("Game over", 64, null, null), 170, 130);
getBackground().drawImage(new GreenfootImage("Punkte: " + points, 40, null, null), 220, 220);
}
/**
* Wartet auf das Drücken der Leertaste, um das Spiel zu initialisieren
*/
public void act()
{
if (Greenfoot.isKeyDown("space") &&
getObjects(Snake.class).isEmpty())
{
setBackground((GreenfootImage)null);
Snake s = new Snake(this);
addObject(s, 15,10);
speed = 22;
placeApple();
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 680 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 B

View file

@ -0,0 +1,83 @@
#Greenfoot project file
class.Apple.image=apple1.png
class.Snake.image=transparent.png
class.SnakeElement.image=ball.png
dependency1.from=SnakeWorld
dependency1.to=Apple
dependency1.type=UsesDependency
dependency2.from=SnakeWorld
dependency2.to=Snake
dependency2.type=UsesDependency
dependency3.from=SnakeWorld
dependency3.to=SnakeElement
dependency3.type=UsesDependency
dependency4.from=Snake
dependency4.to=Queue
dependency4.type=UsesDependency
dependency5.from=Snake
dependency5.to=SnakeElement
dependency5.type=UsesDependency
dependency6.from=Snake
dependency6.to=SnakeWorld
dependency6.type=UsesDependency
editor.fx.0.height=739
editor.fx.0.width=1195
editor.fx.0.x=552
editor.fx.0.y=100
height=795
package.numDependencies=6
package.numTargets=5
project.charset=UTF-8
publish.hasSource=false
publish.locked=true
publish.longDesc=
publish.shortDesc=
publish.tags=
publish.title=
publish.url=
readme.height=58
readme.name=@README
readme.width=47
readme.x=10
readme.y=10
simulation.speed=68
target1.height=50
target1.name=Apple
target1.showInterface=false
target1.type=ClassTarget
target1.width=80
target1.x=0
target1.y=0
target2.height=50
target2.name=SnakeElement
target2.showInterface=false
target2.type=ClassTarget
target2.width=100
target2.x=0
target2.y=0
target3.height=50
target3.name=Snake
target3.showInterface=false
target3.type=ClassTarget
target3.width=80
target3.x=0
target3.y=0
target4.height=50
target4.name=SnakeWorld
target4.showInterface=false
target4.type=ClassTarget
target4.width=90
target4.x=0
target4.y=0
target5.height=50
target5.name=Queue
target5.showInterface=false
target5.type=AbstractTarget
target5.width=80
target5.x=0
target5.y=0
version=3.0.0
width=1175
world.lastInstantiated=SnakeWorld
xPosition=15
yPosition=44

View file

@ -0,0 +1,12 @@
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
/**
* Stellt einen Apfel dar, den die Schlange fressen soll
*
* @author Rainer Helfrich
* @version April 2020
*/
public class Apple extends Actor
{
}

View file

@ -0,0 +1,124 @@
/**
* Queue basierend auf einem Array
*
* @author Rainer Helfrich
* @version Oktober 2020
*/
public class ArrayQueue<T> extends Queue<T>
{
/**
* Die Nutzdaten
*/
private Object[] daten;
/**
* Der Index des ersten Wertes
*/
private int first;
/**
* Der nächste freie Index
*/
private int last;
/**
* Erzeugt eine neue, leere Queue
*/
public ArrayQueue()
{
daten = new Object[10];
first = 0;
last = 0;
}
/**
* Fügt ein neues Element hinten in der Schlange ein
* @param x Das neue Element
*/
public void enqueue(T x)
{
daten[last] = x;
last++;
if (last == daten.length)
{
last = 0;
}
if (last == first) // Vergrößerung nötig
{
Object[] tmp = new Object[daten.length*2];
System.arraycopy(daten, first, tmp, 0, daten.length - first);
System.arraycopy(daten, 0, tmp, daten.length - first, first);
first = 0;
last = daten.length;
daten = tmp;
}
}
/**
* Gibt das vorderste Element der Queue zurück (falls sie nicht leer ist)
* @return Das vorderste Element
*/
public T front()
{
if (isEmpty())
{
return null;
}
return (T)daten[first];
}
/**
* Entfernt das vorderste Element aus der Queue (falls sie nicht leer ist) und gibt es zurück
* @return Das bisherige vorderste Element
*/
public T dequeue()
{
T x = null;
if (!isEmpty())
{
x = (T)daten[first];
first++;
if (first == daten.length)
{
first = 0;
}
}
return x;
}
/**
* Gibt zurück, ob die Queue leer ist
* @return true, wenn die Queue leer ist; false sonst
*/
public boolean isEmpty()
{
return first == last;
}
/**
* Gibt die Queue in String-Form aus.
* @return Die String-Repräsentation der Queue
*/
@Override
public String toString()
{
StringBuilder b = new StringBuilder();
for (int i = first; i < (last < first ? daten.length : last); i++)
{
if (i != first)
{
b.append(", ");
}
b.append(daten[i]);
}
if (last < first)
{
for (int i = 0; i < last; i++)
{
b.append(", " + daten[i]);
}
}
return "< " + b.toString() + " <";
}
}

View file

@ -0,0 +1,32 @@
/**
* Abstrakte Basisklasse für Queues
*
* @author Rainer Helfrich
* @version Oktober 2020
*/
public abstract class Queue<T>
{
/**
* Gibt zurück, ob die Queue leer ist
* @return true, wenn die Queue leer ist; false sonst
*/
public abstract boolean isEmpty();
/**
* Fügt ein neues Element hinten in der Schlange ein
* @param x Das neue Element
*/
public abstract void enqueue(T x);
/**
* Entfernt das vorderste Element aus der Queue (falls sie nicht leer ist) und gibt es zurück
* @return Das bisherige vorderste Element
*/
public abstract T dequeue();
/**
* Gibt das vorderste Element der Queue zurück (falls sie nicht leer ist)
* @return Das vorderste Element
*/
public abstract T front();
}

View file

@ -0,0 +1,7 @@
PROJECT TITLE: Snake
PURPOSE OF PROJECT: Implementieren Sie ein Snake-Spiel
VERSION or DATE: April 2020
HOW TO START THIS PROJECT: Klicken Sie nach dem Kompilieren auf "Run" und drücken Sie die Leertaste
AUTHORS: Rainer Helfrich, ZPG Informatik
Verwendete Bilder aus der Greenfoot-Bibliothek

View file

@ -0,0 +1,131 @@
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.util.List;
/**
* Die Schlange, die vom Spieler gesteuert wird
*
* @author Rainer Helfrich
* @version April 2020
*/
public class Snake extends Actor
{
/**
* Die Queue, die die Körperelemente enthält
*/
private Queue<SnakeElement> theQueue;
/**
* Die aktuelle Bewegungsrichtung der Schlange
*/
private char richtung;
/**
* Konstanten für die vier Bewegungsrichtungen
*/
private final char OBEN = 'w';
private final char UNTEN = 's';
private final char LINKS = 'a';
private final char RECHTS = 'd';
/**
* Erzeugt eine neue Schlange und platziert sie in der Welt.
*/
public Snake(World w)
{
theQueue = new ArrayQueue();
SnakeElement el = new SnakeElement();
w.addObject(el, 15, 10);
theQueue.enqueue(el);
el = new SnakeElement();
w.addObject(el, 14, 10);
theQueue.enqueue(el);
richtung = RECHTS;
}
/**
* Prüft, ob die Taste zum Buchstaben c gedrückt ist
* @param c Die Taste, die überprüft wird
* @return true, wenn die Taste gedrückt ist; false sonst
*/
private boolean isKeyDown(char c)
{
return Greenfoot.isKeyDown(""+c);
}
private int neuePosition(int p, int g)
{
if (p < 0)
{
p += g;
}
return p % g;
}
/**
* Wird in jedem Zeitschritt aufgerufen
*/
public void act()
{
if (isKeyDown(OBEN) && richtung != UNTEN)
{
richtung = OBEN;
}
else if (isKeyDown(UNTEN) && richtung != OBEN)
{
richtung = UNTEN;
}
else if (isKeyDown(LINKS) && richtung != RECHTS)
{
richtung = LINKS;
}
else if (isKeyDown(RECHTS) && richtung != LINKS)
{
richtung = RECHTS;
}
SnakeWorld sw = (SnakeWorld)getWorld();
int x = getX();
int y = getY();
if (richtung == OBEN)
{
y--;
}
else if (richtung == UNTEN)
{
y++;
}
else if (richtung == LINKS)
{
x--;
}
else if (richtung == RECHTS)
{
x++;
}
x = neuePosition(x, getWorld().getWidth());
y = neuePosition(y, getWorld().getHeight());
List<Apple> apples = sw.getObjectsAt(x, y, Apple.class);
SnakeElement el;
if (!apples.isEmpty())
{
Apple a = apples.get(0);
sw.removeObject(a);
sw.placeApple();
}
else
{
el = theQueue.dequeue();
sw.removeObject(el);
}
if (!sw.getObjectsAt(x, y, SnakeElement.class).isEmpty()) // Kollision mit sich selbst
{
sw.setGameOver();
return;
}
el = new SnakeElement();
sw.addObject(el, x, y);
theQueue.enqueue(el);
setLocation(x, y);
}
}

View file

@ -0,0 +1,12 @@
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
/**
* Ein Körperelement der Schlange
*
* @author Rainer Helfrich
* @version April 2020
*/
public class SnakeElement extends Actor
{
}

View file

@ -0,0 +1,71 @@
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
/**
* Die Welt, in der sich die Schlange bewegt
*
* @author Rainer Helfrich
* @version 2020-04-08
*/
public class SnakeWorld extends World
{
/**
* Die Ausführungsgeschwindigkeit
*/
private int speed;
/**
* Erzeugt eine neue Welt
*/
public SnakeWorld()
{
super(30, 20, 20);
}
/**
* Platziert einen neuen Apfel an einer freien Stelle in der Welt
*/
public void placeApple()
{
Apple a = new Apple();
int x, y;
do
{
x = Greenfoot.getRandomNumber(getWidth());
y = Greenfoot.getRandomNumber(getHeight());
} while (getObjectsAt(x, y, SnakeElement.class).size() > 0);
addObject(a, x, y);
if (speed < 49) // danach nicht mehr spielbar
{
speed++;
Greenfoot.setSpeed(speed);
}
}
/**
* Wird aufgerufen, wenn das Spiel verloren ist.
* Zeigt eine Nachricht und die Punktezahl an.
*/
public void setGameOver()
{
int points = getObjects(SnakeElement.class).size() - 2;
removeObjects(getObjects(null));
getBackground().drawImage(new GreenfootImage("Game over", 64, null, null), 170, 130);
getBackground().drawImage(new GreenfootImage("Punkte: " + points, 40, null, null), 220, 220);
}
/**
* Wartet auf das Drücken der Leertaste, um das Spiel zu initialisieren
*/
public void act()
{
if (Greenfoot.isKeyDown("space") &&
getObjects(Snake.class).isEmpty())
{
setBackground((GreenfootImage)null);
Snake s = new Snake(this);
addObject(s, 15,10);
speed = 22;
placeApple();
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 680 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 B

View file

@ -0,0 +1,96 @@
#Greenfoot project file
class.Apple.image=apple1.png
class.Snake.image=transparent.png
class.SnakeElement.image=ball.png
dependency1.from=SnakeWorld
dependency1.to=Apple
dependency1.type=UsesDependency
dependency2.from=SnakeWorld
dependency2.to=Snake
dependency2.type=UsesDependency
dependency3.from=SnakeWorld
dependency3.to=SnakeElement
dependency3.type=UsesDependency
dependency4.from=Snake
dependency4.to=Queue
dependency4.type=UsesDependency
dependency5.from=Snake
dependency5.to=SnakeElement
dependency5.type=UsesDependency
dependency6.from=Snake
dependency6.to=ArrayQueue
dependency6.type=UsesDependency
dependency7.from=Snake
dependency7.to=SnakeWorld
dependency7.type=UsesDependency
dependency8.from=Snake
dependency8.to=Apple
dependency8.type=UsesDependency
editor.fx.0.height=0
editor.fx.0.width=0
editor.fx.0.x=0
editor.fx.0.y=0
height=795
package.numDependencies=8
package.numTargets=6
project.charset=UTF-8
publish.hasSource=false
publish.locked=true
publish.longDesc=
publish.shortDesc=
publish.tags=
publish.title=
publish.url=
readme.height=58
readme.name=@README
readme.width=47
readme.x=10
readme.y=10
simulation.speed=68
target1.height=50
target1.name=ArrayQueue
target1.showInterface=false
target1.type=ClassTarget
target1.width=110
target1.x=0
target1.y=0
target2.height=50
target2.name=Apple
target2.showInterface=false
target2.type=ClassTarget
target2.width=80
target2.x=0
target2.y=0
target3.height=50
target3.name=SnakeElement
target3.showInterface=false
target3.type=ClassTarget
target3.width=100
target3.x=0
target3.y=0
target4.height=50
target4.name=Snake
target4.showInterface=false
target4.type=ClassTarget
target4.width=80
target4.x=0
target4.y=0
target5.height=50
target5.name=SnakeWorld
target5.showInterface=false
target5.type=ClassTarget
target5.width=90
target5.x=0
target5.y=0
target6.height=50
target6.name=Queue
target6.showInterface=false
target6.type=AbstractTarget
target6.width=80
target6.x=0
target6.y=0
version=3.0.0
width=1175
world.lastInstantiated=SnakeWorld
xPosition=454
yPosition=62

View file

@ -0,0 +1,11 @@
= Material :
|===
|Zuordnung|
|Klassenstufe|
|Bildungsplanbezug |
|Werkzeug|
|Autoren|
|===
== Inhalt