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类但尚未完成
答案 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();
}
}
//...
}
如果要将对象/接口添加到不符合其类的通用列表(它没有能够调用其上的方法),编译器会记录一条错误消息。