调用来自另一个类

时间:2018-05-22 09:34:56

标签: java enums switch-statement case

我是java的新手,我被分配了一个项目。我需要做一个相当复杂的(换新手)战舰游戏。

在这里,我尝试从类Tile调用类Player中的switch case。由于我已经读过一个人无法直接访问switch case,我已经使用了caseSea(),caseShip()e.t.c。

当试图在课堂上给他们打电话时,我会得到一个“无效”的声音。类型不允许这里错误,我明白但不知道如何解决! 任何帮助将不胜感激!

这是创建的类Tile,用于表示将成为战场板的2D阵列的一个块:

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,它包含对switch case的调用:

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 :(得分:0)

嘿,因为这是一个相对简单的问题,我想坚持评论,但我觉得我需要发声,因为其他答案都是错误的。 其他人建议的是改变方法的返回类型,这确实可以工作,但不能用你拥有的代码。 他们最终会被召唤两次,这不是你想要的。 通话顺序是

  1. caseHit()

  2. caseHit()的值传递给draw()

  3. 使用draw()枚举值在Hit方法内输入一个开关,最终再次调用caseHit()

  4. 这不是你想要做的。你想做的只是用正确的参数调用draw()方法,在这种情况下,这是Action枚举值之一。

    因此,最终有一种非常简单的方法可以在没有太多变化的情况下修复代码,这种情况正在发生变化 Tile.draw(Tile.caseHit());Tile.draw(Tile.Action.Hit);

    (并且类推这种方法的其他调用)

答案 1 :(得分:-1)

使用Tile.draw(Tile.caseHit()),您尝试调用caseHit()方法并将该方法的返回值作为参数发送到draw()方法。问题是caseHit()方法没有返回任何内容,因为它有void返回类型。

您可以通过使caseHit()方法返回Action:

来解决此问题
public static Action caseHit() {
   return Action.Hit;
}