Вызов метода произошел из случая переключения из другого класса - PullRequest
0 голосов
/ 22 мая 2018

Я относительно новичок в Java, и мне назначен проект.Мне нужно сделать довольно сложную (для новичка) игру на линкоре.

Здесь я пытаюсь вызвать переключение дел в классе Player из класса Tile.Поскольку я читал, что нельзя напрямую получить доступ к переключателю, я сделал методы caseSea (), caseShip () и т. Д.

. При попытке вызвать их в классе Player я получаю 'void'не допускается здесь ошибка, которую я понимаю, но не знаю, как исправить!Спасибо за любую помощь, спасибо!

Вот класс Tile, созданный для представления одного блока двумерного массива, который станет доской поля битвы:

public class Tile
{
    private int x,y;
    static boolean hidden;
    public Action tile_action;


    public enum Action
    {
        Sea,
        Ship,
        Hit,
        Miss
    }
    Action action;
    public Tile(Action action)
    {
        this.action=action;
        this.x = x;
        this.y = y;
        this.tile_action = action;
    }
    public static void caseSea()
    {
        System.out.println("~");
    }
    public static void caseShip()
    {
        if(hidden == true)
                    System.out.println("~");
                else
                    System.out.println("s");
    }
    public static void caseHit()
    {
        System.out.println("X");
    }
    public static void caseMiss()
    {
        System.out.println("O");
    }
    public static void draw(Action action)
    {
        switch(action)
        {
            case Sea:
                caseSea();
                break;
            case Ship:
                caseShip();
                break;
            case Hit:
                caseHit();
                break;
            case Miss:
                caseMiss();
                break;            
        }

    }

}

Также вот класс Player, который содержитвызов случая переключения:

import java.util.Scanner;

public class Player
{
    String username; //Variable declaration
    static int shotcount;
    static int misscount;
    static int hitcount;
    static int repeatshot;
    private int HitPosition[][] = new int[10][10];


    public Player(String username)
    {
        this.username = username;
    }
    private void placeAllShips()
    {
        //super.placeAllShips();
    }

    public void fire(int pos[],int board,boolean hit)
    {
        if(hit == true)
        {
            HitPosition[pos[0]][pos[1]] = Tile.draw(Tile.caseHit());
            shotcount++;
            hitcount++;
        }

        else
        {
            HitPosition[pos[0]][pos[1]] = Tile.draw(Tile.caseMiss());               
            shotcount++;
            misscount++;
        }        
    }
}

Я получаю ошибку, о которой упоминал выше, в Tile.draw(Tile.caseHit()) и Tile.draw(Tile.caseMiss())

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Хех, так как это относительно простая проблема, я хотел придерживаться комментариев, но я чувствую, что должен высказаться, поскольку другие ответы просто неверны.Другие парни предлагают изменить тип возвращаемого значения методов, и это действительно может работать, но не с вашим кодом.В конечном итоге они будут вызваны дважды, и это не то, что вы хотите.Порядок вызова будет

  1. caseHit()

  2. передать значение caseHit() в draw()

  3. введите переключатель внутри метода draw() со значением перечисления Hit и, в конечном счете, снова вызовите caseHit().

Это не то, что вы хотите сделать,Все, что вы хотите сделать, это вызвать метод draw() с правильным аргументом, который в данном случае является одним из значений перечисления Action.

Таким образом, в конечном итоге, существует очень простой способ исправить ваш код без особогоменяется и меняется Tile.draw(Tile.caseHit()); на Tile.draw(Tile.Action.Hit);

(и по аналогии другие вызовы этого метода)

0 голосов
/ 22 мая 2018

С помощью Tile.draw(Tile.caseHit()) вы пытаетесь вызвать метод caseHit() и отправить возвращаемое значение этого метода в качестве параметра в метод draw().Проблема в том, что метод caseHit() ничего не возвращает, так как имеет тип возврата void.

Это можно исправить, заставив метод caseHit () возвращать действие:

public static Action caseHit() {
   return Action.Hit;
}
...