JAVA 实现发牌的 改进
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 实现发牌的 改进的更多相关文章
- Java 扑克牌发牌
今天看到这个算法题,http://www.cnblogs.com/xishuai/p/3392981.html ,忍不住自己用Java做了一个. 初始化很重要,所有的52张牌按顺序放入到容器里边,标志 ...
- 结对编程——paperOne基于java的四则运算 功能改进
项目成员:张金生 张政 由于新的需求,原本使用JSP的实现方式目前改为Java实现,即去除了B/S端. 需求分析: 1.四则运算要满足整数运算.分数运算两种: 2.运算题目随机,并且可以打印题 ...
- 词频统计的java实现方法——第一次改进
需求概要 原需求 1.读取文件,文件内包可含英文字符,及常见标点,空格级换行符. 2.统计英文单词在本文件的出现次数 3.将统计结果排序 4.显示排序结果 新需求: 1.小文件输入. 为表明程序能跑 ...
- Java 8 类型转换及改进
为对象的类型做强制转换是一种很不好的设计.但在某些情况下,我们没有其它选择.Java自诞生的那一天起,就具备这样的功能. 我觉得Java 8在一定程度改善了这项古老的技术. 静态转型 Java中最经常 ...
- Java 8 的新特性和改进总览
这篇文章是对Java 8中即将到来的改进做一个面向开发者的综合性的总结,JDK的这一特性将会在2013年9月份发布. 在写这篇文章的时候,Java 8的开发工作仍然在紧张有序的进行中,语言特新和API ...
- 排序系列 之 冒泡排序及其改进算法 —— Java实现
冒泡排序算法 冒泡排序算法 改进一 冒泡排序算法 改进二 冒泡排序算法 改进三 冒泡排序算法 基本思想: 在要排序的一组数中,对当前还未排好序的范围内的全部数据,自上而下对相邻的两个数依次进行比较和调 ...
- Java模块化规范之争(转载)
经过近20年的发展,Java语言已成为今日世界上最成功.使用的开发者人数最多的语言之一,Java世界中无数商业的或开源的组织.技术和产品共同构成了一个无比庞大的生态系统. 与大多数开发人员的普遍认知不 ...
- 【译】Core Java Questions and Answers【1-33】
前言 译文链接:http://www.journaldev.com/2366/core-java-interview-questions-and-answers Java 8有哪些重要的特性 Java ...
- [翻译]Java HashMap工作原理
大部分Java开发者都在使用Map,特别是HashMap.HashMap是一种简单但强大的方式去存储和获取数据.但有多少开发者知道HashMap内部如何工作呢?几天前,我阅读了java.util.Ha ...
随机推荐
- STL vector使用方法介绍
介绍 这篇文章的目的是为了介绍std::vector,怎样恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通 ...
- IOS-图片操作集合
编辑图片的几个方法 第一种 先用UIImage对象加载一张图片 然后转化成CGImageRef放到CGContext中去编辑 第二种 用CGImageCreate函数创建CGImageRef 然后把 ...
- Spring IOC和DI原理讲解并制作LazyCoder版的Spring (一)
转载请注意出处:http://blog.csdn.net/zcm101 写在前面的话 最近,给项目组成员培训了Spring 控制反转和依赖注入的原理,并自己做了个Lazy Coder版的Spring, ...
- stm32之GPIO(二)
输入上拉:当IO口作为输入时,比如按键输入,而按键是与地连接,按下时为低电平,则没按下时该IO口应为高电平,上拉即是该IO口通过一个电阻与电源相连,则没按下时为高电平,按下即为低电平. 输入下拉:同理 ...
- activity变成Dialog的步骤
1.在布局文件上最外层最好使用RelativeLayout来布局,如果使用LinearLayout来布局的话,显示对话框的话,感觉会有点问题: 要在预览中看到框框,并且是match_parent的,而 ...
- java反射机制入门01
java反射机制入门是我从极客学院的视频中学习的. 1.反射机制背景概述 反射(Reflection)是java被视为动态(或准动态)语言的一个关键性质.反射机制指的是程序在运行时能够获取任何类的内部 ...
- Android的回调
学了两三周的安卓了,最先开始是看mars老师的视频,看了一两天结合慕课网上的一些安卓视频,到现在算是有点入门了. 安卓立用得比较多的回调函数有点不明是怎么实现的,网上找了一些资料,结合自己的实践,总算 ...
- CGroup 介绍、应用实例及原理描述
CGroup 介绍 CGroup 是 Control Groups 的缩写,是 Linux 内核提供的一种可以限制.记录.隔离进程组 (process groups) 所使用的物力资源 (如 cpu ...
- 【JSP】JSTL核心标签库的使用方法和示例
JSTL 核心标签库 JSTL 核心标签库标签共有13个,功能上分为4类: 1. 表达式控制标签:out.set.remove.catch 2. 流程控制标签:if.choose.when.other ...
- 零成本建立的.NET小组开发平台
前言 说道.NET开发平台,首先想到的就是Visual Studio,建立.NET小组开发平台自然首推TFS.但其花费却也是相当昂贵的(当然在本国可以无视这些成本),近期的开发中接触到一些开源软件并读 ...