java编写简易扑克牌游戏

游戏功能描述

  1. 创建一副扑克牌:
    包括四种花色:黑桃,红桃,梅花,方片
    包括十三种点数:2-10,J,Q,K,A
  2. 创建两名玩家(or多名)
    玩家至少要有ID,姓名,手牌等属性,手牌为扑克牌的集合
  3. 将创建好的扑克牌进行随机洗牌
  4. 从洗牌后的扑克牌的第一张开始,发给每个玩家,按照一人一张的方式,每人发两张(or多张)
  5. 比较两名玩家手中的扑克牌,比较规则为:取两人各自手中点数最大的牌进行比较,点数大的赢;若两人各自的点数最大的牌相等,则再按照花色比较。

代码

//Card.java

package card;

public class Card{
    private String color;
    private String number;

    public Card(String color, String number) {
        this.color = color;
        this.number = number;
    }

    public String getColor() {
        return color;
    }

    public String getNumber() {
        return number;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (!(obj instanceof Card))
            return false;
        Card other = (Card) obj;
        if (color == null) {
            if (other.color != null)
                return false;
        } else if (!color.equals(other.color))
            return false;
        if (number == null) {
            if (other.number != null)
                return false;
        } else if (!number.equals(other.number))
            return false;
        return true;
    }

}

//Cards.java

package card;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Cards {
    private List<Card> list = new ArrayList<Card>();

    //创建一副扑克牌
    public Cards(){
        System.out.println("-----------------创建扑克牌------------------");
        String[] color = {"黑桃", "红桃", "梅花", "方片"};
        String[] number = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J","Q","K", "A"};
        for(int i=0;i<color.length;i++)
            for(int j=0;j<number.length;j++){
                list.add(new Card(color[i], number[j]));
            }   
        System.out.println("----------------扑克牌创建成功!---------------");
    }

    //获取一副扑克牌
    public List<Card> getList() {
        return list;
    }

    //洗牌(打乱)
    public void shufCards(){
        System.out.println("----------------开始洗牌------------------------");
        Collections.shuffle(list);
        System.out.println("----------------洗牌结束------------------------");
    }

    //展示一副扑克牌
    public void showCards(){
        System.out.print("当前的扑克牌为:");
        System.out.print("[ ");
        for(int i=0;i<list.size();i++){
            System.out.print(list.get(i).getColor() + list.get(i).getNumber()+ " ");
        }
        System.out.println(" ]");
    }

}

//Player.java

package card;

import java.util.ArrayList;
import java.util.List;

public class Player {
    private int id;
    private String name;
    private List<Card> handCards = new ArrayList<Card>();

    public Player(int id, String name){
        this.id = id;
        this.name = name;
    }

    public List<Card> getHandCards() {
        return handCards;
    }

    public void setHandCards(Card card) {
        handCards.add(card);
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

//CardComparator.java(自定义排序规则)

package card;

import java.util.Comparator;

public class CardComparator implements Comparator<Card> {

    @Override
    public int compare(Card c1, Card c2) {
        // 构建花色和牌值数组,通过比对,计算得到某张牌的价值(大小)
        String[] color = {"方片", "梅花", "红桃", "黑桃"};
        String[] number = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J","Q","K", "A"};

        //由于比较规则是先比较牌值,如果相等再比较花色(黑红梅方),所以将牌值赋予较高的权值
        int valueOfC1 = 0;
        int valueOfC2 = 0;
        for(int i=0;i<number.length;i++){
            if(c1.getNumber().equals(number[i])) valueOfC1 += i*10;
            if(c2.getNumber().equals(number[i])) valueOfC2 += i*10;
        }
        for(int i=0;i<color.length;i++){
            if(c1.getColor().equals(color[i])) valueOfC1 += i;
            if(c2.getColor().equals(color[i])) valueOfC2 += i;
        }

        if( valueOfC1 > valueOfC2 ) return -1;
        if( valueOfC1 < valueOfC2 ) return 1;

        return 0;
    }

}

//PlayDemo.java

package card;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class PlayDemo {

    //创建玩家
    //要对玩家ID的异常处理,要求用户只能输入整数ID,否则需要重新输入
    public Player setPlayer(){
        int id=0;
        String name="";
        Scanner console = new Scanner(System.in);
        boolean ready = true;
        do{
            try{
                System.out.println("输入ID:");
                id = console.nextInt();
                ready = true;
            }catch(Exception e){
                System.out.println("请输入整数类型的ID!");
                ready = false;
                console.nextLine();
            }
        }while(ready==false);

        System.out.println("输入姓名:");
        name = console.next();      
        return new Player(id, name);
    }

    public static void main(String[] args) {
        //测试简易扑克牌程序
        PlayDemo game = new PlayDemo();
        //(1)创建一副牌
        Cards cards = new Cards();
        //(2)展示新的扑克牌
        cards.showCards();
        //(3)洗牌
        cards.shufCards();
        //(4)创建玩家
        System.out.println("--------------创建两个(or多个)玩家就可以开始游戏啦!-------------");
        List<Player> p = new ArrayList<Player>();
        for(int i=0;i<2;i++)
        {
            System.out.println("请输入第"+(i+1)+"位玩家的ID和姓名:");
            p.add(game.setPlayer());
        }
        for(int i=0;i<p.size();i++)
        {
            System.out.println("欢迎玩家:"+p.get(i).getName());
        }
        //(5)扑克牌比大小游戏开始啦~
        int count = 0;
        System.out.println("------------------开始发牌---------------------");
        //设定每人分别拿两张(or多张)
        for(int i=0; i<2;i++){
            //玩家轮流拿牌
            for(int j=0; j< p.size(); j++){
                System.out.println(">玩家"+p.get(j).getName()+"拿牌");
                p.get(j).setHandCards(cards.getList().get(count));
                count++;
            }
        }
        System.out.println("------------------发牌结束!--------------------");
        System.out.println("------------------开始游戏 ---------------------");
        for(int i=0;i<p.size();i++){
            System.out.print("玩家"+p.get(i).getName()+"的手牌为:[ ");
            for(int j=0;j<p.get(i).getHandCards().size();j++){
                Card cur = p.get(i).getHandCards().get(j);
                System.out.print(cur.getColor()+cur.getNumber()+" ");
            }
            System.out.println(" ]");
        }

        //排序得到每个玩家最大的手牌(排序规则自定义)
        for(int i=0;i<p.size();i++){
            Collections.sort(p.get(i).getHandCards(), new CardComparator());
        }
        List<Card> maxCard = new ArrayList<Card>();
        for(int i=0;i<p.size();i++){
            Card maxCur = p.get(i).getHandCards().get(0);
            System.out.println("玩家"+p.get(i).getName()+"最大的手牌为:"+ maxCur.getColor()+maxCur.getNumber());
            maxCard.add(maxCur);
        }

        //得到最后的胜者
        List<Card> temp = new ArrayList<Card>();
        temp.addAll(maxCard);
        Collections.sort(temp, new CardComparator());
        for(int i=0;i<p.size();i++){
            if(maxCard.get(i).equals(temp.get(0))) System.out.println("恭喜玩家:"+p.get(i).getName()+"获胜!"); 
        }

    }

}

游戏运行截图

这里写图片描述
这里写图片描述
还有一个地方需要优化,即不能输入重复的ID和姓名,可以重写Player的equals方法,将用户的输入与已有的输入相比较,不满足要求则需要重新输入,不过就先不加了,我要回去睡觉啊啊啊啊!

  • 16
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
好的,编写扑克牌游戏的一般思路如下: 1. 定义扑克牌的类,包括花色、点数、是否是明牌等属性; 2. 定义扑克牌集合的类,包括所有扑克牌的集合、发牌、洗牌等方法; 3. 定义玩家类,包括手牌、牌面点数等属性,以及抽牌、出牌等方法; 4. 定义游戏类,包括游戏初始化、玩家出牌、判断胜负等方法。 以下是一个简单的 Java 代码示例,可以作为参考: ```java // 扑克牌类 class Card { String suit; // 花色 int rank; // 点数 boolean isFaceUp; // 是否明牌 Card(String suit, int rank) { this.suit = suit; this.rank = rank; this.isFaceUp = false; // 初始状态为背面朝上 } // 翻牌 void flip() { isFaceUp = !isFaceUp; } // 获取牌面点数 int getValue() { if (isFaceUp) { return rank; } else { return 0; } } } // 扑克牌集合类 class Deck { ArrayList<Card> cards; // 所有扑克牌的集合 Deck() { cards = new ArrayList<Card>(); String[] suits = {"Spades", "Hearts", "Diamonds", "Clubs"}; for (String suit : suits) { for (int rank = 1; rank <= 13; rank++) { Card card = new Card(suit, rank); cards.add(card); } } } // 洗牌 void shuffle() { Collections.shuffle(cards); } // 发牌 Card deal() { Card card = cards.get(0); cards.remove(0); return card; } } // 玩家类 class Player { String name; // 玩家名称 ArrayList<Card> hand; // 手牌 int score; // 牌面点数之和 Player(String name) { this.name = name; this.hand = new ArrayList<Card>(); this.score = 0; } // 抽牌 void drawCard(Deck deck) { Card card = deck.deal(); card.flip(); // 抽到的牌默认为明牌 hand.add(card); score += card.getValue(); } // 出牌 Card playCard(int index) { Card card = hand.get(index); card.flip(); // 出的牌翻面 hand.remove(index); score -= card.getValue(); return card; } } // 游戏类 class Game { Deck deck; // 扑克牌集合 ArrayList<Player> players; // 玩家集合 int currentPlayerIndex; // 当前玩家的下标 Game() { this.deck = new Deck(); this.players = new ArrayList<Player>(); this.currentPlayerIndex = 0; } // 初始化游戏 void init() { deck.shuffle(); for (int i = 1; i <= 4; i++) { Player player = new Player("Player " + i); for (int j = 1; j <= 5; j++) { player.drawCard(deck); } players.add(player); } } // 玩家出牌 void playCard(int index) { Player currentPlayer = players.get(currentPlayerIndex); Card card = currentPlayer.playCard(index); System.out.println(currentPlayer.name + " plays " + card.rank + " of " + card.suit); // 下一个玩家 currentPlayerIndex++; if (currentPlayerIndex >= players.size()) { currentPlayerIndex = 0; } } // 判断胜负 void checkWinner() { int maxScore = 0; Player winner = null; for (Player player : players) { if (player.score > maxScore) { maxScore = player.score; winner = player; } } System.out.println(winner.name + " wins with " + maxScore + " points!"); } } // 主程序 public class Main { public static void main(String[] args) { Game game = new Game(); game.init(); while (true) { System.out.println("Current player: " + game.players.get(game.currentPlayerIndex).name); Scanner scanner = new Scanner(System.in); System.out.print("Enter index of card to play (-1 to quit): "); int index = scanner.nextInt(); if (index == -1) { break; } game.playCard(index); } game.checkWinner(); } } ``` 这是一个简单的控制台程序,玩家可以通过输入 index 来出牌,每个玩家初始抽 5 张牌,玩家出完牌后程序会自动判断胜负。当然,你也可以按照自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值