java是一门面向对象的语言,我们在解决这个问题的时候先找对象。我认为面想对象 “就是把复杂的问题变简单,简单的问题程序化” 。如果我们  创建一盒牌--->洗牌--->选地主牌--->发牌--->发到地主牌--->底牌。这样分析的话这不就成了面向过程吗? 但是若是我们这样实现了今后的还有什么拓展性可言呢?  所以我们要面向对象。这才是java的精髓。

  下面我们就以面向对象的思想去分析这个问题:发牌的对象有:牌,扑克,玩家,发牌的人。最好的方法是我们先创建这几个类,然后再去定义属性和行为,但是时间关系我就直接把做好的发出来,一个对象一个对象的分析最后再来总结。

  下面我们先创建牌(Card)类它的主要属性就是牌的名字(name),和每一张牌对应的大小(order)代码如下:

package com.miss.time1227.poker;

/**
 * @author MISS
 *    功能:牌类
 */
public class Card  implements Comparable<Card>{

    /**
     * 牌的名字
     */
    private String name;
    /**
     * 牌的大小
     */
    private int order;

    public Card(String name, int order) {
        this.name = name;
        this.order = order;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getOrder() {
        return order;
    }
    public void setOrder(int order) {
        this.order = order;
    }
    public Card() {

    }
    @Override
    public int compareTo(Card o) {
        // TODO Auto-generated method stub
        if(this.order > o.order){
            return 1;
        }
        if(this.order < o.order){
            return -1;
        }
        return 0;
    }

}

  在牌这个类中我实现了Comparable这个接口,我将在发牌这个类讲到。

  那么我们下一步就是创建扑克这个类,它的主要属性就是一盒牌 但是我们得在这个类中创建好代码如下: 

/**
 *
 */
package com.miss.time1227.poker;

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

/**
 * @author MISS
 *    描述:扑克类
 */
public class PuKe{

    /**
     * 牌的集合 card 的泛型
     */
    private List<Card> list = new ArrayList<Card>();

    public PuKe() {

        String[] str = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
        int order = 1;

        for (int j = 0; j < str.length; j++) {
            this.list.add(new Card("方块" + str[j],order));
            this.list.add(new Card("梅花" + str[j],order));
            this.list.add(new Card("黑桃" + str[j],order));
            this.list.add(new Card("红心" + str[j],order));
            order++;
        }

        this.list.add(new Card("小王",++order));
        this.list.add(new Card("大王",++order));

    }
    public List<Card> getList() {
        return list;
    }
    public void setList(List<Card> list) {
        this.list = list;
    }
}

  在这里我们就是创建了一个Card类类型的引用类型的泛型,这里我是在构造方法中实现,其实可以给它一个方法去实现这个创建牌的行为,然后再在构造方法中去调用。上面的代码创建方法也是比较简单易懂,我就是创建一一个数组,然后循环给值,最后再创建大小网。order就是牌的大小,在发完牌排序的时候就会用到。

  我们在发牌之前是不是要有3个玩家和一副牌才能发啊,这样我们就确定了该类的4个属性 有了我们就来看看它有哪些行为,既然我们要发牌,发牌就是我们主要得行为啊

发牌之前我们先洗牌在Collections 类中的 shuffle 方法就是一个打乱 list的一个方法我们直接调用 不就完成了。在生成地主牌,最后再挨个的发牌。

    

package com.miss.time1227.poker;

import java.util.Collections;
import java.util.List;
import java.util.Random;

/**
 * @author MISS
 *    功能:发牌 */
public class PlayCard {

    private Person p1;
    private Person p2;
    private Person p3;
    private PuKe puKe;

    public PlayCard(Person p1, Person p2, Person p3, PuKe puKe) {
        super();
        this.p1 = p1;
        this.p2 = p2;
        this.p3 = p3;
        this.puKe = puKe;
    }

    public Person getP1() {
        return p1;
    }

    public void setP1(Person p1) {
        this.p1 = p1;
    }

    public Person getP2() {
        return p2;
    }

    public void setP2(Person p2) {
        this.p2 = p2;
    }

    public Person getP3() {
        return p3;
    }

    public void setP3(Person p3) {
        this.p3 = p3;
    }

    public PuKe getPuKe() {
        return puKe;
    }

    public void setPuKe(PuKe puKe) {
        this.puKe = puKe;
    }

    public void fapai() {
        List<Card> cards = puKe.getList();
        Collections.shuffle(cards);//洗牌

        Random random = new Random();
        /**
         * 地主牌
         */
        int hostIndex = random.nextInt(54);
        String host=cards.get(hostIndex).getName();//地主牌
        System.out.println("地主牌: "+host);

        List<Card> list1 = cards.subList(0, 17);
        Collections.sort(list1);
        p1.setPerList(list1);

        List<Card> list2 = cards.subList(17, 34);
        Collections.sort(list2);
        p2.setPerList(list2);

        List<Card> list3 = cards.subList(34, 51);
        Collections.sort(list3);
        p3.setPerList(list3);

        List<Card>  dipai=cards.subList(51, 54);

        String name = "";
        if(display(p1,host)){
            name = p1.getName();
        }
        if(display(p2,host)){
            name = p2.getName();
        }
        if(display(p3,host)){
            name = p3.getName();
        }
        System.out.println("底牌:  ");
        for(Card card:dipai){
            System.out.print(card.getName()+"\t");
        }
        System.out.print(" 地主是: " + name);
        System.out.println();

    }

    public  boolean display(Person p,String host) {
        // TODO Auto-generated method stub

        boolean hostName = false;
        System.out.println(p.getName() + ": ");

        for(Card c : p.getPerList()){
            if(c.getName() == host){
                hostName = true;
                System.out.print(c.getName()+("(地主)")+"\t");
            }else{
                System.out.print(c.getName() +"\t");
            }
        }
        System.out.println();
        return hostName;
    }
}

  最后我写了个测试类:

  

/**
 *
 */
package com.miss.time1227.poker;

/**
 * @author Administrator
 *
 */
public class Test {

    public Test() {
        // TODO Auto-generated constructor stub
    }
    public static void main(String[] args) {

        Person p1= new Person();
        p1.setName("小马");
        Person p2= new Person();
        p2.setName("小二");
        Person p3= new Person();
        p3.setName("小牛");

        PuKe puKe = new PuKe();

        PlayCard playCard = new PlayCard(p1,p2,p3,puKe);
        playCard.fapai();

    }
}

  最终的结果是:

  

  最后和大家总结一下,实现地主的发牌就我觉得就是体现了java Collecttion类 的重要性 它在很多方面要比数组方便很多。还有很多封装好的方法大家可以用。

  写得不是很好,大家可以交流的地方希望大家给我留言。

  

JAVA 实现发牌的 改进的更多相关文章

  1. Java 扑克牌发牌

    今天看到这个算法题,http://www.cnblogs.com/xishuai/p/3392981.html ,忍不住自己用Java做了一个. 初始化很重要,所有的52张牌按顺序放入到容器里边,标志 ...

  2. 结对编程——paperOne基于java的四则运算 功能改进

    项目成员:张金生     张政 由于新的需求,原本使用JSP的实现方式目前改为Java实现,即去除了B/S端. 需求分析: 1.四则运算要满足整数运算.分数运算两种: 2.运算题目随机,并且可以打印题 ...

  3. 词频统计的java实现方法——第一次改进

    需求概要 原需求 1.读取文件,文件内包可含英文字符,及常见标点,空格级换行符. 2.统计英文单词在本文件的出现次数 3.将统计结果排序 4.显示排序结果 新需求: 1.小文件输入. 为表明程序能跑 ...

  4. Java 8 类型转换及改进

    为对象的类型做强制转换是一种很不好的设计.但在某些情况下,我们没有其它选择.Java自诞生的那一天起,就具备这样的功能. 我觉得Java 8在一定程度改善了这项古老的技术. 静态转型 Java中最经常 ...

  5. Java 8 的新特性和改进总览

    这篇文章是对Java 8中即将到来的改进做一个面向开发者的综合性的总结,JDK的这一特性将会在2013年9月份发布. 在写这篇文章的时候,Java 8的开发工作仍然在紧张有序的进行中,语言特新和API ...

  6. 排序系列 之 冒泡排序及其改进算法 —— Java实现

    冒泡排序算法 冒泡排序算法 改进一 冒泡排序算法 改进二 冒泡排序算法 改进三 冒泡排序算法 基本思想: 在要排序的一组数中,对当前还未排好序的范围内的全部数据,自上而下对相邻的两个数依次进行比较和调 ...

  7. Java模块化规范之争(转载)

    经过近20年的发展,Java语言已成为今日世界上最成功.使用的开发者人数最多的语言之一,Java世界中无数商业的或开源的组织.技术和产品共同构成了一个无比庞大的生态系统. 与大多数开发人员的普遍认知不 ...

  8. 【译】Core Java Questions and Answers【1-33】

    前言 译文链接:http://www.journaldev.com/2366/core-java-interview-questions-and-answers Java 8有哪些重要的特性 Java ...

  9. [翻译]Java HashMap工作原理

    大部分Java开发者都在使用Map,特别是HashMap.HashMap是一种简单但强大的方式去存储和获取数据.但有多少开发者知道HashMap内部如何工作呢?几天前,我阅读了java.util.Ha ...

随机推荐

  1. 【UVA】658 - It&#39;s not a Bug, it&#39;s a Feature!(隐式图 + 位运算)

    这题直接隐式图 + 位运算暴力搜出来的,2.5s险过,不是正法,做完这题做的最大收获就是学会了一些位运算的处理方式. 1.将s中二进制第k位变成0的处理方式: s = s & (~(1 < ...

  2. ADO.NET 总结

    一.简单介绍ADO.NET System.Data:DataTable,DataSet,DataRow,DataColumn,DataRelation,Constraint System.Data.C ...

  3. 分享一个Redis帮助类

    最近在项目中使用了redis来存储已经下载过的URL,项目中用的是ServiceStack来操作Redis,一开始ServiceStack的版本用的是最新的,后来发现ServiceStack已经商业化 ...

  4. 基于visual Studio2013解决C语言竞赛题之0417四倍数

       题目 解决代码及点评 这道题目还是考察循环,通过循环遍历1234~9876,然后将每个数都用算法判断其是否符合条件#include <stdio.h> #include ...

  5. 关于 Oracle外键列上是否需要索引问题?

    外键列上缺少索引会带来两个问题,限制并发性.影响性能.而这两个问题中的任意一个都可能会造成严重性能问题.   无论是Oracle的官方文档,还是在Tom的书中都说明了两种情况下可以忽略外键上的索引.其 ...

  6. 用shell脚本爬取网页信息

    有个小需求,就是爬取一个小网站一些网页里的某些信息,url是带序号的类似的,不需要写真正的spider,网页内容也是差不多的 需要取出网页中<h1></h1>中间的字符串,而且 ...

  7. java io学习记录(路径分隔符)

    java路径分隔符(路径表示) path="E:\\xp\\test\\2.jpg"; path="E:/xp/test/2.jpg"; path=" ...

  8. Robot Framework与Web界面自动化测试学习笔记:简单例子

    假设环境已经搭建好了.这里用RIDE( Robot Framework Test Data Editor)工具来编写用例.下面我们对Robot Framework简称rf. 我们先考虑下一个最基本的登 ...

  9. Python:渗透测试开源项目

    Python:渗透测试开源项目[源码值得精读] sql注入工具:sqlmap DNS安全监测:DNSRecon 暴力破解测试工具:patator XSS漏洞利用工具:XSSer Web服务器压力测试工 ...

  10. 高级特性(6)- 高级Swing

    6.1 列表 6.1.1 JList构件 6.1.2 列表模式 6.1.3 插入和移除值 6.1.4 值的绘制6.2 表格 6.2.1 简单表格 6.2.2 表格模型 6.2.3 对行和列的操作 6. ...