如何在匹配游戏中对套牌申请套装?

时间:2016-11-13 00:34:41

标签: java if-statement java.util.scanner

基本上,项目描述要求用户创建一个匹配的游戏,包括:

  1. 创建扑克牌的蓝图,其属性为: 套装,面值,faceUp状态以及套装图标的可选unicode值
  2. 二维游戏桌(4x4),16对匹配卡,以及面朝下卡的数量的运行计数。包括从输入x,y位置的表中检索特定卡片的方法。
  3. 一个游戏板,循环继续玩,直到所有牌面朝上。 该循环包括一个界面,用户可以选择两张牌(输入x,y表位置),检查两张牌是否相等,减少faceDown牌的数量,以及设置牌的faceUp布尔值。 从某种程度上说,该程序应该运行,直到所有卡面朝上,并赢得游戏。我将我的课程分成了以下四个单独的课程。
  4. 1

    public class Card {
    private final int cardValue;
    private boolean faceUp;
    
    public Card(int value) {
        cardValue = value;
        faceUp = false;
    }
    
    public int getValue() {
        return cardValue;
    }
    
    public boolean isFaceUp() {
        return faceUp;
    }
    
    public void setFaceUp(boolean input) {
        faceUp = input;
    }
    
    public static void printBoard(Card[][] cards) {
        System.out.println("\t\t1\t2\t3\t4");
        System.out.println("\t____________");
    
        for(int i = 0; i < cards.length; i++) {
            System.out.println((i + 1) + "\t|\t");
    
            for(int j = 0; j < cards[0].length; j++)
                if(cards[i][j].isFaceUp()) {
                    System.out.print(cards[i][j].getValue() + "\t"); }
                else
                    System.out.println("*\t");
    
        }
        System.out.println();
    }
    
    }
    

    2

    public class CreateBoard {
    
    public static Card[][] createBoard() {
        Card[][] board = new Card[4][4];
    
        for(int i = 1; i <= 8; i++) {
            for(int j = 1; j <= 2; j++) {
    
                boolean boardLocation = false;
    
                while(!boardLocation) {
                    int row = (int)(Math.random() * 4); 
                    int column = (int)(Math.random() * 4);
    
                    if(board[row] == null && board[column] == null) {
                        boardLocation = true;
                        board[row][column] = new Card(i);
                        }
                    }
                }
            }
                    return board;
        }
    }
    

    3

    public class Game {
        public static boolean wonGame(Card[][] board) {
            for(int i = 0; i < board.length; i++) {
                for(int j = 0; j < board[0].length; j++) {
                    if(!board[i][j].isFaceUp())
                        return false;
                }
            }
                        return true;
        }
    
    }
    

    最后,主要课程:

    public class GameDriver {
        public static void main(String[] args) {
            Card[][] board = CreateBoard.createBoard();
            Scanner keyboard = new Scanner(System.in);
    
            System.out.println("Starting Game...");
    
            while(!Game.wonGame(board)) {
                Card.printBoard(board);
    
                System.out.println("Enter X-Coordinate #1 (1-4): ");
                int column1 = keyboard.nextInt();
    
                System.out.println("Enter Y-Coordinate #1 (1-4): ");
                int row1 = keyboard.nextInt();
    
                System.out.println("Enter X-Coordinate #2 (1-4): ");
                int column2 = keyboard.nextInt();
    
                System.out.println("Enter Y-Coordinate #2 (1-4): ");
                int row2 = keyboard.nextInt();
    
                Card card1 = board[row1][column1];
                Card card2 = board[row2][column2];
    
                if(card1.getValue() == card2.getValue() && !(row1 == row2 && column1 == column2)) 
                {
                    card1.setFaceUp(true);
                    card2.setFaceUp(true);
                }
    
                else if(row1 == row2 && column1 == column2)
                {
                    System.out.println("Points selected are the same, try again");
                }
    
                else
                {
                    System.out.println(card1.getValue() + " and "  + card2.getValue() + " do not match");
    
                }
            }
                Card.printBoard(board);
        }
    }
    

    代码运行完美,但我对如何在卡上添加西装几乎一无所知。我只需要在板上的每张卡上都有两套西装(例如红心和钻石,所以如果代码产生两个4,一个会得到心脏,一个会得到钻石)我知道我可以使用枚举,但我不喜欢真的很了解它们是如何工作的。非常感谢帮助!

1 个答案:

答案 0 :(得分:1)

这是guide to enums我建议您阅读。这是快速阅读,很多例子。 Java教程通常非常有用。

以下是您可以使用的一些代码。

public enum Suit {
    HEARTS
    ,SPADES
    ,DIAMONDS
    ,CLUBS
}

public class Card {
    private final int cardValue;
    private final Suit suit;
    private boolean faceUp;

    public Card(int value, Suit suit) {
         this.cardValue = value;
         this.faceUp = false;
         this.suit = suit;
    }
    // ...snip...
    public Suit getSuit() {
        return this.suit;
    }
}

你可以通过以下方式构建卡片:

Card myCard = new Card(3, Suit.HEARTS);

我强烈建议您采用仅使用一组char值的建议。为什么?一堆原因。首先,如果您使用enum类型,您就知道有人不会意外地向您传递无效值;错字无法搞砸整个程序。另一方面,您不需要在任何地方传递可接受的字符列表,或者更糟糕的是 - 每次都检查每个可能的值的switch-case或if语句,如果有人使用了无效值,则抛出错误。< / p>

然后有一个事实是,如果你每枚枚举值只使用一个字符,那么枚举值就不能有有意义的名字(有人应该如何弄清楚'C''S'是什么意思? ),Suit.CLUBSSuit.SPADES中的歧义很少(并且,请记住,代码是为而不是计算机编写的。非常可疑没有经验足以反驳的人。)