This site requires JavaScript, please enable it in your browser!
Greenfoot back
JollyGreenGiant
JollyGreenGiant wrote ...

2020/4/26

How do i make a simple memory card game?

1
2
3
4
5
JollyGreenGiant JollyGreenGiant

2020/4/27

#
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Write a description of class Card here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class Card extends Actor
{
    boolean showing;
    GreenfootImage back;
    int front;
    private static firstClicked; 
 
    
    protected GreenfootImage[] images;
    protected int imagesIndex;
    
    public Card(String theBack, int theFront)
    {
        showing = false;
        back = theBack;
        front = theFront;
    }
    
    public void showCard()
    {
        if (showing)
           System.out.print(String.format("%10s",back));
        else
            System.out.print(String.format("%10s","["+front+"]"));
    }
    
    public void SetShowingStatus()
    {
        if(showing)
            showing = false;
        else
            showing = true;
    }
    
     
    public void firstClicked()
    {
    this.flip();
    Greenfoot.delay(40);
    if (firstClicked == null)
    {
        firstClicked = this;
    }
    else
    {
        String image1 = firstClicked.getImage().toString().substring(17);;
        image1 = image1.substring(0, image1.indexOf("   "));
        String image2 = this.getImage().toString().substring(17);;
        image2 = image2.substring(0, image2.indexOf("   "));
        if (image1.equals(image2))
        {
            Greenfoot.playSound("fanfare.wav"); // example code
            addObject(new Correct(), getX(), getY()+100); // or wherever
        }
        else
        {
            Greenfoot.playSound("wrong.wav"); // example code
            firstClicked.flip();
            this.flip();
        }
        firstClicked = null;
    }
   }
 

    private void flip()
   {
    imageIndex = (imageIndex+1)%2;
    setImage(images[imageIndex]);
   }
   
    public void ifCorrect()
   {
    if((card1Flipped == true) && (card2Flipped == true))
    {
        Greenfoot.delay(30);
        displayCorrect();
        getWorld().removeObjects(getWorld().getObjects(Card2.class));
        getImage().setTransparency(0);
    }
     else if((card3Flipped == true) && (card4Flipped == true))
    {
        Greenfoot.delay(30);
        displayCorrect();
        getWorld().removeObjects(getWorld().getObjects(Card3.class));
        getWorld().removeObjects(getWorld().getObjects(Card4.class));
 
    }
    else
    {
        flipBack();
    }
    
    if (secondCard == null)
    {
    Cards card = pickedCard();
    if (firstCard == null)
    {
        firstCard = card;
    }
    else
    {
        secondCard = card;
        if (firstCardImage().equals(secondCardImage()))
        {    
            correctSequence = true;
            initializeCorrectSequence();
        }
        else
        {
            wrongSequence = true;
            initializeWrongSequence();
        }
    }
    }
    else
    {
    if (wrongSequence)
    {
        performWrongSequenceStep();
        if (lastWrongsequenceStep())
        {
            wrongSequence = false;
            firstCard = null;
            secondCard = null;
        }
    }
    else if (correctSequence)
    {
        performCorrectSequenceStep();
        if (lastCorrectSequenceStep())
        {
            correctSequence = false;
            firstCard = null;
            secondCard = null;
        }
    }
   }
 }
}
JollyGreenGiant JollyGreenGiant

2020/4/27

#
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot, and MouseInfo)
import java.util.Random;
/**
 * Write a description of class MemoryGame here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class MemoryGame extends World 
{
    private Card [][] board;
    private String[] words = {"g0","g0","g1","g1", "g2", "g2", "g3", "g3", "g4", "g4", "g5", "g5", "g6", "g6", "g7", "g7", "g8", "g8", "g9", "g9",};
    private Random r;
    
    
    MemoryGame()
    {    
       r = new Random();
       board = new Card [4][4];
       shuffle();
       setCells();
       printCells();
       playGame();
    }
 
    public void playGame()
    {
        choosePairOfCards();
    }
    
    public void choosePairOfCards()
    {
        int cardChoice, row1, col1, row2, col2;
        System.out.println();
        System.out.println("Enter the number on the card.");
        System.out.print("First Card Choice? >");
        cardChoice = getInputAsInt();
        row1 = cardChoice / 4;
        col1 = cardChoice % 4;
        board[row1][col1].SetShowingStatus();
        
        System.out.print('\u000C');
        
        printCells();
        
    }
    
    public void setCells()
    {
        int a=0;
        for (int row=0; row<board.length; row++)
        {
            for(int col=0; col<board[0].length; col++)
            {
                {
                    board[row][col] = new Card(words[a], a);
                }
            }
        }
    }
    
    public void printCells()
    {
        Card aCard;
        for (int row=0; row<board.length; row++)
        {
            for (int col=0; col<board[0].length; col++)
            {
                aCard = board [row][col];
                aCard.showCard();
            }
            System.out.println();
        }
    }
    
    public void shuffle()
    {
        for (int a=0; a<words.length; a++)
        {
            int pos = r.nextInt(words.length);
            String temp = words[a];
            words[a] = words[pos];
            words [pos] = temp; 
        }
    }
    
    public int getInputAsInt()
    {
        String temp = reader.nextLine();
        return Integer.parseInt(temp);
    }
    
    public String getInputAsString()
    {
        return reader.nextLine();
    }
    
}
JollyGreenGiant JollyGreenGiant

2020/4/27

#
I would be grateful if you could point out which lines of code I need to change and what I also need to add. Thank you so much for your help.
danpost danpost

2020/4/27

#
In Card class, lines 11 thru 18 can be:
private static GreenfootImage back = new GreenfootImage("cover.gif");

public static Card firstPicked;
public static int matchTries;
public static int matchCount; 

private GreenfootImage front;
private boolean showing;
private int value;
A GreenfootImage array and index are not needed. Your MemoryGame class will need to be totally reworked.
danpost danpost

2020/4/27

#
The constructor in the Card class can be:
public Card(String fname, int val)
{
    value = val;
    front = new GreenfootImage(fname+".gif");
    setImage(back);
}
JollyGreenGiant JollyGreenGiant

2020/4/27

#
So I'll have to scrap the whole MemoryGame class, and start on it from scratch?
JollyGreenGiant JollyGreenGiant

2020/4/27

#
public class Card extends Actor
{
    private static GreenfootImage back = new GreenfootImage("cover.gif");
 
    private static Card firstPicked;
    public static int matchTries;
    public static int matchCount; 
 
    private GreenfootImage front;
    private boolean showing;
    private int value;
    
    public Card(String fname, int val)
    {
        value = val;
        front = new GreenfootImage(fname+".gif");
        setImage(back);
    }
JollyGreenGiant JollyGreenGiant

2020/4/27

#
Like this?
danpost danpost

2020/4/27

#
JollyGreenGiant wrote...
So I'll have to scrap the whole MemoryGame class, and start on it from scratch?
Pretty much.
JollyGreenGiant wrote...
<< Code Omitted >> Like this?
Yes. The only other things you will need in the Card class is an act method and a flipCard method. A simple flipCard would be:
private void flipCard()
{
    showing = ! showing;
    setImage(showing ? front : back);
}
danpost danpost

2020/4/27

#
The act method will be used to detect clicks on a card and, when clicked, determine what action should be taken depending on the values of matchCount and firstClicked.
JollyGreenGiant JollyGreenGiant

2020/4/27

#
Thank you, I will try this.
JollyGreenGiant JollyGreenGiant

2020/4/27

#
I'll keep you posted on how it turns out.
JollyGreenGiant JollyGreenGiant

2020/4/28

#
Hi Dan, you wouldn't happen to have a finished memory game program that i could take a look at only as a guide or at least point out what I need to change in the world-class act? I would very much prefer to do my own creation and I think the card act is more or less complete.
danpost danpost

2020/4/28

#
JollyGreenGiant wrote...
Hi Dan, you wouldn't happen to have a finished memory game program that i could take a look at only as a guide or at least point out what I need to change in the world-class act? I would very much prefer to do my own creation and I think the card act is more or less complete.
I have a Match Game Demo scenario as well as a memory tester that I just updated to run in javascript.
JollyGreenGiant JollyGreenGiant

2020/4/29

#
Your memory tester game is very impressive as well as your match game demo. I just want to make a very basic matching game.
There are more replies on the next page.
1
2
3
4
5