0

現在、以下のコードがあり、2D 配列の特定の場所を X で更新してから、ボードを再印刷したいと考えています。私は現在、配列内のオブジェクトを X に更新する必要がある場所で立ち往生していますが、取得し続けます:

Type mismatch: cannot convert from String to Ship

私は何を間違っていますか?すでにすべてのオブジェクトをボードに配置しています。

public void updateBoard(int row, int column, Ocean ocean){
    //get ship array
    Ship[][] sea = ocean.getShipArray();
    //mark the x/y co-ordinate with X 
    sea[row][column] = "X"; // PROBLEM  
    // print the board
}

船のクラスを含めました

public abstract class Ship {
// TODO add appropriate comments
@Getter
private int size;
private String type;
private String shortForm;

// TODO add appropriate comments
@Getter
@Setter(AccessLevel.PACKAGE)
private int bowRow;
@Getter
@Setter(AccessLevel.PACKAGE)
private int bowColumn;
@Getter
@Setter(AccessLevel.PACKAGE)
private boolean horizontal;

/**
 * An array of boolean which indicates whether that part of the ship has
 * been hit. This is initialised by the appropriate sub-class. Battleships
 * use all 4 locations; cruisers use the first 3; destroyers 2; submarines
 * 1; and "empty sea" 1.
 */
protected boolean[] hit;


/**
 * clears the hit array indicating whether that part of the "Ship" has been
 * hit
 */
protected Ship(int size, String type, String shortForm) {
    this.size = size;
    this.setType(type);
    this.shortForm = shortForm;
    hit = new boolean[size];
    for (int i = 0; i < hit.length; i++)
        hit[i] = false;
}

/**
 * Checks that ship of this size will not overlap another ship, or touch
 * another ship (vertically, horizontally, or diagonally) and that ship will
 * not "stick out" beyond the array.
 * 
 * @param row
 *            that will contain the bow
 * @param column
 *            that will contain the bow
 * @param horizontal = true if horizontal
 * @param ocean
 * @return true if it is okay to put a ship of this size with its bow in
 *         this location, with the given orientation.
 */
public boolean okToPlaceShipAt(int row, int column, boolean horizontal,
        Ocean ocean) {
    // Try to catch exception error if ship goes past board
    try{
        Ship ships[][] = ocean.getShipArray();

        for (int i = 0; i < getSize(); i++){
        if (!(ships[row][column] instanceof EmptySea)){ 
        //  System.out.println("Cant Print here + " + row + column + getSize());
                return false;
        }else{
            if (horizontal) {
                column++; 
            } else {
                row++;  
            }
        //  System.out.print(ships[row][column]);

            }
    //  System.out.println(" ");

        }
        return true;
    }
    catch(Exception err){
    //  System.out.println("OMG an error");
        return false;
    } 



}

/**
 * "places" the ship in the ocean, assigning values to the bowRow,
 * bowColumn, and horizontal. Places a reference to the ship in the ships
 * array in the Ocean object.
 * 
 * @param row
 *            to contain the bow
 * @param column
 *            to contain the bow
 * @param horizontal
 * @param ocean
 */
public void placeShipAt(int row, int column, boolean horizontal, Ocean ocean) {

    this.setBowRow(row);
    this.setBowColumn(column);
    this.setHorizontal(horizontal);

    Ship ships[][] = ocean.getShipArray();

    for (int i = 0; i < getSize(); i++) {
        // set position in array to contain the ship
        ships[row][column] = this;
        if (horizontal) {
            column++;
        } else {
            row++;
        }
    }
}

private int getSize() {
    // TODO Auto-generated method stub
    return size;
}

private void setHorizontal(boolean horizontal2) {
    // TODO Auto-generated method stub
    horizontal = horizontal2;
}

private void setBowColumn(int column) {
    // TODO Auto-generated method stub
    bowColumn = column;
}

private void setBowRow(int row) {
    // TODO Auto-generated method stub
    bowRow = row;
}

/**
 * If this ship has been hit, marks that part of the ship as "hit"
 * 
 * @param row
 *            User's supplied row shot
 * @param column
 *            User's supplied column shot
 * @return true if ship is hit, false otherwise
 */
public boolean shootAt(int row, int column) {
    if ((isHorizontal() && (row != getBowRow()))
            || (!isHorizontal() && (column != getBowColumn())))
        return false; // it's not a hit

    // it's a hit. Work out offset & set that position in hit array to true
    hit[(row - getBowRow() + column - getBowColumn())] = true;

            return true;
}

private int getBowRow() {
    // TODO Auto-generated method stub
    return bowRow;
}

private int getBowColumn() {
    // TODO Auto-generated method stub
    return bowColumn;
}

private boolean isHorizontal() {
    // TODO Auto-generated method stub
    return false;
}

/**
 * checks whether this ship is sunk - using the hit array
 * 
 * @return true if every part of the ship has been hit, false otherwise.
 */
public boolean isSunk() {

    for (boolean b : hit)
        if (!b)
            return false;

    return true;
}


/**
 * @return a single character String to use in Ocean's print method
 */
@Override
public String toString() {
    return shortForm;
}

public String getType() {
    return type;
}

public void setType(String type) {
    this.type = type;
}
public String setHit(String hit){
    return hit;
}

}

少し長いです。以下は、Ship、Submarine クラスを拡張する船の場合のサンプルです。他のすべては、サイズを除いてまったく同じです。

/*
 * A Battleship class which extends ship
 * Four Submarines in the game Length 1
 */
package Battleships;
public class Submarine extends Ship {
    private final static int SIZE = 1;
    /**
     * sets the length & clears the hit array
     */
    public Submarine() {
        super(SIZE, "Submarine", "S");
    }
}
4

2 に答える 2

3

seaShip[][]"X"ですStringStringを保持する変数に a を配置することはできませんShip

編集:

新しい船を配置するのではなく、船を撃とうとしているので、実際に必要なのは船から次の機能を使用することだと思います...

public boolean shootAt(int row, int column).

Ship のコードから、実際に行う必要があるのは...

sea[row][column].shootAt(row,column);

于 2013-01-06T16:33:22.040 に答える
0

特別な船を作成して、「X」を表すようにします。更新された質問に従って、次のように新しい船を作成できます。

sea[row][column] = new Ship(1,"Cthulu","X");

これで、Ship を印刷するたびに、Ship クラスの toString() メソッドが shortForm 文字列値を返すため、「X」が表示されます。

X を表すまったく異なる種類の船を作成するために、独自の toString() メソッドを使用して Ship クラスを拡張することもできます。

于 2013-01-06T16:38:59.577 に答える