Skip to content

Instantly share code, notes, and snippets.

@CSchoel
Created January 27, 2015 13:13
Show Gist options
  • Save CSchoel/e0f6c76bcf560c275c7d to your computer and use it in GitHub Desktop.
Save CSchoel/e0f6c76bcf560c275c7d to your computer and use it in GitHub Desktop.
A simple bingo game
//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