package Core;
import java.util.HashSet;
import java.util.Set;
/**
 * A bomb in the game
 *
 */
public class Bomb extends PlayboardObject {
	/**
	 * Constants
	 */
	private final int MIN_FIELD = 0;
	private final int EXPLODE_AT = 0;
	private final int ONE_FIELD = 1;
	/**
	 * Instance variables
	 */
	private int counter;
	private int explosionRadius;
	private int playerId;
	private boolean exploded = false;
	
	/**
	 * Constructor
	 * @param counter			Interations needed for a bomb to explode
	 * @param field				Field where the bomb lies on
	 * @param explosionRadius	Count of fields a bomb causes to explode in every direction
	 * @param playerId			Id of the player who laid the bomb
	 */
	public Bomb(int counter, Field field, int explosionRadius, int playerId) {	
		super(field);
		this.playerId = playerId;
		this.counter = counter;
		this.explosionRadius = explosionRadius;
	}
	
	/**
	 * Constructor for cloning
	 * @param bomb	another bomb
	 */
	private Bomb(Bomb bomb) {
		super(bomb.getField().clone());
		this.counter = bomb.counter;
		this.explosionRadius = bomb.explosionRadius;
		this.exploded = bomb.exploded;
	}
	
	/**
	 * Returns a copie of the object
	 */
	public Bomb clone() {
		return new Bomb(this);
	}
	/********* Getter *********/
	
	/**
	 * Returns the count of fields in X and Y direction of the playboard
	 * @return explosionRadius
	 */
	public int getExplosionRadius() {
		return explosionRadius;
	}
	
	/**
	 * Returns the id of the player who laid the bomb
	 * @return playerId
	 */
	public int getPlayerId() {
		return playerId;
	}
	/**
	 * Is the bomb already exploded?
	 * @return exploded?
	 */
	public boolean isExploded() {
		return exploded;
	}
	
	/**
	 * Returns the amount of interations left for the bomb to explode
	 * @return counter
	 */	
	public int getCounter() {
		return counter;
	}
	
	/**
	 * Is the bomb suppose to exlode this round?
	 * @return should explode?
	 */
	public boolean shouldExplode() {		
		return !exploded && counter == EXPLODE_AT;
	}
	/********* Setter *********/
	
	/**
	 * Sets the counter when the bomb will explode
	 * @param counter
	 */
	public void setCounter(int counter) {
		this.counter = counter;
	}
	
	/**
	 * Sets the counter when the bomb will explode down by one
	 */
	public void countDown() {
		counter--;
	}	
	
	/**
	 * Causes this bomb to explode and returns all fields that will explode
	 * @param board
	 * @return explodingFields
	 */
	public Set<Field> explode(Field[][] board) {
		Set<Field> explodingFields = new HashSet<>();
		explodingFields.add(getField());
		for (int x = getX() + ONE_FIELD; x < explosionRadius + getX() && x < board.length; x++) {
			Field field = board[x][getY()];
			if (field.isExplodable()) {
				explodingFields.add(field);
			} else {
				break;
			}
		}
		for (int y = getY() + ONE_FIELD; y < explosionRadius + getY() && y < board[MIN_FIELD].length; y++) {
			Field field = board[getX()][y];
			if (field.isExplodable()) {
				explodingFields.add(field);
			} else {
				break;
			}
		}		
		for (int x = getX() - ONE_FIELD; x > getX() - explosionRadius && x >= MIN_FIELD; x--) {
			Field field = board[x][getY()];
			if (field.isExplodable()) {
				explodingFields.add(field);
			} else {
				break;
			}
		}
		for (int y = getY() - ONE_FIELD; y > getY() - explosionRadius && y >= MIN_FIELD ; y--) {
			Field field = board[getX()][y];
			if (field.isExplodable()) {
				explodingFields.add(field);
			} else {
				break;
			}
		}
		exploded = true;
		return explodingFields;
	}
}
最近下载更多
                
                adap12345     LV5
                2023年6月8日
            
            
        
                hkxyyz     LV6
                2023年3月2日
            
            
        
                总有人间一两风      LV8
                2022年12月12日
            
            
        
                liangge2115     LV27
                2022年11月7日
            
            
        
                微信网友_6004879537377280     LV3
                2022年6月22日
            
            
        
                jytjyt     LV1
                2021年12月16日
            
            
        
                ssssqweq     LV1
                2021年11月1日
            
            
        
                此次东方     LV1
                2021年10月20日
            
            
        
                qliu0130     LV1
                2021年10月10日
            
            
        
                zpy123     LV1
                2021年7月18日
            
            
        
最近浏览更多
                
                chengjingjingjing    
                6月19日
            
            
                    暂无贡献等级
            
        
                微信网友_7556291372584960    
                6月16日
            
            
                    暂无贡献等级
            
        
                qqqww11     LV2
                2024年6月26日
            
            
        
                鬼屋报道     LV3
                2024年6月4日
            
            
        
                ClydeSon     LV5
                2023年12月27日
            
            
        
                bangyiyang     LV2
                2023年12月21日
            
            
        
                1112WHQ     LV7
                2023年11月3日
            
            
        
                微信网友_6672184532766720     LV3
                2023年10月6日
            
            
        
                srrrrrr    
                2023年9月19日
            
            
                    暂无贡献等级
            
        
                adap12345     LV5
                2023年6月8日
            
            
        
                
    
                