java实现多人多牌数比较游戏

本文实例为大家分享了java实现多人多牌数比较游戏的具体代码,供大家参考,具体内容如下

具体实现步骤如下:

  • 实现扑克Card类,用于储存扑克牌,1-13代表点数,4-1代表花色(黑桃,红桃,梅花,分块)
  • 实现扑克列表CardList类,用于实现生成一副牌,洗牌,发牌的功能
  • 实现玩家Player类,用于储存玩家信息
  • 实现玩家列表PlayerList类,用于储存所有玩家信息,并且实现玩家洗牌、发牌、比较牌大小的方法
  • 主方法Index05类,用于启动扑克游戏

Card.java

/**
 *
 */
package dk.card;

/**
 * @author Administrator
 * 扑克类
 */
public class Card implements Comparable<Card>{
 private int number;//牌的点数--1到13
 private int type;//牌的花色--4种花色:♠(黑桃):4 ♥(红桃):3 ♣(梅花):2 方块:1

 public Card() {
  super();
 }
 public Card(int number, int type){
  if(number==1)
   number=14;
  this.number = number;
  this.type = type;
 }
 public int getNumber() {
  return number;
 }
 public void setNumber(int number) {
  this.number = number;
 }
 public int getType() {
  return type;
 }
 public void setType(int type) {
  this.type = type;
 }

 @Override
 public int hashCode() {
  final int prime = 31;
  int result = 1;
  result = prime * result + number;
  result = prime * result + type;
  return result;
 }
 @Override
 public boolean equals(Object obj) {
  if (this == obj)
   return true;
  if (obj == null)
   return false;
  if (getClass() != obj.getClass())
   return false;
  Card other = (Card) obj;
  if (number != other.number)
   return false;
  if (type != other.type)
   return false;
  return true;
 }
 @Override
 public int compareTo(Card o) {
  if(this.number>o.number)
   return -1;
  else if(this.number<o.number)
   return 1;
  else
   if(this.type>o.type)
    return -1;
   else if(this.type<o.type)
    return 1;

  return 0;
 }

 public String toString(){
  String str ="";
  switch(this.type){
  case 1: str = "方块";break;
  case 2: str = "梅花";break;
  case 3: str = "红桃";break;
  case 4: str = "黑桃";break;
  }
  String n="";
  switch(this.number){
  case 14:n="A";break;
  case 11:n="J";break;
  case 12:n="Q";break;
  case 13:n="K";break;
  default:n=this.number+"";
  }
  return str+n;
 }

}

CardList.java

package dk.card;

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

/**
 * @author Administrator
 * 牌表操作类
 */
public class CardList {
 public static List<Card> cardlist = new ArrayList<Card>(52);//储存扑克牌
 public static List<ArrayList<Card>> poker;//储存发牌结果

 //生成一副牌
 public static void generateCard() {
  for(int i=1;i<=13;i++){
   for(int j=1;j<=4;j++){
    Card c = new Card(i,j);
    cardlist.add(c);
   }
  }

 }

 //打印一副牌
 public static void printCardList(){
  System.out.print("[");
  for(Card c:cardlist){
   System.out.print(c.toString()+" ");
  }
  System.out.println("]");
 }

 //洗牌
 public static void shuffleCard(){
  List<Card> scard = new ArrayList<Card>(52);
  Card c;
  Random random = new Random();
  for(int i=1;i<=52;i++){

   do{
     c = cardlist.get(random.nextInt(52));
   }while(scard.contains(c));
   scard.add(c);
  }
  cardlist.clear();
  cardlist = scard;
  printCardList();
 }

 /**
  * 发牌
  * @param i number of player
  * @param j number of card
  * @return
  */
 public static List<ArrayList<Card>> dealCard(int i,int j){
  try{
   if(i<=1){
    throw new Exception("发牌规则有误:玩家至少为2人,请重新定义规则!");
   }
   if(i*j>52){
    throw new Exception("发牌规则有误:牌数超出扑克张数,请重新定义规则!");
   }

   poker = new ArrayList<ArrayList<Card>>(i);//储存玩家发到的牌

   //生成玩家手中的牌列表
   for(int h=0;h<i;h++){
    ArrayList<Card> player_card_list = new ArrayList<Card>(j);
    poker.add(player_card_list);

   }
   //给每个玩家发牌
   for(int k=0;k<j;k++){
    for(int d=0;d<i;d++){
     ArrayList<Card> player_card_list = poker.get(d);
     Card card = getCard();
     player_card_list.add(card);
    }
   }

  }catch(Exception e){
   e.printStackTrace();
  }
  return poker;
 }

 //抓取一张牌
 public static Card getCard(){
  return cardlist.remove(0);
 }

 //获取一位玩家的牌
 public static ArrayList<Card> getPoker(){
  return poker.remove(0);
 }

 public static void clear(){
  cardlist.clear();
  poker.clear();
  printCardList();

 }

}

Player.java

/**
 *
 */
package dk.card;

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

/**
 * @author Administrator
 * 玩家类
 */
public class Player implements Comparable<Player>{
 private String id;//玩家id
 private String name;//玩家姓名
 private List<Card> poker;//玩家手牌
 private Card max;//玩家最大的牌
 public Player(String id ,String name){
  this.id = id;
  this.name = name;
  this.setPoker(new ArrayList<Card>());
 }
 public String getId() {
  return id;
 }
 public void setId(String id) {
  this.id = id;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public List<Card> getPoker() {
  return poker;
 }

 public Card getMax() {
  return max;
 }
 public void setMax(Card max) {
  this.max = max;
 }
 public void setPoker(List<Card> poker) {
  this.poker = poker;
  Collections.sort(this.poker);
  for(Card c :this.poker){
   this.setMax(c);
   break;
  }
 }
 public String toString(){
  return "玩家Id:"+this.id+"\t玩家姓名:"+this.name;
 }

 //玩家摊牌
 public String showCard(){
  String msg="";
  for(Card c:this.poker){
   msg+=c.toString()+" ";
  }
  return this.toString()+"\t\n"+"玩家牌信息:\t\n"+msg;
 }
 @Override
 public int compareTo(Player o) {
  return this.max.compareTo(o.getMax());
 }

}

PlayerList.java

package dk.card;

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

/**
 * @author Administrator
 * 储存玩家列表
 */
public class PlayerList {

 public static List<Player> playerlist = new ArrayList<Player>();//储存扑玩家列表
 public static int sum;
 public static List<String> rules = new ArrayList<String>();
 public PlayerList(){

 }

 public static void setRule(String rule){
  rules.add(rule);
 }

 public static String getRules(){
  String str="";
  for(String s:rules){
   str+=s+"\t\n";
  }
  return str;
 }

 public static void printRules(){
  show(getRules());
 }

 //添加玩家
 public static boolean addplayer(Player player){
  show("添加玩家:"+player.toString());
  show("----------------------------------------");
  sum++;
  return playerlist.add(player);
 }

 //给所有玩家发牌
 public static void shuffleCardToPlayer(){
   for(Player player:playerlist){
    player.setPoker(CardList.getPoker());
   }
 } 

 //显示发牌结果
 public static void showCard(){
  for(Player player:playerlist){
   show(player.showCard());
   show("----------------------------------------");
  }
 }

 //比较牌点大小并且显示赢家信息
 public static void showWinner(){
  Collections.sort(playerlist);
  Player p = playerlist.get(0);
  show(p.showCard());
  show("本局赢家是:"+p.getName());
 }

 //玩家人数
 public static int size(){
  return sum;
 }

 public static void show(Object obj){
  System.out.println(obj.toString());
 }

 public static void clear(){
  playerlist.clear();
  sum = 0 ;
 }

}

Index05.java

/**
 *
 */
package dk.main;

import java.util.Scanner;

import dk.card.CardList;
import dk.card.Player;
import dk.card.PlayerList;

/**
 * @author Administrator
 *
 */
public class Index05 extends Show {

 public static Scanner scanner = new Scanner(System.in);

 /**
  * 调用的主方法
  * @param args
  */
 public static void main(String[] args) {
  show("是否开始游戏?0/1");
  int isStart = scanner.nextInt();
  if(isStart==1){
   startGame();
  }
  else{
   show("退出游戏!");
  }

 }

 //启动扑克游戏
 public static void startGame(){
  show("游戏规则如下:");
  PlayerList.setRule("1.至少需要两名玩家");
  PlayerList.setRule("2.所有玩家的牌数加起来不超过52张牌");
  PlayerList.setRule("3.比较所有玩家手中最大的牌点,最大的牌点数的玩家获胜");
  PlayerList.setRule("4.总的牌数只有52张,没有大小王");
  PlayerList.setRule("5.黑桃牌A最大,方块3最小,点数相同时,比较花色,黑桃较大。");
  PlayerList.printRules();
  show("请输入玩家人数:");
  int players = 2;//默认玩家数目
  int cardofplay = 2;//默认每个玩家的手牌数目
  try {
    players = scanner.nextInt();
    while(players<2){
     show("玩家人数至少是两人");
     show("请重新输入人数:");
     players = scanner.nextInt();
    }

    show("请输入每个玩家持有的牌数:");
    cardofplay = scanner.nextInt();
    while(cardofplay*players>52){
     show("玩家*牌数超出范围!请重新输入牌数");
     cardofplay = scanner.nextInt();
    }

    show("开始输入玩家信息:");
    for(int i=0;i<players;i++){
     show("请输入第"+(i+1)+"个玩家姓名:");
     String name = scanner.next();
     Player p =new Player("00"+i,name);
     PlayerList.addplayer(p);
    }
    show("一副没有洗的牌:");
    CardList.generateCard();//生成一副扑克
    CardList.printCardList();//打印扑克
    show("========================================");
    show("开始洗牌:");
    CardList.shuffleCard();//洗牌
    show("========================================");
    show("开始发牌:........发牌中......");
    CardList.dealCard(players,cardofplay);//发牌
    PlayerList.shuffleCardToPlayer();//给玩家发牌
    show("发牌结果:");
    PlayerList.showCard();//显示所有玩家牌信息
    show("========================================");
    show("比较结果:比较牌点大小并且显示赢家信息");
    PlayerList.showWinner();//显示本轮赢家
    show("========================================");
  } catch (Exception e) {

   e.printStackTrace();
  }
 }

 //清空游戏
 public static void clearGame(){
   CardList.clear();
   PlayerList.clear();
 }

 //测试扑克游戏
 public static void testGame(){
  try {
   show("一副没有洗的牌:");
   CardList.generateCard();
   CardList.printCardList();
   show("========================================");
   show("开始添加玩家:");
   Player p =new Player("001","DekingChen");
   Player p1 =new Player("002","chenzhenquan");
   Player p2 =new Player("003","czq");
   PlayerList.addplayer(p);
   PlayerList.addplayer(p1);
   PlayerList.addplayer(p2);
   show("开始洗牌:");
   CardList.shuffleCard();
   show("========================================");
   show("开始发牌:........发牌中......");
   int players = PlayerList.size();//玩家数目
   int cardofsum = 3;//每个玩家的手牌数目
   CardList.dealCard(players,cardofsum);
   PlayerList.shuffleCardToPlayer();
   show("发牌结果:");
   PlayerList.showCard();
   show("========================================");
   show("比较结果:比较牌点大小并且显示赢家信息");
   PlayerList.showWinner();
   show("========================================");
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

}

Show.java(辅助显示类)

package dk.main;

public abstract class Show {

 public static void show(Object obj){
  System.out.println(obj.toString());
 }
}

实验结果:

是否开始游戏?0/1
1
游戏规则如下:
1.至少需要两名玩家
2.所有玩家的牌数加起来不超过52张牌
3.比较所有玩家手中最大的牌点,最大的牌点数的玩家获胜
4.总的牌数只有52张,没有大小王
5.黑桃牌A最大,方块3最小,点数相同时,比较花色,黑桃较大。 

请输入玩家人数:
5
请输入每个玩家持有的牌数:
5(<a href="http://www.dztcsd.com/">资质代办</a>)
开始输入玩家信息:
请输入第1个玩家姓名:
DekingChen
添加玩家:玩家Id:000 玩家姓名:DekingChen
----------------------------------------
请输入第2个玩家姓名:
czq
添加玩家:玩家Id:001 玩家姓名:czq
----------------------------------------
请输入第3个玩家姓名:
chenzhenquan
添加玩家:玩家Id:002 玩家姓名:chenzhenquan
----------------------------------------
请输入第4个玩家姓名:

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

(0)

相关推荐

  • Java编写的24点纸牌游戏

    任意4个1-13数字,加减乘除计算24点. 实现原理: 1)排列组合4个数字 2)计算每次排列组合的可能性 Cal24.java import java.util.HashSet; import java.util.Set; public class Cal24 { private static final double precision = 0.00001; private static final int target = 24; public String[] execute(Strin

  • JAVA collection集合之扑克牌游戏实例

    Collection 层次结构中的根接口.Collection表示一组对象,这些对象也称为collection的元素.一些 collection 允许有重复的元素,而另一些则不允许.一些 collection 是有序的,而另一些则是无序的.JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和 List)实现.此接口通常用来传递 collection,并在需要最大普遍性的地方操作这些 collection. 主要内容:这里使用collection集合,模拟香港电影中大佬们玩的

  • java实现纸牌游戏之小猫钓鱼算法

    星期天小哼和小哈约在一起玩桌游,他们正在玩一个非常古怪的扑克游戏--"小猫钓鱼".游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份.小哼先拿出手中的第一张扑克牌放在桌上,然后小哈也拿出手中的第一张扑克牌,并放在小哼刚打出的扑克牌的上面,就像这样两人交替出牌.出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾.当任意一人手中的牌全部出完时,游戏结束,对手获胜. 假如游戏开始时,小哼手中有 6 张牌,顺序为 2 4

  • Java实现洗牌发牌的方法

    本文实例讲述了Java实现洗牌发牌的方法.分享给大家供大家参考.具体如下: import java.util.*; public class Main { /** * @param args the command line arguments */ static int numbersOfPlayers = 4; static int numbersOfHandCard = 13; public static void main(String[] args) { // TODO code ap

  • Java模拟扑克牌洗牌实现生成52张扑克的方法示例

    本文实例讲述了Java模拟扑克牌洗牌实现生成52张扑克的方法.分享给大家供大家参考,具体如下: 要求: 生成52张扑克,模拟扑克牌洗牌,并输出. 实现代码: package com.NCU.ZHANGhuirong; import java.util.ArrayList; import java.util.Collections; public class Card { public String poker(int num) { String str = ""; String[] f

  • java实现斗地主游戏

    感想: 第一次写博客,感觉编辑器挺复杂厉害的,感觉自己的内容挺简单的.有什么问题请多多指教! 思路: 1.创建一个扑克牌的实体类Poker,设置了四个参数:花色.数字.牌值(判断大小).是否地主牌,实现getset方法和构造方法: 2.创建一个玩家的实体类Player,设置了四个参数: 初始牌集合,排序后牌集合,牌值集合,是否地主,实现getset方法和构造方法: 3.洗牌:循环嵌套花色数组跟数字数组生成52个Poker,手动加入大小王Poker,放进map(int,Poker)里面,利用Col

  • Java基础高级综合练习题扑克牌的创建

    最近学了很多的知识,脑容量小,记不清,还是得做做练习! 今天就做了一个扑克牌的练习 首先呢..这个逻辑一定要非常清楚,我们要想做出一副扑克牌,必定要弄清楚每一张牌和整的一副牌 首先分析 一张扑克 一张牌里面有什么?相信大家看图(图不是我写的)就应该懂了,一张扑克有属于它自己的花色(红桃,黑桃,梅花,方块) 以及自己的点数(A,2,3-..J,Q,K)就这两种属性,对吧! 那么花色符号,点数符号是个啥? 花色符号就是来代替我们的花色的,我们不可能拿着"红桃"这种文字写进程序吧!所以我们可

  • java实现多人多牌数比较游戏

    本文实例为大家分享了java实现多人多牌数比较游戏的具体代码,供大家参考,具体内容如下 具体实现步骤如下: 实现扑克Card类,用于储存扑克牌,1-13代表点数,4-1代表花色(黑桃,红桃,梅花,分块) 实现扑克列表CardList类,用于实现生成一副牌,洗牌,发牌的功能 实现玩家Player类,用于储存玩家信息 实现玩家列表PlayerList类,用于储存所有玩家信息,并且实现玩家洗牌.发牌.比较牌大小的方法 主方法Index05类,用于启动扑克游戏 Card.java /** * */ pa

  • Java模拟实现扑克牌洗牌和发牌的示例代码

    目录 一. 需求 二. 全局代码 poker.java pokers.java 三. 设计分析 1. 设计一张扑克牌 2. 得到一副新牌 3. 洗牌 4. 发牌 一. 需求 设计一副新的的扑克牌, 4个花色(♥, ♠, ♦, ♣)对应 1 到 13 , 不算大小王一共52张牌 ; 然后将扑克牌随机打乱顺序 , 最后实现三个人进行摸牌 , 三个人轮流进行摸牌(每次摸一张牌) , 最终每个人手里有五张牌 二. 全局代码 poker.java public class poker { private

  • 利用Java快速查找21位花朵数示例代码

    前言 本文主要给大家介绍了关于利用Java快速查找21位花朵数的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 以前备赛的时候遇到的算法题,求所有21位花朵数,分享一下,供大家参考,效率已经很高了. 示例代码 package com.jianggujin; import java.math.BigInteger; import java.util.ArrayList; import java.util.List; /** * 水仙花数 * * @author jian

  • java线程池:获取运行线程数并控制线程启动速度的方法

    在java里, 我们可以使用Executors.newFixedThreadPool 来创建线程池, 然后就可以不停的创建新任务,并用线程池来执行了. 在提交任务时,如果线程池已经被占满,任务会进到一个队列里等待执行. 这种机制在一些特定情况下会有些问题.今天我就遇到一种情况:创建线程比线程执行的速度要快的多,而且单个线程占用的内存又多,所以很快内存就爆了. 想了一个办法,就是在提交任务之前,先检查目前正在执行的线程数目,只有没把线程池占满的时候在去提交任务. 代码很简单: int thread

  • Java实现两人五子棋游戏(三) 画出棋子

    上一篇文章讲的是Java实现两人五子棋游戏(二) 画出棋盘,已经画好棋盘,接下来要实现控制功能,主要功能: 1)选择棋子 2)画棋子 3)判断胜负 4)交换行棋方 先实现画棋子PART -------------画棋子代码示例如下-------------- 首先,定义一个棋子类,这个类有两个属性,棋子颜色(0-表示黑色,1-表示白色),是否落子(我计划用一个二维数组才存储棋子的落子信息) Chessman.java package xchen.test.simpleGobang; public

  • Java实现两人五子棋游戏(二) 画出棋盘

    本文为大家分享了java画出五子棋游戏棋盘的方法,供大家参考,具体内容如下 棋盘模块: 画五子棋棋盘:19条横线.19条竖线 步骤一:显示棋盘 我有一张名为chessboard.png的棋盘,位置为根目录/res/drawable/chessboard/png,现在我要显示这张图片. DrawChessBoard.java package xchen.test.simpleGobang; import java.awt.Graphics; import java.awt.Image; impor

  • Java实现两人五子棋游戏(七) 屏幕提示信息

    之前的两篇文章:Java实现两人五子棋游戏(二) 画出棋盘:Java实现两人五子棋游戏(三) 画出棋子:Java实现两人五子棋游戏(四) 落子动作的实现:Java实现两人五子棋游戏(六) 行棋方变换,可以点击查看. 接下来我们要实现的功能是在有五连珠的时候,在屏幕上提示信息.直接在mousePressed函数的isWin部分使用showMessageDialog即可. mousePressed函数代码如下: @Override //当用户按下鼠标按钮时发生 public void mousePr

  • Java实现两人五子棋游戏(六) 行棋方变换

    之前的两篇文章:Java实现两人五子棋游戏(二) 画出棋盘:Java实现两人五子棋游戏(三) 画出棋子:Java实现两人五子棋游戏(四) 落子动作的实现,可以点击查看. 前面我们已经画好棋盘和棋子,并可以自由落子,且可以判断棋盘中是否有五连珠.接下来的工作是,每次落子后交换行棋方(即将下一棋子颜色由白->黑或黑->白),并将胜出判断增加颜色判断条件(棋盘上存在五连珠->棋盘上存在同色的五连珠). 主模块Main.java和棋子类Chessman.java不变,我们要对DrawChessB

  • Java实现两人五子棋游戏(五) 判断是否有一方胜出

    之前的两篇文章:Java实现两人五子棋游戏(二) 画出棋盘:Java实现两人五子棋游戏(三) 画出棋子:Java实现两人五子棋游戏(四) 落子动作的实现,可以点击查看. 前面我们已经画好了棋盘.棋子并且可以自由的落子了,那么接下来要实现的功能是判断是否有五连珠(暂时不考虑行棋方). 我们采用遍历棋盘已经落子的位置,查看每个落子点,在它的上下,左右,左下右上,左上右下四个方向的任一方向上是否有五个连续的棋子. 第一步,对棋子类进行改造,之前我们的棋子类只有颜色信息和落子状态,现在要新增一个int型

  • Java实现两人五子棋游戏(四) 落子动作的实现

    之前的两篇文章:Java实现两人五子棋游戏(二) 画出棋盘:Java实现两人五子棋游戏(三) 画出棋子 前面,我们已经画好的棋盘和棋子,接下来,我们要通过鼠标点击屏幕获取落子位置并落子(先不考虑行棋方和胜负判断). 步骤: 1)捕捉鼠标按下的位置 2)经过坐标变换(由像素位置->0-19的棋盘位置) 3)更新记录棋盘状态的二维数组 4)重新渲染绘制棋盘. -------------落子动作代码示例如下-------------- 一个棋子类Chessman.java package xchen.

随机推荐