xxxxxxxxxx
import java.util.*;
Card[] cards;
PImage backing;
int[] suits;
int[] values;
int showing;
int cardW = 100;
int cardH = 100;
int rows = 6;
int columns = 8;
int totalCards = rows * columns;
PImage[] cardImages = new PImage[totalCards];
PImage test;
boolean checkCards = false;
long revealTime = 0;
int firstRevealedCard = -1;
int secondRevealedCard = -1;
void setup() {
size(910, 690);
backing = loadImage( "sun.png" );
for(int i=1; i<=totalCards/2; i++) {
cardImages[i-1] = loadImage( i+".jpg" );
}
cards = new Card[totalCards];
suits = new int[totalCards];
values = new int[totalCards];
// generate random list of numbers from 1 to totalCards
List<Integer> list = new ArrayList<Integer>(totalCards);
for (int i = 0; i < totalCards; i++) {
list.add(i);
}
for (int i = list.size() - 1; i > 0; i--) {
int index = random(list.size());
int temp = list.get(index);
list.set(index, list.get(i));
list.set(i, temp);
}
for (int i=0; i < totalCards/2; i++) {
suits[i] = 0;
int firstIndex = list.get(list.size() - 1);
int secondIndex = list.get(list.size() - 2);
values[firstIndex] = i;
values[secondIndex] = i;
list.remove(list.size() - 1);
list.remove(list.size() - 1);
}
for (int i=0; i < totalCards; i++) {
//println(values[i]);
}
showing = 0; // Keeps track of how many cards are faceup...
int t = 0;
for ( int i=0; i<rows; i++) {
for ( int j=0; j<columns;j++) {
cards[t] = new Card( 20+(cardW+10)*j, 20 + (cardH + 10)*i, cardW, cardH, suits[t], values[t] );
t++;
}
}
}
void draw() {
background(150, 0, 128);
for ( int t=0; t < cards.length; t++) {
cards[t].draw();
}
if(checkCards) {
if(values[firstRevealedCard] == values[secondRevealedCard]) {
matchRevealedCards();
} else {
if(millis() - revealTime >= 3000) {
hideRevealedCards();
}
}
}
}
void matchRevealedCards() {
cards[firstRevealedCard].setMatched();
cards[secondRevealedCard].setMatched();
firstRevealedCard = -1;
secondRevealedCard = -1;
checkCards = false;
}
void hideRevealedCards() {
cards[firstRevealedCard].hide();
cards[secondRevealedCard].hide();
firstRevealedCard = -1;
secondRevealedCard = -1;
checkCards = false;
}
void mouseClicked() {
for ( int t=0; t < cards.length; t++) {
cards[t].mouseClick(t);
}
}
class Card {
int x, y, w, h;
int suit, value;
boolean show;
boolean matched;
Card( int x, int y, int w, int h, int suit, int value) {
//println(x, y);
this.x=x;
this.y=y;
this.w=w;
this.h=h;
this.suit=suit;
this.value=value;
show = false;
}
void draw() {
if ( !show ) {
image( backing, x+5, y+5, cardW-10, cardH-10 );
noFill();
stroke(255);
if ( mouseOverMe() ) {
stroke(255, 0, 0);
}
rect(x, y, w, h);
} else {
image( cardImages[value], x+5, y+5, cardW-10, cardH-10 );
noFill();
noStroke();
if ( matched ) {
stroke(0, 255, 0);
}
rect(x, y, w, h);
}
}
boolean mouseOverMe() {
return( mouseX >= x && mouseX < x+w && mouseY >= y && mouseY < y+h );
}
void setMatched() {
matched = true;
}
void hide() {
show = false;
}
void mouseClick(int index) {
if ( mouseOverMe() && !show ) {
if(firstRevealedCard != -1 && secondRevealedCard != -1) {
hideRevealedCards();
}
show = !show;
showing++;
if(firstRevealedCard == -1) {
firstRevealedCard = index;
} else if(secondRevealedCard == -1) {
secondRevealedCard = index;
checkCards = true;
revealTime = millis();
}
}
}
}