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

2014/7/22

Adding more objects than expected...

MusicPenguin MusicPenguin

2014/7/22

#
My problem is arising in the method named 'addNewTile()'. it is only supposed to add a single tile to the world and then stop but it seems that it is adding a number related to the current number of tiles already in the world. Any suggestions are greatly appreciated.
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Write a description of class TileBoard here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class TileBoard extends World
{
    public static final int LEFT = 0, RIGHT = 1, UP = 2, DOWN = 3, TILE_SIZE = 56;
    
    private int direction = -1;
    private boolean isDown = false;

    /**
     * Constructor for objects of class TileBoard.
     * 
     */
    public TileBoard()
    {    
        super(4, 4, 60); 
        for (int i = 0; i < 2; i++){
            int x = Greenfoot.getRandomNumber(4);
            int y = Greenfoot.getRandomNumber(4);
            if (!getObjectsAt(x, y, Tile.class).isEmpty()){
                i -= 1;
            }else{
                addObject(new Tile(), x, y);
            }
        }
        addObject(new Main(), -1, -1);
    }
    
    public void checkKeys(){
        if (!isDown){
            setKeyDirection();
        }
        if (isDown && !(Greenfoot.isKeyDown("left") || Greenfoot.isKeyDown("right") 
                || Greenfoot.isKeyDown("up") || Greenfoot.isKeyDown("down"))){
            isDown = false;
        }
    }
    
    public void setKeyDirection(){
        if (Greenfoot.isKeyDown("left")){
            isDown = true;
            direction = LEFT;
            canCombine();
            countNumberOfEmptyCellsInFront();
        }else if (Greenfoot.isKeyDown("right")){
            isDown = true;
            direction = RIGHT;
            canCombine();
            countNumberOfEmptyCellsInFront();
        }else if (Greenfoot.isKeyDown("up")){
            isDown = true;
            direction = UP;
            canCombine();
            countNumberOfEmptyCellsInFront();
        }else if (Greenfoot.isKeyDown("down")){
            isDown = true;
            direction = DOWN;
            canCombine();
            countNumberOfEmptyCellsInFront();
        }else{
            direction = -1;
        }
    }
    
    public void canCombine(){
        switch (direction){
            case 0:
                for (int x = 1; x < 4; x++){
                    for (int y = 0; y < 4; y++){
                        if (!getObjectsAt(x, y, Tile.class).isEmpty()){
                            Tile tile = (Tile) getObjectsAt(x, y, Tile.class).get(0);
                            for (int i = tile.getX() - 1; i > -1; i--){
                                if (!getObjectsAt(i, y, Tile.class).isEmpty()){
                                    Tile tile1 = (Tile) getObjectsAt(i, y, Tile.class).get(0);
                                    if ((tile.getValueOfTile() == tile1.getValueOfTile()) && !tile1.getDidCombine()){
                                        removeObject(tile);
                                        System.out.println(tile1.getDidCombine());
                                        tile1.setDidCombine(true);
                                        System.out.println(tile1.getDidCombine());
                                        setValuesAndImages(tile1);
                                    }
                                    break;
                                }
                            }
                        }
                    }
                }
            
            break;
            
            case 1:
                for (int x = 2; x > -1; x--){
                    for (int y = 0; y < 4; y++){
                        if (!getObjectsAt(x, y, Tile.class).isEmpty()){
                            Tile tile = (Tile) getObjectsAt(x, y, Tile.class).get(0);
                            for (int i = tile.getX() + 1; i < 4; i++){
                                if (!getObjectsAt(i, y, Tile.class).isEmpty()){
                                    Tile tile1 = (Tile) getObjectsAt(i, y, Tile.class).get(0);
                                    if (tile.getValueOfTile() == tile1.getValueOfTile() && !tile1.getDidCombine()){
                                        removeObject(tile);
                                        tile1.setDidCombine(true);
                                        setValuesAndImages(tile1);
                                    }
                                    break;
                                }
                            }
                        }
                    }
                }
            
            break;
            
            case 2:
                for (int y = 1; y < 4; y++){
                    for (int x = 0; x < 4; x++){
                        if (!getObjectsAt(x, y, Tile.class).isEmpty()){
                            Tile tile = (Tile) getObjectsAt(x, y, Tile.class).get(0);
                            for (int i = tile.getY() - 1; i > -1; i--){
                                if (!getObjectsAt(x, i, Tile.class).isEmpty()){
                                    Tile tile1 = (Tile) getObjectsAt(x, i, Tile.class).get(0);
                                    if (tile.getValueOfTile() == tile1.getValueOfTile() && !tile1.getDidCombine()){
                                        removeObject(tile);
                                        tile1.setDidCombine(true);
                                        setValuesAndImages(tile1);
                                    }
                                    break;
                                }
                            }
                        }
                    }
                }
                
            break;
            
            case 3:
                for (int y = 2; y > -1; y--){
                    for (int x = 0; x < 4; x++){
                        if (!getObjectsAt(x, y, Tile.class).isEmpty()){
                            Tile tile = (Tile) getObjectsAt(x, y, Tile.class).get(0);
                            for (int i = tile.getY() + 1; i < 4; i++){
                                if (!getObjectsAt(x, i, Tile.class).isEmpty()){
                                    Tile tile1 = (Tile) getObjectsAt(x, i, Tile.class).get(0);
                                    if (tile.getValueOfTile() == tile1.getValueOfTile() && !tile1.getDidCombine()){
                                        removeObject(tile);
                                        tile1.setDidCombine(true);
                                        setValuesAndImages(tile1);
                                    }
                                    break;
                                }
                            }
                        }
                    }
                }
                
            break;
            
            default: 
            break;
        }
    }
    
    public void setValuesAndImages(Tile tile){
        if (tile.getDidCombine()){
            tile.setIndividualImage();
        }
    }
    
    public void countNumberOfEmptyCellsInFront(){
        switch(direction){
            case 0: 
                for (int x = 1; x < 4; x++){
                    for (int y = 0; y < 4; y++){
                        if (getObjectsAt(x, y, Tile.class).isEmpty()) continue;
                        Tile tile = (Tile) getObjectsAt(x, y, Tile.class).get(0);
                        int count = 0;
                        for (int i = x - 1; i > -1; i--){
                            if (!getObjectsAt(i, y, Tile.class).isEmpty()) continue;
                            count++;
                        }
                        if (count != 0){
                            tile.setNumOfEmptyCellsInFront(count);
                            shiftTiles(tile);
                        }
                    }
                }
            
                break;
            case 1:
                for (int x = 2; x > -1; x--){
                    for (int y = 0; y < 4; y++){
                        if (getObjectsAt(x, y, Tile.class).isEmpty()) continue;
                        Tile tile = (Tile) getObjectsAt(x, y, Tile.class).get(0);
                        int count = 0;
                        for (int i = x + 1; i < 4; i++){
                            if (!getObjectsAt(i, y, Tile.class).isEmpty()) continue;
                            count++;
                        }
                        if (count != 0){
                            tile.setNumOfEmptyCellsInFront(count);
                            shiftTiles(tile);
                        }
                    }
                }
            
                break;
            case 2: 
                for (int y = 1; y < 4; y++){
                    for (int x = 0; x < 4; x++){
                        if (getObjectsAt(x, y, Tile.class).isEmpty()) continue;
                        Tile tile = (Tile) getObjectsAt(x, y, Tile.class).get(0);
                        int count = 0;
                        for (int i = y - 1; i > -1; i--){
                            if (!getObjectsAt(x, i, Tile.class).isEmpty()) continue;
                            count++;
                        }
                        if (count != 0){
                            tile.setNumOfEmptyCellsInFront(count);
                            shiftTiles(tile);
                        }
                    }
                }
                
                break;
            case 3: 
                for (int y = 2; y > -1; y--){
                    for (int x = 0; x < 4; x++){
                        if (getObjectsAt(x, y, Tile.class).isEmpty()) continue;
                        Tile tile = (Tile) getObjectsAt(x, y, Tile.class).get(0);
                        int count = 0;
                        for (int i = y + 1; i < 4; i++){
                            if (!getObjectsAt(x, i, Tile.class).isEmpty()) continue;
                            count++;
                        }
                        if (count != 0){
                            tile.setNumOfEmptyCellsInFront(count);
                            shiftTiles(tile);
                        }
                    }
                }
            
                break;
            default: break;
        }
    }
    
    public void shiftTiles(Tile tile){
        switch(direction){
            
            case 0:
                if (tile != null){
                    tile.setLocation(tile.getX() - tile.getNumOfEmptyCellsInFront(), 
                                     tile.getY());
                }
                
                break;
                
            case 1:
                if (tile != null){
                    tile.setLocation(tile.getX() + tile.getNumOfEmptyCellsInFront(), 
                            tile.getY());
                }
                
                break;
                
            case 2:
                if (tile != null){
                    tile.setLocation(tile.getX(), 
                            tile.getY() - tile.getNumOfEmptyCellsInFront());
                }
                        
                break;
                
            case 3:
                if (tile != null){
                    tile.setLocation(tile.getX(), 
                            tile.getY() + tile.getNumOfEmptyCellsInFront());
                }
                
                break;
                
            default: break;
        }
        resetDidCombine();
        addNewTile();
    }
    
    public void resetDidCombine(){
        for (int x = 0; x < 4; x++){
            for (int y = 0; y < 4; y++){
                if (getObjectsAt(x, y, Tile.class).isEmpty()) continue;
                Tile temp = (Tile) getObjectsAt(x, y, Tile.class).get(0);
                temp.setDidCombine(false);
            }
        }
    }
    
    public void addNewTile(){
        int x, y;
        do {
            x = Greenfoot.getRandomNumber(4);
            y = Greenfoot.getRandomNumber(4);
            if (!getObjectsAt(x, y, Tile.class).isEmpty()) continue;
            addObject(new Tile(), x, y);
            break;
        } while(false);
    }
    
    public void pln(String s){
        System.out.println(s);
    }
    
    public void p(String s){
        System.out.print(s);
    }
}
MusicPenguin MusicPenguin

2014/7/22

#
I can't test it right now, but I think it's because of where it's being called from. shiftTiles() is being called within a for loop which is the methods in which addNewTile() is being called.
danpost danpost

2014/7/22

#
MusicPenguin wrote...
I can't test it right now, but I think it's because of where it's being called from. shiftTiles() is being called within a for loop which is the methods in which addNewTile() is being called.
That would make sense. Try placing the call after the switch block in the countNumberOfEmptyCellsInFront method.
You need to login to post a reply.