【问题标题】:To implement pile of cards and manage players实现牌堆和玩家管理
【发布时间】:2014-03-12 17:56:50
【问题描述】:

包括玩家手中的一堆牌和两个动作:TAKE 和 DISCARD。当玩家从庄家收到一张牌时,TAKE 将一张牌放在玩家牌堆的顶部。当玩家在游戏中与另一位玩家打出一张牌时,弃牌会从玩家牌堆顶部移除一张牌。每位玩家从庄家那里收到 16 张牌 游戏开始…………

我尝试了这样的代码,但什么也没给我

public class play {

    int noOfCards = 16;

    static void TAKE(Stack st, int a) {
        st.push(new Integer(a));
    }

    static void DISCARD(Stack st) {
        Integer a = (Integer) st.pop();
    }

    public static void main(String args[]) {
        for(int i=0; i<=16; i++) {     
            Stack st = new Stack();
            st.take();
            st.discard();
        }
    }
}

我是这个概念的新手......给我一个解决这个问题的方法

【问题讨论】:

  • 请正确格式化您的代码。这将有很大帮助。
  • 在你的主循环中,你拿一张牌,然后你丢弃一张牌。所以你的手牌结束时没有牌。
  • “什么都不给我”是什么意思?它编译吗?如果不是,请包括确切的错误。它运行没有错误吗?如果没有,请包含错误的堆栈跟踪。它不会产生所需的输出吗?如果是这样,请在示例输入中包含所需的和实际的输出。在 ANY 上述情况下,如果您使用自己的 Stack 类而不是 java.util.Stack,请也发布该类(事实上,all 代码这是编译和运行代码所必需的)。

标签: java data-structures stack playing-cards


【解决方案1】:

很抱歉,我没有完全理解您尝试执行的整个过程。但我还是试了一下。

public class Play 
{

    private static int noOfCards = 16;
    private static Stack<Integer> player1 = new Stack<Integer>();
    private static Stack<Integer> player2 = new Stack<Integer>();

    static void takeCard(Stack<Integer> st,int cardValue){
        st.push(cardValue);
    }

    static int discardCard(Stack<Integer> st){
        return st.pop();
    }

    static int getRandomValue(int min, int max){
        Random r = new Random();
        return r.nextInt((max - min) + 1) + min;
    }

    //Filled card pile with random values from 1-13
    public static void main(String[] args)
    {
        for(int i = 0 ; i < noOfCards; i++){
            takeCard(player1,getRandomValue(1,13));
            takeCard(player2,getRandomValue(1,13));
        }

        //player 1 takes a card!
        //Size of player1's pile before and after taking card
        System.out.println("Before:" + player1.size());
        takeCard(player1, getRandomValue(1, 13));
        System.out.println("After" + player1.size());
        //player 2 discards a card and outputs the card's value
        System.out.println("Player 2 discards: " + discardCard(player2));
    }
}

【讨论】:

    【解决方案2】:

    不确定你想要它做什么。你只是想实现 TAKE 和 DISCARD 吗?尽管不确切知道您要做什么,但您的代码存在很多问题。

    一个直接的问题是您的 Stack 初始化是在您的 for 循环中,这意味着每次执行该循环时,您都会创建一个全新的 Stack,该 Stack 将是空的。所以,基本上,你的主要方法是这样做的:

    1. 创建一个新堆栈(它是空的)
    2. 将卡片添加到堆栈中
    3. 从堆叠中取出一张牌
    4. 重复步骤 1-3 16 次

    另一个问题是 Java 区分大小写,因此调用 st.take() 与 TAKE() 不匹配。

    还有一个问题是 st.take() 就像在说“在我的 Stack 实例上调用 'take()' 方法”。 Stack 没有定义一个名为 take() 的方法——它有 push() 和 pop() 之类的方法(看这里:http://docs.oracle.com/javase/7/docs/api/java/util/Stack.html)。你的 take 和 discard 方法在 Play 类上,所以你想像这样调用它们:

    Play.TAKE(st, 3);
    Play.DISCARD(st);
    

    另一个问题:当您尝试调用保持或丢弃时,您不会发送任何参数,但您已将这些方法定义为接受参数。见上文。

    discard 应该返回被丢弃的卡片的值吗?您检索该值并将其存储到局部变量“a”中,然后您不对其进行任何操作。如果您不打算返回它,则不需要创建“a”。如果你要返回它,你的返回类型不应该是 void。

    【讨论】:

      猜你喜欢
      • 2020-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-15
      • 2014-12-18
      • 2017-10-06
      • 2010-11-15
      • 1970-01-01
      相关资源
      最近更新 更多