文档章节

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

火蚁
 火蚁
发布于 2013/10/13 23:00
字数 1387
阅读 430
收藏 13

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

要求如下:

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;
	}
}

© 著作权归作者所有

共有 人打赏支持
火蚁

火蚁

粉丝 483
博文 19
码字总数 6492
作品 1
高级程序员
初试刀 浅谈Java和C#在面向对象上语法的区别

 做了几年了开发一直没有总结什么,回到了家乡的小城做了一名培训班的教员,教授软件开发的知识。细小的知识从头细细嚼来,别有一番滋味。或是以前遗漏的太多,或是确实没有系统的学习过,教...

夜默
2013/06/18
0
0
新手怎么学习java?学Java要学哪些内容?

学习任何一门技术之前,兴趣最重要。在学校的时候一直觉得自己在学计算机编程语言,学习了很多,但每门语言都停留在知识边缘地带,都没深入到它们的精华部分。我经朋友介绍有免费的学习Java课...

糖宝_d864
07/02
0
0
Java编程基础知识点和技术点归纳

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

Java小辰
05/23
0
0
1-Java面向对象-面向对象

通过前面的学习我们对于java的语法结构有了一定的认识,掌握了分支结构,循环结构等常用的程序逻辑,也能运用这些知识解决一些简单问题。 以前我们面向过程,现在我们面向对象。这是从盖小房...

天涯明月笙
08/02
0
0
【Java】疯狂Java基础(一)——面向对象的特征:继承、封装和多态

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

kisscatforever
03/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

angular指令监听ng-repeat渲染完成后执行自定义事件方法

今天工作中遇到需要用到ng-repeat遍历渲染完后执行某个操作,angular本身并没有提供监听ng-repeat渲染完成的指令,所以需要自己创建自定义指令。 在ng-repeat模板实例内部会暴露出一些特殊属...

孟飞阳
33分钟前
1
0
URLEncoder和URLDecoder

public static void main(String[] args) { String str1 = "https://test1-life.pingan.com/ilifecore/productMall/loading.html?productId=8000000241&channelCode=XCX00001&productCode=00......

鬼才王
42分钟前
2
0
对象及变量的并发访问-第一篇

方法内部的变量为线程安全变量 “非线程安全”问题存在于“共享变量”中,如果是方法内部的私有变量,则不存在“非线程安全”问题,所得结果也就是“线程安全”的。 package chaprer3;/**...

简心
43分钟前
1
0
程序媛眼中的程序猿原来是这样子的!

一直都想写一篇关于描述程序员的文章,但是一直没能开头,一来因为文笔不好,更主要的原因是貌似对程序员既熟悉又不熟悉,很怕写出来的是以偏概全,给大家造成对程序员的既定印象,不过,管他...

Java小铺
今天
1
0
bean标签

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 bean标签 bean标签中的init-method属性,该属性...

凯哥学堂
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部