java实现简易扑克牌游戏

 更新时间:2020年04月22日 14:32:40   作者:zhangmiaoran  
这篇文章主要为大家详细介绍了java实现简易扑克牌游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了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方法,将用户的输入与已有的输入相比较,不满足要求则需要重新输入,不过就先不加了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java杨辉三角、洗牌算法详细示例代码

    Java杨辉三角、洗牌算法详细示例代码

    杨辉三角是一种数学图形,它以数字的形式展示了一系列二项式系数,下面这篇文章主要介绍了Java杨辉三角、洗牌算法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-10-10
  • SpringBoot中添加监听器及创建线程的代码示例

    SpringBoot中添加监听器及创建线程的代码示例

    这篇文章主要介绍了SpringBoot中如何添加监听器及创建线程,文中有详细的代码示例,具有一定的参考价值,需要的朋友可以参考下
    2023-06-06
  • Java集合快速失败与安全失败解析

    Java集合快速失败与安全失败解析

    这篇文章主要介绍了Java集合快速失败与安全失败解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Spring Boot Admin邮件警报整合过程解析

    Spring Boot Admin邮件警报整合过程解析

    这篇文章主要介绍了Spring Boot Admin邮件警报整合过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • java中Lombok的实现示例

    java中Lombok的实现示例

    本文主要介绍了java中Lombok的实现示例,Lombok通过注解自动生成Java类的常用方法,如getter、setter、构造函数等,显著减少重复模板代码,使代码简洁易维护,感兴趣的可以了解一下
    2025-10-10
  • MyBatisPlus+Spring实现声明式事务的方法实现

    MyBatisPlus+Spring实现声明式事务的方法实现

    本文主要介绍了MyBatisPlus+Spring实现声明式事务的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • Java使用FTPClient类读写FTP

    Java使用FTPClient类读写FTP

    这篇文章主要为大家详细介绍了Java使用FTPClient类读写FTP的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • Java中StringBuilder字符串类型的操作方法及API整理

    Java中StringBuilder字符串类型的操作方法及API整理

    Java中的StringBuffer类继承于AbstractStringBuilder,用来创建非线程安全的字符串类型对象,下面即是对Java中StringBuilder字符串类型的操作方法及API整理
    2016-05-05
  • SpringBoot对接clerk实现用户信息获取功能

    SpringBoot对接clerk实现用户信息获取功能

    Clerk是一个提供身份验证和用户管理的服务,可以帮助开发者快速集成这些功能,下面我们就来看看如何使用Spring Boot对接Clerk实现用户信息的获取吧
    2025-02-02
  • SpringBoot和Vue实现动态二维码的示例代码

    SpringBoot和Vue实现动态二维码的示例代码

    二维码在现代社交和营销活动中被广泛使用,本文主要介绍了SpringBoot和Vue实现动态二维码的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2024-02-02

最新评论