另一个arraylist到另一个不同类型的arraylist

时间:2017-03-27 19:40:50

标签: java oop arraylist

public class Game {

    private ArrayList<Player> players;
    private ArrayList<Card> deck;
    private ArrayList<Card> pool;
    **private ArrayList<Capture> capture;**
    private int currentPlayer;
    private int playDirection;
    int index;
    int count = 0;
    int passNo = 0;

    Scanner input = new Scanner(System.in);
    Scanner input2 = new Scanner(System.in);
    Scanner input3 = new Scanner(System.in);

    public Game()
    {
        deck = new ArrayList<Card>();
        pool = new ArrayList<Card>();
        capture = new ArrayList<Capture>();

        for(int c=0; c<4; c++){
            for(int i=0; i<13; i++){
                deck.add(new Card(c,i));
            }
            Collections.shuffle(deck);
        }   

    }       

     public Player play() {
         Player player = getCurrentPlayer();
         int pass = -1;
         int option =0;
         int count =0;
         boolean play = false;
         boolean check = true;

         capture = new ArrayList<Capture>();

         System.out.println();
         System.out.println(player + ":" + player.getCards());

         do{
             System.out.println("Please select an option: ((1) Capture (2) Discard a card)");
             option = input2.nextInt();


             play=player.isPlayable();


             switch(option)
             {
             case 1:
                 if(play == true){

                     System.out.print("HandCard:" + player.getCards());
                     System.out.print("  Choose a Number from 0 to " + (player.getCards().size()-1)+ "  :   ");
                     int num = input.nextInt();
                     player.getCards().remove(num);
                  //after prompting user for entering the cards they wanted
                  //the following sentence has following error                                                          
                     **capture.add(player.getCards().get(num));**
                   //"The method add(Capture) in the type ArrayList<Capture> is  
                    //not applicable for the arguments (Card)"  
                    System.out.print("How many card you want capture from pool: (Choose 1 number from  1 to " + pool.size()+ ")" + "  :  ");
                    option = input.nextInt();
                    System.out.println("Please choose your card in the pool:");
                    System.out.println("Pool");
                    for(int j=0; j<pool.size(); j++)
                    {
                        System.out.print("(" + j + ")" + pool.get(j) + " ");
                    }

                    for(int i=0; i<option;i++)
                    {

                            count = input.nextInt();
                            System.out.print(pool.get(count) + " ");
                            pool.remove(count);
                            //same problem as the above error
                            **capture.add(pool.get(count));**
                    }

                    System.out.print(player.getCards().get(num) + "  is selected");
                    System.out.println();
                    System.out.println("=================================================");
                    check=false;
                 }
                 else
                     System.out.println("Invalid Capture, Please choose either (1) Capture or (2) Discard a Card");
                 break;

             case 2:
                 if(play == true){
                     Card discard = player.cardDiscard();
                     System.out.println(discard + " has been added to pool");
                     pool.add(discard);
                     player.removeCard(discard);
                     check=false;
                 }
                 else
                     System.out.println("Invalid Capture Please choose either (1) Capture or (2) Discard a Card");
                 break;

                 default:
                     System.out.println("Invalid option choose");

             }
         }while(check);

         if(pass==currentPlayer)
         {
             passNo++;
         }
         else{
             passNo = 0;
         }

         if(player.getCards().size() == 0 ){
             int i = 1;
             int [] point = new int[players.size()+1];
             point[0] = 100;
             int lowest = 0;
             System.out.println();

             for(Player p : players){
                 System.out.println(p + ":" + p.getTotalScores() + " points");
                 point[i] = p.getTotalScores();

                 if(point[i] < point[i-1]){
                     lowest = point[i];
                 }
                 i++;
             }
             for(Player p:players){
                 if(p.getTotalScores()==lowest)
                 {
                     player = p;
                 }
             }
             return player;
             }

         goToNextPlayer();
         System.out.println();
         System.out.println("=========================================================================");
         System.out.println("Pool"); 
         for(int i=0; i<pool.size(); i++)
            System.out.print("(" + i + ")" + pool.get(i) + " ");
            return null;
         }

//捕获类          import java.util.ArrayList;

       public abstract class Capture {
              private static ArrayList<Capture> capture;
              private static ArrayList<Card> card;
              boolean result = false;


public Capture()
{
    // leave bank 
}


// this part is the functions that hv to implement in pair , run , combo class
public abstract boolean formCapture(ArrayList<Capture> c);
public abstract double getScore();


public abstract void showMessage();}

很抱歉很长的帖子,但我的问题在于评论的部分,出现的错误使我无法将播放器手牌和池卡添加到ArrayList<Capture> Capture列表中,但此列表无法删除,因为它是在另一个类中用于检测其他子类使用的其他功能。如何解决错误并将arraylist捕获添加到新类型数组列表中? **已编辑,已添加Capture类但尚未完成

4 个答案:

答案 0 :(得分:0)

capture.add(player.getCards().get(num));

在这一行

player.getCards().get(num)

返回Card对象引用。 但是你把Arraylist贬为

private ArrayList<Capture> capture;

所以

capture.add();

此方法只能将Capture Object引用作为参数或任何可能与Capture具有相同父对象的对象引用。你在哪里提供卡片对象参考我假设它没有与Capture相同的祖先或实现相同的祖先。这就是为什么它会给你这个错误。

答案 1 :(得分:0)

建立一个界面让我们说CardAndCapture和你的Card和Capture类应该实现这个界面。现在在您的代码中,更改此行

capture = new ArrayList();

capture = new ArrayList();

现在您的代码应该编译并运行。你在这里制作Card和Capture兄弟姐妹。因此,请确保与CardCapture接口正确集成。

答案 2 :(得分:0)

如果Capture将Card作为实例变量,如下所示:

 public class Capture{
    private Card card;

    public Capture(Card card){
       this.card = card;
    }
   ...
 }

<强>用法

 capture.add(new Capture(player.getCards().get(num)));

答案 3 :(得分:0)

将对象存储在公共列表中,只要它们具有通用用法即可。如果它们具有通用用法,则将此功能划分为接口,并通过旨在以相同方式处理的类来实现此接口。使用此接口类型创建通用列表,并在接口上执行方法调用:

public interface ICommonUsage
{
  public void foo();
  public void bar();
}

public class Class1 implements ICommonUsage
{
  //...
  public void foo() {}
  public void bar() {}
  //...
}

public class Class2 implements ICommonUsage
{
  //...
  public void foo() {}
  public void bar() {}
  //...
}

public class Class3
{
  //...
  private List<ICommonUsage> commonUsedObjects;

  public void commonUsage()
  {
    for ( ICommonUsage item : commonUsedObjects )
    {
      item.foo();
      item.bar();
    }
  }
  //...
}

如果要将对象/接口添加到不符合其类的通用列表(它没有能够调用其上的方法),编译器会记录一条错误消息。