文档章节

用JAVA面向对象特性描述现实生活斗地主的过程

火蚁
 火蚁
发布于 2013/10/13 23:00
字数 1387
阅读 429
收藏 13
点赞 0
评论 0

最近用面向对象描述现实生活中斗地主的过程

要求如下:

1.一副扑克牌,三个人斗地主,判断是否可以叫地主:有王 || 2个以上的2 || 有炸弹

2.结合底牌判断谁最适合拿底牌(看谁配出的炸弹最多,如果配出的个数相同,则看谁配出的炸弹最大)

代码如下:

import static java.lang.Math.*;// 静态引用,在本文件中可以直接使用Math类中的静态方法,而不用Math.;

 class Test1011
{
	public static void main(String args[])
	{
		// 初始化一副牌
		Pai p = new Pai();
		// 定义三个人数组
		Person person[] = new Person[3];

		// 初始化斗地主三个人
		for (int i = 0; i < person.length; i++)
		{
			person[i] = new Person(17, "玩家" + (i + 1));
		}

		// 轮流给三个人发牌
		for (int i = 0; i < 17; i++)
		{
			for (int j = 0; j < person.length; j++)
			{
				person[j].getPai(p.getPai());
			}
		}

		// 分别输出三个人的牌,并进行判断是否满足叫地主的条件
		for (int i = 0; i < person.length; i++)
		{
			// 1.打印牌
			PrintArr.print(person[i].getPais());
			// 2.判断
			int res = person[i].isCall();
			switch (res)
			{
			case 1:
				System.out.println(" " + person[i].getName() + ":有王叫地主");break;
			case 2:
				System.out.println(" " + person[i].getName() + ":有两个以上的2叫地主");break;
			case 3:
				System.out.println(" " + person[i].getName() + ":有炸弹叫地主");break;
			default :
				System.out.println(" " + person[i].getName() + ":没有资格叫地主");
			}
			System.out.println();
		}
		// 找出三张底牌
		String diPais[] = new String[3];
		System.out.print("三张底牌是:");
		for (int i = 0; i < diPais.length; i++)
		{
			diPais[i] = p.getPai();
			System.out.print(diPais[i] + " ");
		}
		System.out.println();
		
		// 结合底牌检查
		for (int i = 0; i < person.length; i++)
		{
			person[i].checkDiPais(diPais);
		}
		// 对人进行排序
		PrintArr.sort(person);

		if (person[0].getBomCount() > 0)
		{
			// 炸弹的数量
			int bomCount = person[0].getBomCount();
			// 炸弹的值
			int bomNumber = person[0].getBomNumber();
			String name = person[0].getName();// 玩家的名字
			String s = null;

			switch (bomNumber)
			{
			case 16:
				s = "王";break;
			case 15:
				s = "2";break;
			case 14:
				s = "A";break;
			case 13:
				s = "k";break;
			case 12:
				s = "Q";break;
			case 11:
				s = "J";break;
			default :
				s = bomNumber + "";
			}

			System.out.println(name + "最适合拿底牌,可以配出:" + bomCount + "个炸弹,最大的炸弹是:" + s + "炸");
		} else
		{
			System.out.println("都不适合拿底牌");
		}
	}
}

class PrintArr
{
	/* 
	* 对人进行排序
	* 规则:
	* 1.炸弹个数多的排在前面
	* 2.如果两个配出的炸弹个数一样,则比较谁配出的炸弹最大
	*/
	public static void sort(Person person[])
	{
		for (int i = 0; i < person.length - 1; i++)
		{
			int index = i;
			for (int j = i + 1; j < person.length; j++)
			{
				if (person[j].getBomCount() > person[index].getBomCount())
				{
					index = j;
				} else if (person[j].getBomCount() == person[index].getBomCount() && person[j].getBomNumber() > person[index].getBomNumber())
				{
					index = j;
				}
			}
			Person temp = person[i];
			person[i] = person[index];
			person[index] = temp;
		}
	}
	// 对字符串数组进行排序
	public static void sort(String arr[])
	{
		for (int i = 0; i < arr.length - 1; i++)
		{
			int index = i;
			for (int j = i + 1; j < arr.length; j++)
			{
				if (arr[j].charAt(1) < arr[index].charAt(1))
				{
					index = j;
				}
			}

			String temp = arr[i];
			arr[i] = arr[index];
			arr[index] = temp;
		}
	}
	// 打印字符串数组
	public static void print(String arr[])
	{
		sort(arr);// 排序
		for (int i = 0; i < arr.length; i++)
		{
			
			System.out.print(arr[i] + " ");
		}
		System.out.println();
	}
}

class Person
{
	private String pais[];// 牌
	private String name;// 名字
	private int num = 0;// 每个人牌的数量,抽一张牌加1
	private int bomCount = 0;// 炸弹的数量,统计与底牌结合的属性
	private int bomNumber = 0;// 炸弹的值,只是记录最大的炸弹

	public Person(int size, String name)
	{
		
		this.name = name;
		pais = new String[size];
	}
	
	// 得到一张牌
	public void getPai(String pai)
	{
		this.pais[num++] = pai;
	}
	
	// 得到每种牌的数量,用于统计每个人牌的情况
	public int[] getEveryPaiNum()
	{
		int nums[] = new int[14];
		char pm = '\u0000';
		for (int i = 0; i < this.pais.length; i++)
		{
			pm = pais[i].charAt(1);
			switch (pm)
			{
			case '王':
				nums[0]++;break;
			case 'A':
				nums[1]++;break;
			case 'J':
				nums[11]++;break;
			case 'Q':
				nums[12]++;break;
			case 'K':
				nums[13]++;break;
			case '1':
				nums[10]++;break;
			default :
				nums[pm - '0']++;
			}
		}
		return nums;
	}

	/*
	* 判断是否满足叫地主的条件
	* 
	* return 0(不满足叫地主的条件)1(有王叫地主) 2(有两个以上的2)3(有炸弹叫地主)
	*/
	public int isCall()
	{
		int nums[] = this.getEveryPaiNum();
		int res = 0;

		for (int i = 0; i < nums.length; i++)
		{
			switch (i)
			{
			case 0:
				if (nums[i] > 0)
				{
					res = 1;
				}break;
			case 2:
				if (nums[i] > 2)
				{
					res = 2;
				}
			default :
				if (nums[i] == 4)
				{
					res = 3;
				}
			}
		}

		return res;
	}

	// 检查底牌与自己牌的结合情况
	public void checkDiPais(String diPais[])
	{
		// 得到原来牌的情况
		int nums[] = this.getEveryPaiNum();
		// 如果原来的牌有炸弹则清零
		for (int i = 0; i < nums.length; i++)
		{
			// 王炸清零
			if (i == 0)
			{
				if (nums[i] == 2)
				{
					nums[i] = 0;
				}
			}
			// 其他的炸弹
			else
			{
				if (nums[i] == 4)
				{
					nums[i] = 0;
				}
			}
		}
		// 结合底牌的统计
		char pm = '\u0000';
		for (int i = 0; i < diPais.length; i++)
		{
			pm = diPais[i].charAt(1);
			switch (pm)
			{
			case '王':
				nums[0]++;break;
			case 'A':
				nums[1]++;break;
			case 'J':
				nums[11]++;break;
			case 'Q':
				nums[12]++;break;
			case 'K':
				nums[13]++;break;
			case '1':
				nums[10]++;break;
			default :
				nums[pm - '0']++;
			}
		}
		
		// 1.先看3-10 , J Q K的情况
		for (int i = 3; i < 14; i++)
		{
			if (nums[i] == 4)
			{
				this.bomCount++;
				this.bomNumber = i;
			}
		}
		// 2.倒序统计 A 2 王 的情况
		if (nums[0] == 2)
		{
			this.bomCount++;
			this.bomNumber = 16;// 王炸
		} else if (nums[2] == 4)
		{
			this.bomCount++;
			this.bomNumber = 15;// 2炸
		} else if (nums[1] == 4)
		{
			this.bomCount++;
			this.bomNumber = 14;// A炸
		}
	}

	public String[] getPais()
	{
		return this.pais;
	}
	public int getNum()
	{
		return this.num;
	}
	public String getName()
	{
		return this.name;
	}
	public int getBomCount()
	{
		return this.bomCount;
	}
	public int getBomNumber()
	{
		return this.bomNumber;
	}
}

class Pai
{
	private String[] pais;
	private int num;

	public Pai()
	{
		this.num = 54;
		this.pais = new String[num];
		// 初始化牌
		initPais();
	}
	/* 
	* 初始化一副牌的方法
	* 
	* 一张牌是一个字符串:由花色和牌面组成(如:方A)
	*/
	public void initPais()
	{
		String huase[] = {"方", "草", "红", "黑"};
		// 生成四种花色的牌,每种花色分别为13张
		for (int i = 0; i < 52; i++)
		{
			int indexH = i/13;// 花色的下标
			int pm = i%13;// 牌面的值
			String pai = huase[indexH];
			switch (pm)
			{
			case 0:
				pai += "A";break;
			case 10:
				pai += "J";break;
			case 11:
				pai += "Q";break;
			case 12:
				pai += "K";break;
			default :
				pai += (pm + 1);break;
			}
			this.pais[i] = pai;
		}
		this.pais[52] = "小王";
		this.pais[53] = "大王";
	}
	
	/*
	* 随机抽取一张牌
	*/
	public String getPai()
	{
		// 随机产生一个牌的下标
		int index = (int)floor(random() * this.num);
		String pai = this.pais[index];
		// 把index后面的牌一次向前移动
		for (int i = index; i < this.num - 1; i++)
		{
			this.pais[i] = this.pais[i + 1];
			
		}
		// 将牌的数量减减
		this.num--;
		return pai;
	}
	public String[] getPais()
	{
		return this.pais;
	}
	public int getNum()
	{
		return this.num;
	}
}

© 著作权归作者所有

共有 人打赏支持
火蚁

火蚁

粉丝 484
博文 17
码字总数 6492
作品 1
高级程序员
Java编程基础知识点和技术点归纳

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰 ⋅ 05/23 ⋅ 0

【Java】疯狂Java基础(一)——面向对象的特征:继承、封装和多态

一、前言 小编记得,刚接触计算机相关的课程的时候,接触的是c++,c++的老师一上来就说c++是面向对象的,c语言是面向过程的。面向对象比面向过程厉害,是从面向过程发展过来的的。 当时有一个...

kisscatforever ⋅ 03/28 ⋅ 0

有一到五年开发经验的JAVA程序员需要掌握的知识与技能!

JAVA是一种平台,也是一种程序设计语言,如何学好程序设计不仅仅适用于JAVA,对C++等其他程序设计语言也一样管用。有编程高手认为,JAVA也好C也好没什么分别,拿来就用。为什么他们能达到如此...

java高级架构牛人 ⋅ 06/02 ⋅ 0

作为一个java程序员这些技能你都知道吗?

一、Java特点 1、 面向对象 尽管受到其前辈的影响,但Java没被设计成兼容其他语言源代码的程序。这允许Java开发组自由地从零开始。这样做的一个结果是,Java语言可以更直接、更易用、更实际的...

java高级架构牛人 ⋅ 05/23 ⋅ 0

Java就业变难了?你需要对自己有点信心

伴随着IT的火热,越来越多的人进入了IT领域,这在进一步推动着IT发展的同时也极大增加了就业压力。伴随着激烈的岗位竞争,越来越多的人开始感叹工作难找,越火的行业越是如此,Java自是首当其...

糖宝_d864 ⋅ 06/08 ⋅ 0

【JVM】 java内存区域与内存溢出异常

前言 此系列博客是读《深入理解java虚拟机》所做的笔记整理。 No1. JVM内存管理这堵墙? 对C和C++的开发人员来说,在内存管理领域,他们既拥有每一个对象的“所有权”,也担负着每一个对象生...

binggetong ⋅ 05/07 ⋅ 0

Java程序员必读书单,家族又添新成员

点击关注异步图书,置顶公众号 每天与你分享IT好书 技术干货 职场知识 参与文末话题讨论,每日赠送异步图书。 ——异步小编 有些革命出其不意地吸引了全世界的眼球。Twitter、Linux操作系统和...

异步社区 ⋅ 05/09 ⋅ 0

Python 爬取 11 万 Java 程序员信息竟有这些重大发现!

一提到程序猿,我们的脑子里就会出现这样的画面: 或者这样的画面: 心头萦绕的字眼是:秃头、猝死、眼镜、黑白 T 恤、钢铁直男…… 而真实的程序猿们,是每天要和无数数据,以及数十种编程语...

p柯西 ⋅ 06/19 ⋅ 0

叮!您收到一份超值Java基础入门资料!

摘要:Java语言有什么特点?如何最大效率的学习?深浅拷贝到底有何区别?阿里巴巴高级开发工程师为大家带来Java系统解读,带你掌握Java技术要领,突破重点难点,入门面向对象编程,以详细示例...

聒小小噪 ⋅ 05/12 ⋅ 0

Java开发每日复盘2018_0514

今天主要跟大家分享3个部分: 一、「Java的核心机制」 二、「Java命名规范」 三、「Java数据类型相关」 下面我们来一个一个的说: 「Java核心机制」 Java是一种强制面向对象的解释型语言(O...

ZeroOSTalk ⋅ 05/14 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

一篇文章学懂Shell脚本

Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合。 Shell可以直接使用在win/Unix/Linux上面,并且可以调用...

Jake_xun ⋅ 26分钟前 ⋅ 0

大数据工程师需要精通算法吗,要达到一个什么程度呢?

机器学习是人工智能的一个重要分支,而机器学习下最重要的就是算法,本文讲述归纳了入门级的几个机器学习算法,加大数据学习群:716581014一起加入AI技术大本营。 1、监督学习算法 这个算法由...

董黎明 ⋅ 59分钟前 ⋅ 0

Kylin 对维度表的的要求

1.要具有数据一致性,主键值必须是唯一的;Kylin 会进行检查,如果有两行的主键值相同则会报错。 2.维度表越小越好,因为 Kylin 会将维度表加载到内存中供查询;过大的表不适合作为维度表,默...

无精疯 ⋅ 今天 ⋅ 0

58到家数据库30条军规解读

军规适用场景:并发量大、数据量大的互联网业务 军规:介绍内容 解读:讲解原因,解读比军规更重要 一、基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务、行级锁、并发性能更好、CPU及...

kim_o ⋅ 今天 ⋅ 0

代码注释中顺序更改 文件读写换行

`package ssh; import com.xxx.common.log.LogFactory; import com.xxx.common.log.LoggerUtil; import org.apache.commons.lang3.StringUtils; import java.io.*; public class DirErgodic ......

林伟琨 ⋅ 今天 ⋅ 0

linux实用操作命令

参考 http://blog.csdn.net/qwe6112071/article/details/50806734 ls [选项] [目录名 | 列出相关目录下的所有目录和文件 -a 列出包括.a开头的隐藏文件的所有文件-A 同-a,但不列出"."和"...

简心 ⋅ 今天 ⋅ 0

preg_match处理中文符号 url编码方法

之前想过直接用符号来替换,但失败了,或者用其他方式,但有有些复杂,这个是一个新的思路,亲测可用 <?php$str='637朗逸·超速新风王(300)(白光)'; $str=iconv("UTF-8","GBK",$s...

大灰狼wow ⋅ 今天 ⋅ 0

DevOps 资讯 | PostgreSQL 的时代到来了吗 ?

PostgreSQL是对象-关系型数据库,BSD 许可证。拼读为"post-gress-Q-L"。 作者: Tony Baer 原文: Has the time finally come for PostgreSQL?(有删节) 近30年来 PostgreSQL 无疑是您从未听...

RiboseYim ⋅ 今天 ⋅ 0

github太慢

1:用浏览器访问 IPAddress.com or http://tool.chinaz.com 使用 IP Lookup 工具获得github.com和github.global.ssl.fastly.net域名的ip地址 2:/etc/hosts文件中添加如下格式(IP最好自己查一...

whoisliang ⋅ 今天 ⋅ 0

非阻塞同步之 CAS

为解决线程安全问题,互斥同步相当于以时间换空间。多线程情况下,只有一个线程可以访问同步代码。这种同步也叫阻塞同步(Blocking Synchronization). 这种同步属于一种悲观并发策略。认为只...

长安一梦 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部