Die Ansteuerung für das LCD-Display, auf der später Informationen wie Motorauslastung und Turbodruck angezeigt werden, ist fertig. Zum Test haben wir ein kleines Spiel für das 16*2 Display programmiert.

Wenn jemand Lust hat es auszuprobieren, hier ist der Sourcecode:

 

 

/*
Autoren: Daniel Wuggenig & Michelle Kilzer
Datum: 09.07.2014 11:35
Beschreibung: Minispiel bei dem man Gegenständen ausweichen muss.
Blöcke spawnen random und kommen von links nach rechts.
Zwischen den Blöcken ist mindestens 2 Blöcke nichts.
Kommt man bei einem Block an, hat man verloren.
*/
 
#include <LiquidCrystal.h>  //Bibliothek für Display Ansteuerung
 
LiquidCrystal lcd(8,9,4,5,6,7);  //Pinbelegung Display
 
boolean brick[16][2];    //2D-Array das speichert, ob sich an jeder Position ein Block befindet oder nicht. True=ein Block, False = kein Block
 
boolean player = true;  //True = Player ist in der oberen Reihe, False = Player ist in der unteren Reihe
 
void setup() {
	lcd.begin(16, 2);  //16*2 Display initialisieren
	lcd.print("Starting...");  //Start auf Display ausgeben
 
	for (int i = 0;i<16;i++)  //ganzes 2D-Array auf false setzen (kein Block am Anfang)
	{
		for (int j = 0;j<2;j++)
		{
			brick[i][j] = false;
		}
	}
}
int modTime = 100;    //Gibt die Anzahl der Durchläufe an
boolean lost = false;  //False = nicht verloren, True = verloren (Spielende)
 
void loop() {
	if (!lost)  //Überprüfen ob das Spiel aus ist
	{
		modTime++;  //modTime um eins erhöhen, da neuer Durchlauf
		delay((1/((float)modTime/100))*250);  //delay abhängig wie lange das Spiel bereits läuft
		if (modTime%2 == 0)  //in jeden 2. Durchlauf werden die Blöcke eine Position nach rechts verschoben
		{
			for (int i = 15;i>=0;i--)
			{
				for (int j = 0;j<2;j++)
				{
					brick[i][j] = brick[i-1][j];  //Blöcke nach rechts verschieben
				}
			}
			brick[0][0] = false;  //in der ersten Spalte sind keine Blöcke, da sie gerade nach rechts verschoben wurden
			brick[0][1] = false;
		}
		if (modTime%6==0)  //Alle 6 Durchläufe wird ein neuer Block gespawnt
		{
			int rN = random(2);  //zufällige Zahl, die angibt ob der Block in der oberen oder unteren Zeile landet.
			brick[0][rN] = true;  //erzeugt den Block
		}
		lcd.clear();    //Display wird gecleared, damit keine Übereste von alten Blöcken übrig bleiben
		for (int i = 0;i<16;i++)  // Array wird durchgegangen, wenn true wird ein block gezeichnet
		{
			for (int j = 0;j<2;j++)
			{
				lcd.setCursor(i,j);
				if (brick[i][j])
					lcd.print((char)219);  //Block wird gezeichnet (█)
			}
		}
		if (analogRead(A0)<110&&analogRead(A0)>90)  //Wenn der obere Knopf gedrückt wird
			player = true;    //Player wird auf die obere Zeile gesetzt
		else if (analogRead(A0)>240 && analogRead(A0)<270)  //Wenn der untere Knopf gedrückt wird
			player = false;  //Player wird auf die untere Zeile gesetzt
		if (player)  //Spieler zeichnen
		{
			lcd.setCursor(13,0);
			lcd.print((char)181);
			if (brick[13][0])  //Wenn an der Spielerposition ein Block ist, ist das Spiel aus
			{
				lost = true;
				lcd.clear();
			}
		}
		else
		{
 
			lcd.setCursor(13,1);  //Gleich wie oben nur für untere Zeile
			lcd.print((char)181);
			if (brick[13][1])
			{
				lost = true;
				lcd.clear();
			}
		}
	}
	else    //Spiel verloren
	{
		lcd.setCursor(0,0);
		lcd.print("Highscore:");    //Highscore ausgeben
		lcd.print(((modTime-100)/6)-4);  //1 Punkt für jeden Block, -4 weil am Anfang keine Blöcke sind
	}
}

Leave a Reply