Kapitel 14: "Entwicklung einer größeren Anwendung"

"TeeTristSpielfeld.java"


import java.util.Random;

public class TeeTristSpielfeld {
static final int RUNTER = 0;
static final int LINKS = 1;
static final int RECHTS = 2;
static final int DREHE = 3;
static final int FALLEN = 4;

private TeeTristStein steinTypen[] = new TeeTristStein[7];
private TeeTristStein aktuellerStein;
public int position[][];
private int[] boxenProZeile;
private int maxZeile, minZeile;
public int hoehe, breite, punkte;

// Konstruktor
public TeeTristSpielfeld(int breite, int hoehe) {
position = new int[breite][hoehe+4];
boxenProZeile = new int[hoehe+4];

this.breite = breite;
this.hoehe = hoehe;

for(int id = TeeTristStein.ID_I; id <= TeeTristStein.ID_Z; id++)
steinTypen[id] = new TeeTristStein(id);

reset();
}

// Reset-Methode
public void reset() {
for (int y=0; y < hoehe+4; y++) {
boxenProZeile[y] = 0;
for (int x=0; x < breite; x++)
position[x][y] = -1;
}

maxZeile = -1;
punkte = 0;
}

public boolean bewege(int typ) {
TeeTristStein neuerStein;
boolean bewegt;
int x,y;
for (int i=0; i < 4; i++) {
x = aktuellerStein.getPositionX(i);
y = aktuellerStein.getPositionY(i);
position[x][y] = -1;
}

neuerStein = new TeeTristStein(aktuellerStein);
switch(typ) {
case RUNTER:
neuerStein.verschiebe(0,-1);
break;
case LINKS:
neuerStein.verschiebe(-1,0);
break;
case RECHTS:
neuerStein.verschiebe(1,0);
break;
case DREHE:
// Alternative hier ist die Linksrotation rotateLeft()
neuerStein.rotiereRechts();
break;
case FALLEN:
while (istKorrekt(neuerStein))
neuerStein.verschiebe(0,-1);
neuerStein.verschiebe(0,1);
break;
}
if (bewegt=istKorrekt(neuerStein))
aktuellerStein = neuerStein;

for (int i=0; i < 4; i++) {
x = aktuellerStein.getPositionX(i);
y = aktuellerStein.getPositionY(i);
position[x][y] = aktuellerStein.id;
}
return bewegt;
}

private boolean istKorrekt(TeeTristStein f) {
int x, y;
for(int i=0; i < 4; i++) {
x = f.getPositionX(i);
y = f.getPositionY(i);

if (x<0 || x>=this.breite || y<0)
return false;

if (position[x][y]!=-1)
return false;
}
return true;
}

public void wirfNaechstenStein() {
aktuellerStein = new TeeTristStein(steinTypen[(int)(Math.random()*steinTypen.length)]);

switch(aktuellerStein.id) {
case TeeTristStein.ID_I:
case TeeTristStein.ID_J:
case TeeTristStein.ID_L:
case TeeTristStein.ID_T:
aktuellerStein.setPosition(breite/2, hoehe);
break;
default:
aktuellerStein.setPosition(breite/2, hoehe+1);
}
}

public boolean istVoll() {
return maxZeile>=hoehe;
}

public void ueberpruefeZeilen() {
int y, inc;
minZeile = Integer.MAX_VALUE;
for(int i=0; i < 4; i++) {
y = aktuellerStein.getPositionY(i);
boxenProZeile[y]++;
maxZeile = Math.max(maxZeile, y);
minZeile = Math.min(minZeile, y);
}

for (y=minZeile+3, inc=1; y>=minZeile; y--) {
if (boxenProZeile[y]==this.breite) {
for (int i=y; i < maxZeile; i++) {
for (int j=0; j < breite; j++)
position[j][i] = position[j][i+1];
boxenProZeile[i] = boxenProZeile[i+1];
}

for(int i=0; i < breite; i++)
position[i][maxZeile] = -1;

boxenProZeile[maxZeile] = 0;
maxZeile--;
punkte+=(inc++)*50;
}
}
}
}

Picksel Media Marco Block © 2006-2009 – ImpressumKontakt
Gestaltung und Umsetzung Tobias Losch, www.picksel-media.de