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

2016/6/16

2D Array Game (cant figure out why my cards wont flip properly)

mukul2345 mukul2345

2016/6/16

#
Hey guys, So the game im trying to create is a 2d array game that is a matching game. it is a 4x4 array and each card has a "imageNum" given to them which decides what picture each card will have. When i run the scenario the cards flip once, and if they match they do work sometimes but sometimes the cards simply dont match but it says it works and sometimes when they dont match, they flip back but they end up making it not able to click again. Could someone help please? World Class Table: import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) import java.util.List; /** * Write a description of class Table here. * * @author (your name) * @version (a version number or a date) */ public class Table extends World { private final static int CARD_SIZE = 100; private Card puzzle; private int size; //private String images = {"BlueBottle","BlueFlower","BluePaccifier","BlueWhale","GrayBear","GreenFlower"}; public int cardsPlaced; private int imageNum; public boolean cardPresent; public boolean uncovered; public boolean twoUp; public int clickCount; public int flipped ; /** * Constructor for objects of class Table. * */ public Table() { this(4); populate(); } public Table(int size) { // Create a new world with 600x400 cells with a cell size of 1x1 pixels. super(size, size, CARD_SIZE); this.size = size; puzzle = new Card; GreenfootImage img = new GreenfootImage(CARD_SIZE,CARD_SIZE); img.drawRect(0,0,CARD_SIZE,CARD_SIZE); setBackground(img); cardPresent = false; twoUp=false; } public void act() { } public void populate() { while(cardsPlaced <2) { int x = Greenfoot.getRandomNumber(size); int y = Greenfoot.getRandomNumber(size); if(puzzle == null ) { puzzle= new Card(CARD_SIZE,0,true); addObject(puzzle,x,y); cardsPlaced ++; } } while(cardsPlaced >=2 && cardsPlaced <4) { int x = Greenfoot.getRandomNumber(size); int y = Greenfoot.getRandomNumber(size); if(puzzle == null ) { puzzle= new Card(CARD_SIZE,1,true); addObject(puzzle,x,y); cardsPlaced ++; } } while(cardsPlaced >=4 && cardsPlaced <6) { int x = Greenfoot.getRandomNumber(size); int y = Greenfoot.getRandomNumber(size); if(puzzle == null ) { puzzle= new Card(CARD_SIZE,2,true); addObject(puzzle,x,y); cardsPlaced ++; } } while(cardsPlaced >=6 && cardsPlaced <8) { int x = Greenfoot.getRandomNumber(size); int y = Greenfoot.getRandomNumber(size); if(puzzle == null ) { puzzle= new Card(CARD_SIZE,3,true); addObject(puzzle,x,y); cardsPlaced ++; } } while(cardsPlaced >=8 && cardsPlaced <10) { int x = Greenfoot.getRandomNumber(size); int y = Greenfoot.getRandomNumber(size); if(puzzle == null ) { puzzle= new Card(CARD_SIZE,4,true); addObject(puzzle,x,y); cardsPlaced ++; } } while(cardsPlaced >=10 && cardsPlaced <12) { int x = Greenfoot.getRandomNumber(size); int y = Greenfoot.getRandomNumber(size); if(puzzle == null ) { puzzle= new Card(CARD_SIZE,5,true); addObject(puzzle,x,y); cardsPlaced ++; } } while(cardsPlaced >=12 && cardsPlaced <14) { int x = Greenfoot.getRandomNumber(size); int y = Greenfoot.getRandomNumber(size); if(puzzle == null ) { puzzle= new Card(CARD_SIZE,6,true); addObject(puzzle,x,y); cardsPlaced ++; } } while(cardsPlaced >=14 && cardsPlaced <16) { int x = Greenfoot.getRandomNumber(size); int y = Greenfoot.getRandomNumber(size); if(puzzle == null ) { puzzle= new Card(CARD_SIZE,7,true); addObject(puzzle,x,y); cardsPlaced ++; } } } public void flipedUp() { flipped++; } public boolean twoUp() { List<Card> card = getObjects(Card.class); for(Card c : card ) { if(c.unCovered()){ //flipped++; Card car =c; } } if(flipped==2){ return true; } else { return false; } } public void zeroFlip() { flipped = 0; } public void checkImageNum() { MouseInfo m=Greenfoot.getMouseInfo(); if(m.getButton()!=0){ clickCount = 1; } } } Actor Class Card: import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) import java.util.List; /** * Write a description of class Card here. * * @author (your name) * @version (a version number or a date) */ public class Card extends Actor { private final static int CARD_SIZE = 100; public boolean isCovered = true; public boolean unCovered = true; private int imageNumber; private int mouseX; private int mouseY; private int timeCounter =0; public void act() { GreenfootImage img = new GreenfootImage(CARD_SIZE,CARD_SIZE); img.drawRect(0,0,CARD_SIZE,CARD_SIZE); img.fillRect(0,0,CARD_SIZE,CARD_SIZE); Table tb=(Table) getWorld(); MouseInfo gfm = Greenfoot.getMouseInfo(); if(isCovered) { setImage(img);} if(Greenfoot.mouseClicked(this)&&!tb.twoUp()) { if(imageNumber == 0) { setImage("BlueFlower.jpg"); } if(imageNumber == 01) { setImage("BlueBottle.jpg"); } if(imageNumber == 02) { setImage("BluePaccifier.jpg"); } if(imageNumber ==03) { setImage("BlueWhale.jpg"); } if(imageNumber ==04) { setImage("GrayBear.jpg"); } if(imageNumber ==05) { setImage("GreenFlower.jpg"); } if(imageNumber ==06) { setImage("PinkBear.jpg"); } if(imageNumber == 07) { setImage("PurpleDuck.jpg"); } mouseX=gfm.getX(); mouseY=gfm.getY(); tb.flipedUp(); isCovered = false; } if(tb.twoUp()) { System.out.println("Two up now"); List < Card> d = getWorld().getObjects(Card.class); for(Card p : d) { if (p == this) { continue; } if(p.unCovered() && this.unCovered()) { if(this.imageNumber == p.imageNumber) { System.out.println("Works" + this.imageNumber + " " + p.imageNumber); isCovered = true;; unCovered = false; //tb.twoUp = false; tb.zeroFlip(); //isCovered = false? //uncovered = true? //tb.two up is set to false. } else { System.out.println("Does not work." + this.imageNumber + " " + p.imageNumber); timeCounter++; unCovered = true; isCovered = false; if(timeCounter==30) { setImage(img); p.setImage(img); tb.clickCount =0; //tb.twoUp = false; unCovered=false; isCovered = true; tb.zeroFlip(); timeCounter = 0; // false should be true //timer needs to be reset, thats why cards wont open. } } break; } } } } public Card(int size, int imageNum,boolean covered) { isCovered = true; imageNumber = imageNum; } public boolean unCovered() { return !isCovered; } public int imgNum() { return imageNumber; } public int returnX() { return mouseX; } }
danpost danpost

2016/6/16

#
I am not sure about the difference between 'isCovered' and 'unCovered' -- but I believe one is for whether the card is showing and the other is whether the card is already matched. You need to determine both of these states on 'p' when checking for the current first flipped card.
You need to login to post a reply.