Created
January 27, 2015 13:13
-
-
Save CSchoel/e0f6c76bcf560c275c7d to your computer and use it in GitHub Desktop.
A simple bingo game
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//Autor: Christopher Schölzel | |
int bingoWidth = 5; //Anzahl der Felder in x-/y-Richtung | |
int fieldWidth = 50;//Feldbreite in pixeln | |
int[] bingo = new int[bingoWidth*bingoWidth]; //Feldinhalte | |
boolean[] marked = new boolean[bingo.length]; //Markierungen der Felder | |
int numberIndex = 0; //Index der gerade gezogenen Zahl | |
int[] numberSequence;//(gemischte) Sequenz von gezogenen Zahlen | |
int numberTimeout = 10000; //Timeout nach dem eine neue Zahl gezogen wird | |
int lastNumberTime = 0; //Zeitpunkt zu dem die letzte Zahl gezogen wurde | |
void setup() { | |
size(600,400); | |
//Array mit Zahlen von 1 bis 100 zufällig anordnen | |
int[] numbers = createNumbers(100); | |
shuffleArray(numbers); | |
//Bingofeld mit diesen Zahlen füllen | |
//=> zufällige Sequenz, keine Duplikate | |
for(int i = 0; i < bingo.length; i++) { | |
bingo[i] = numbers[i]; | |
} | |
//Weiteres array mit zufälliger Sequenz der Zahlen 1-100 | |
//für einfaches Zahlen ziehen ohne Duplikate | |
numberSequence = createNumbers(100); | |
shuffleArray(numberSequence); | |
//Testzeile, zum einfachen Überprüfen der Gewinnabfrage | |
//numberSequence = numbers; | |
} | |
//Erzeugt Array mit Zahlen von 1 bis howMany | |
int[] createNumbers(int howMany) { | |
int[] numbers = new int[howMany]; | |
for(int i = 0; i < numbers.length; i++) { | |
numbers[i] = i+1; | |
} | |
return numbers; | |
} | |
//Mischt ein Array ("Fischer-Yates-Shuffle") | |
void shuffleArray(int[] a) { | |
for(int i = 0; i < a.length; i++) { | |
int switchIdx = (int)random(a.length); | |
int tmp = a[i]; | |
a[i] = a[switchIdx]; | |
a[switchIdx] = tmp; | |
} | |
} | |
//Wechselt zur nächsten gezogenen Zahl | |
void switchNumber() { | |
if(numberIndex == numberSequence.length-1) gameOver(false); | |
numberIndex++; | |
lastNumberTime = millis(); | |
} | |
//Beendet das Spiel und zeigt eine entsprechende Meldung an | |
void gameOver(boolean won) { | |
draw(); //redraw | |
fill(255,0,0); | |
textSize(20); | |
text(won ? "Bingo!" : "Game over!",width/2.0,height/2.0); | |
noLoop(); | |
} | |
//Zeichnet ein Rechteck mit einer Nummer darin | |
void drawNumber(int number, color c, int x, int y) { | |
fill(c); | |
rect(x,y,fieldWidth,fieldWidth); | |
textAlign(CENTER); | |
fill(0); | |
textSize(12); | |
text(number,x+0.5*fieldWidth,y+0.5*fieldWidth+10); | |
} | |
//Prüft, ob eine ganze Reihe, Spalte oder Diagonale markiert ist | |
boolean isBingo() { | |
//horizontal und vertikal in einer doppelschleife | |
for(int x = 0; x < bingoWidth; x++) { | |
boolean rowMarked = true; | |
boolean colMarked = true; | |
for(int y = 0; y < bingoWidth; y++) { | |
int iRow = y*bingoWidth+x; | |
int iCol = x*bingoWidth+y; //für Spalten einfach x und y vertauschen | |
if (!marked[iRow]) rowMarked = false; | |
if (!marked[iCol]) colMarked = false; | |
} | |
if (colMarked || rowMarked) return true; | |
} | |
//Diagonale von links oben gestartet | |
boolean ldiagMarked = true; | |
for(int i = 0; i < bingo.length; i += bingoWidth+1) { | |
if(!marked[i]) ldiagMarked = false; | |
} | |
//Diagonale von rechts oben gestartet | |
boolean rdiagMarked = true; | |
for(int i = bingoWidth-1; i < bingo.length-1; i += bingoWidth-1) { | |
if(!marked[i]) rdiagMarked = false; | |
} | |
return ldiagMarked || rdiagMarked; | |
} | |
void draw() { | |
background(0); | |
for(int i = 0; i < bingo.length; i++) { | |
int x = i % bingoWidth; | |
int y = i / bingoWidth; | |
drawNumber(bingo[i],marked[i] ? #FF0000 : 255,x*fieldWidth,y*fieldWidth); | |
} | |
drawNumber(numberSequence[numberIndex],255,width-fieldWidth,0); | |
if(millis()-lastNumberTime > numberTimeout) switchNumber(); | |
} | |
void mouseClicked() { | |
int x = (int)(mouseX/fieldWidth); | |
int y = (int)(mouseY/fieldWidth); | |
int i = y*bingoWidth+x; //Index im Feldarray | |
if (i >= bingo.length) return; | |
if(bingo[i] == numberSequence[numberIndex]) { | |
//geklicktes Feld hat die Nummer, die aktuell gezogen wurde | |
marked[i] = true; | |
if (isBingo()) gameOver(true); | |
else switchNumber(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment