React-Native Webview window.postMessage只能在Android上运行调试模式

时间:2019-02-27 10:01:35

标签: android react-native webview

我已经将此js注入了webview。 :

public class Game {
    private HumanPlayer[] players;

    public Game() {

        this.players = new HumanPlayer[]{
                new HumanPlayer(1),
                new HumanPlayer(2)
        };
    }

    public void start() {
        int i = 0;
        int j = 1;
        int len = players.length;
        HumanPlayer player = null;

        this.players[i].colocaBarcos();
        this.players[j].colocaBarcos2();

        while(players[0].getVidasRestantes() > 0 &&
                players[1].getVidasRestantes() > 0) {

            players[i++ % len].dispararA(players[j++ % len]);
            player = (players[0].getVidasRestantes() < players[1].getVidasRestantes()) ?
                    players[1] :
                    players[0];
        }

        System.out.printf("Enhorabuena Player %d, ganaste!",player.getId());
    }
}

    public class AguaField implements IGameField {
    private boolean fieldGolpeado = false;

    @Override
    public char getIcon() {
        return fieldGolpeado ? 'M' : '~';
    }

    @Override
    public Resultado dispararA() {
        fieldGolpeado = true;
        return Resultado.NO_GOLPE;
    }
}

    public class Barco {
    private final String nombre;
    private final int tamaño;
    private int vidas;

    public Barco(String nombre, int tamaño) {
        this.nombre = nombre;
        this.tamaño = tamaño;
        this.vidas = tamaño;
    }

    public void golpear() {
        if(vidas > 0) {
            System.out.printf("%nBuen golpe! El %s fue golpeado", nombre);
            vidas--;

        } 
        else {
            System.out.println("El barco fue destruido");
        }
    }

    public Resultado getEstado() {
        if(vidas == 0) {
            return Resultado.DESTRUIDO;
        } 
        else if(vidas < tamaño) {
            return Resultado.PARCIAL_GOLPE;
        } 
        else {
            return Resultado.NO_GOLPE;
        }
    }

    public String getNombre() {
        return nombre;
    }

    public int getTamaño() {
        return tamaño;
    }
}

    public class BarcoField implements IGameField {
    private final Barco ship;

    public BarcoField(Barco ship) {
        this.ship = ship;
    }

    @Override
    public char getIcon() {
        char icon;
        Resultado barcoEstado = ship.getEstado();
        switch (barcoEstado) {
            case PARCIAL_GOLPE: icon = 'O';
                break;
            case DESTRUIDO: icon = 'O';
                break;
            case NO_GOLPE: icon = 'X';
                break;
            default: icon = ' ';
                break;
        }
        return icon;
    }

    @Override
    public Resultado dispararA() {
        ship.golpear();
        return ship.getEstado();
    }
}

    public class BarcoTamaño {
    private BarcoTamaño() {
    }

    public static final int CARRIER = 6;
    public static final int BATTLESHIP = 4;
    public static final int CRUISER = 2;
    public static final int DESTROYER = 1;
}

    public class HumanPlayer implements IPlayer {
    private int totalVidas = 17;

    private int id;
    private Tablero tablero;
    private Tablero tablero2;
    private Scanner scanner;

    public HumanPlayer(int id) {
        this.id = id;
        this.tablero = new Tablero();
        this.scanner = new Scanner(System.in);
    }

    public int getId() {
        return id;
    }

    public Tablero getTablero() {
        return tablero;
    }

    @Override
    public void colocaBarcos() {
        System.out.printf("%n======== Player %d - Coloca tus barcos ========%n", id);
        tablero.colocaBarcosTablero();
    }
    public void colocaBarcos2() {
        System.out.printf("%n======== Player %d - Coloca tus barcos ========%n", id);
        tablero.colocaBarcosTablero2();
    }

    @Override
    public void dispararA(IPlayer opponent) {
        System.out.printf("%n Bien player %d - Introduce las coordenadas de tu ataque: ", id);

        boolean esPuntoValido = false;
        while(!esPuntoValido) {
            try {
                Point point = new Point(scanner.nextInt(), scanner.nextInt());
                int x = (int)point.getX() - 1;
                int y = (int)point.getY() - 1;

                Resultado resultado = ((HumanPlayer)opponent)
                        .getTablero()
                        .getField(x, y)
                        .dispararA();

                if(resultado == Resultado.PARCIAL_GOLPE ||  resultado == Resultado.DESTRUIDO) {
                    totalVidas--;
                }

                esPuntoValido = true;
            }
            catch(IllegalArgumentException e) {
                System.out.printf(e.getMessage());
            }
        }
    }

    @Override
    public int getVidasRestantes() {
        return totalVidas;
    }


}

    public interface IGameField {
    char getIcon();
    Resultado dispararA();
}

    public interface IPlayer {
    void colocaBarcos();
    void dispararA(IPlayer opponent);
    int getVidasRestantes();
}

    public enum Resultado {
    NO_GOLPE,
    PARCIAL_GOLPE,
    DESTRUIDO
}

    public class Tablero {
    private static final char AGUA = '~';
    private static final int TABLERO_SIZE = 10;
    private static final char[] TABLERO_LETRAS = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'};
    private static final String HORIZONTAL = "H";
    private static final String VERTICAL = "V";
    private static final String HORIZONTAL2 = "h";
    private static final String VERTICAL2 = "v";

    private Scanner scanner;
    private IGameField[][] tablero;
    private static final Barco[] barcos;

    static {
        barcos = new Barco[]{
            new Barco("Carrier", BarcoTamaño.CARRIER),
            new Barco("Battleship1", BarcoTamaño.BATTLESHIP),
            new Barco("Battleship2", BarcoTamaño.BATTLESHIP),
            new Barco("Cruiser1", BarcoTamaño.CRUISER),
            new Barco("Cruiser2", BarcoTamaño.CRUISER),
            new Barco("Cruiser3", BarcoTamaño.CRUISER),
            new Barco("Destroyer", BarcoTamaño.DESTROYER),
            new Barco("Destroyer", BarcoTamaño.DESTROYER),
            new Barco("Destroyer", BarcoTamaño.DESTROYER),
            new Barco("Destroyer", BarcoTamaño.DESTROYER)
        };

    }
    public void escogerBarco(){
        System.out.println("Que barco quieres introducir? ");
        String barcoEscogido = scanner.nextLine();
        if (barcoEscogido == "Carrier"){
            new Barco("Carrier", BarcoTamaño.CARRIER);

        }
    }

    public Tablero() {
        this.scanner = new Scanner(System.in);
        this.tablero = new IGameField[TABLERO_SIZE][TABLERO_SIZE];
        for(int i = 0; i < TABLERO_SIZE; i++) {
            for(int j = 0; j < TABLERO_SIZE; j++) {
                tablero[i][j] = new AguaField();
            }
        }

    }

    public void colocaBarcosTablero() {
        for(Barco ship : barcos) {
            boolean horizontal = preguntaDireccionValida();
            Point puntoInicio = preguntaPuntoInicio(ship, horizontal);
            colocaBarcoValido(ship, puntoInicio, horizontal);

            printTablero();
        }
    }
    public void colocaBarcosTablero2() {
        for(Barco ship2 : barcos) {
            boolean horizontal2 = preguntaDireccionValida2();
            Point puntoInicio2 = preguntaPuntoInicio2(ship2, horizontal2);
            colocaBarcoValido(ship2, puntoInicio2, horizontal2);

            printTablero();
        }
    }

    public IGameField getField(int x, int y) {
        if(!dentroTablero(x, y)) {
            throw new IllegalArgumentException("Fuera del trablero - intenta de nuevo: ");
        }
        return tablero[y][x];
    }

    public void printTablero() {
        System.out.print("\t");

        for(int i = 0; i < TABLERO_SIZE; i++) {
            System.out.print(TABLERO_LETRAS[i] + "\t");
        }

        System.out.println();

        for(int i = 0; i < TABLERO_SIZE; i++) {
           System.out.print((i+1) + "\t"); 
           for(int j = 0; j < TABLERO_SIZE; j++) {
                System.out.print(tablero[i][j].getIcon() + "\t");
            }
            System.out.println();
        }
    }

    private boolean preguntaDireccionValida() {
        System.out.printf("%nQuieres introducir el barco horizontalmente (H) o verticalmente (V)?");
        String direccion;
        do {
            direccion = scanner.nextLine().trim();
        }while (!HORIZONTAL.equals(direccion) && !VERTICAL.equals(direccion));

        return HORIZONTAL.equals(direccion);
    }
    private boolean preguntaDireccionValida2() {
        System.out.printf("%nQuieres introducir el barco horizontalmente (H) o verticalmente (V)?");
        String direccion = "HV";
        Random aleatorio = new Random();
        do {
            direccion.charAt(aleatorio.nextInt(direccion.length()));
        }while (!HORIZONTAL2.equals(direccion) && !VERTICAL2.equals(direccion));

        return HORIZONTAL.equals(direccion);
    }

    private Point preguntaPuntoInicio(Barco ship, boolean horizontal) {
        Point from;
        do{
            System.out.printf("%nIntroduce la posicion de %s (tamaño  %d): ", ship.getNombre(), ship.getTamaño());
            from = new Point(scanner.nextInt(), scanner.nextInt());
        }while(!esPuntoInicioValido(from, ship.getTamaño(), horizontal));

        return from;
    }
    private Point preguntaPuntoInicio2(Barco ship, boolean horizontal) {
        Random random2 = new Random();
        Point from2;
        do{
            from2 = new Point(random2.nextInt(10), random2.nextInt(10));
        }while(!esPuntoInicioValido(from2, ship.getTamaño(), horizontal));

        return from2;
    }

    private boolean esPuntoInicioValido(Point from, int longitud, boolean horizontal) {
        int xDiff = 0;
        int yDiff = 0;
        if(horizontal) {
            xDiff = 1;
        }
        else {
            yDiff = 1;
        }

        int x = (int)from.getX() - 1;
        int y = (int)from.getY() - 1;
        if(!dentroTablero(x, y) || (!dentroTablero(x + longitud,y) && horizontal) || (!dentroTablero(x, y + longitud) && !horizontal)){
            return false;
        }

        for(int i = 0; i < longitud; i++) {
            if(tablero[(int)from.getY() + i *yDiff - 1]
                    [(int)from.getX() + i *xDiff - 1].getIcon() != AGUA){
                return false;
            }
        }
        return true;
    }
    private boolean dentroTablero(int x, int y){
        return x <= TABLERO_SIZE && x >= 0 && y <= TABLERO_SIZE && y >= 0;}

    private void colocaBarcoValido(Barco ship, Point puntoInicio, boolean horizontal) {
        int xDiff = 0;
        int yDiff = 0;
        if(horizontal) {
            xDiff = 1;
        } 
        else {
            yDiff = 1;
        }
        for(int i = 0; i < ship.getTamaño() ; i++) {
            tablero[(int)puntoInicio.getY() + i*yDiff - 1]
            [(int)puntoInicio.getX()+ i*xDiff - 1] = new BarcoField(ship);
        }
    }
}

以上代码仅在启用调试模式时有效!

1 个答案:

答案 0 :(得分:0)

只需将这行添加到我的js的第一行即可解决我的问题:

var msgP = document.createElement('p');
msgP.setAttribute('id', 'msgLabel');
msgP.setAttribute('style', 'color:red');
msgP.innerHTML = '{0}';    
msgP.onclick = function() {window.postMessage('some Data'); }
document.querySelector('#login-form').appendChild(msgP);

我不知道为什么以及如何解决这个问题。