Subtrees hinzugefügt
This commit is contained in:
parent
155d0786a6
commit
3cc08a2004
443 changed files with 131415 additions and 0 deletions
7
Quellcodes/Alg_DS_Snake/.gitignore
vendored
Normal file
7
Quellcodes/Alg_DS_Snake/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
**/*.sh
|
||||
**/*.class
|
||||
**/*.ctxt
|
||||
repo.adoc
|
||||
repo_subtree.adoc
|
||||
/alt
|
||||
/hide
|
||||
12
Quellcodes/Alg_DS_Snake/01_snake_roh/Apple.java
Normal file
12
Quellcodes/Alg_DS_Snake/01_snake_roh/Apple.java
Normal 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
|
||||
{
|
||||
|
||||
}
|
||||
32
Quellcodes/Alg_DS_Snake/01_snake_roh/Queue.java
Normal file
32
Quellcodes/Alg_DS_Snake/01_snake_roh/Queue.java
Normal 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();
|
||||
}
|
||||
7
Quellcodes/Alg_DS_Snake/01_snake_roh/README.TXT
Normal file
7
Quellcodes/Alg_DS_Snake/01_snake_roh/README.TXT
Normal 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
|
||||
102
Quellcodes/Alg_DS_Snake/01_snake_roh/Snake.java
Normal file
102
Quellcodes/Alg_DS_Snake/01_snake_roh/Snake.java
Normal 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);
|
||||
}
|
||||
}
|
||||
12
Quellcodes/Alg_DS_Snake/01_snake_roh/SnakeElement.java
Normal file
12
Quellcodes/Alg_DS_Snake/01_snake_roh/SnakeElement.java
Normal 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
|
||||
{
|
||||
|
||||
}
|
||||
71
Quellcodes/Alg_DS_Snake/01_snake_roh/SnakeWorld.java
Normal file
71
Quellcodes/Alg_DS_Snake/01_snake_roh/SnakeWorld.java
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
BIN
Quellcodes/Alg_DS_Snake/01_snake_roh/images/apple1.png
Normal file
BIN
Quellcodes/Alg_DS_Snake/01_snake_roh/images/apple1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 680 B |
BIN
Quellcodes/Alg_DS_Snake/01_snake_roh/images/ball.png
Normal file
BIN
Quellcodes/Alg_DS_Snake/01_snake_roh/images/ball.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.8 KiB |
BIN
Quellcodes/Alg_DS_Snake/01_snake_roh/images/transparent.png
Normal file
BIN
Quellcodes/Alg_DS_Snake/01_snake_roh/images/transparent.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 177 B |
83
Quellcodes/Alg_DS_Snake/01_snake_roh/project.greenfoot
Normal file
83
Quellcodes/Alg_DS_Snake/01_snake_roh/project.greenfoot
Normal 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
|
||||
12
Quellcodes/Alg_DS_Snake/02_snake_loes/Apple.java
Normal file
12
Quellcodes/Alg_DS_Snake/02_snake_loes/Apple.java
Normal 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
|
||||
{
|
||||
|
||||
}
|
||||
124
Quellcodes/Alg_DS_Snake/02_snake_loes/ArrayQueue.java
Normal file
124
Quellcodes/Alg_DS_Snake/02_snake_loes/ArrayQueue.java
Normal 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() + " <";
|
||||
}
|
||||
}
|
||||
32
Quellcodes/Alg_DS_Snake/02_snake_loes/Queue.java
Normal file
32
Quellcodes/Alg_DS_Snake/02_snake_loes/Queue.java
Normal 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();
|
||||
}
|
||||
7
Quellcodes/Alg_DS_Snake/02_snake_loes/README.TXT
Normal file
7
Quellcodes/Alg_DS_Snake/02_snake_loes/README.TXT
Normal 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
|
||||
131
Quellcodes/Alg_DS_Snake/02_snake_loes/Snake.java
Normal file
131
Quellcodes/Alg_DS_Snake/02_snake_loes/Snake.java
Normal 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);
|
||||
}
|
||||
}
|
||||
12
Quellcodes/Alg_DS_Snake/02_snake_loes/SnakeElement.java
Normal file
12
Quellcodes/Alg_DS_Snake/02_snake_loes/SnakeElement.java
Normal 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
|
||||
{
|
||||
|
||||
}
|
||||
71
Quellcodes/Alg_DS_Snake/02_snake_loes/SnakeWorld.java
Normal file
71
Quellcodes/Alg_DS_Snake/02_snake_loes/SnakeWorld.java
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
BIN
Quellcodes/Alg_DS_Snake/02_snake_loes/images/apple1.png
Normal file
BIN
Quellcodes/Alg_DS_Snake/02_snake_loes/images/apple1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 680 B |
BIN
Quellcodes/Alg_DS_Snake/02_snake_loes/images/ball.png
Normal file
BIN
Quellcodes/Alg_DS_Snake/02_snake_loes/images/ball.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.8 KiB |
BIN
Quellcodes/Alg_DS_Snake/02_snake_loes/images/transparent.png
Normal file
BIN
Quellcodes/Alg_DS_Snake/02_snake_loes/images/transparent.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 177 B |
96
Quellcodes/Alg_DS_Snake/02_snake_loes/project.greenfoot
Normal file
96
Quellcodes/Alg_DS_Snake/02_snake_loes/project.greenfoot
Normal 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
|
||||
11
Quellcodes/Alg_DS_Snake/readme.adoc
Normal file
11
Quellcodes/Alg_DS_Snake/readme.adoc
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
= Material :
|
||||
|
||||
|===
|
||||
|Zuordnung|
|
||||
|Klassenstufe|
|
||||
|Bildungsplanbezug |
|
||||
|Werkzeug|
|
||||
|Autoren|
|
||||
|===
|
||||
|
||||
== Inhalt
|
||||
Loading…
Add table
Add a link
Reference in a new issue