⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pkgame.java

📁 本类程序是模拟两个人玩三张牌的游戏(还包含简单的洗牌过程)。
💻 JAVA
字号:
import java.util.Random;
import javax.swing.JOptionPane;
/*
 * Pcard类作为一个数组成员,用以存储扑克牌的花色及点数
 */
class Pcard{
	private int color;
	private int num;
	
	public Pcard(int color, int num){
		this.color = color;
		this.num = num;
	}
	public int ReadColor(){
		return this.color;
	}
	public int ReadNum(){
		return this.num;
	}
}
/**
 * 
 * @author Cheney
 * @Introduction
 *     此程序为模拟扑克牌游戏!先由计算机自动洗牌,再发按规则发牌。具体游戏规则如下:
 *       1.有两个人玩,分别为A和B;
 *       2.一副扑克牌有52张牌,4种花色(方块、梅花、红桃和黑桃),每种花色的牌的点数按升序排列
 *          有2,3,4,...,10,J,K,A等13种;
 *        3.给每个人发3张牌,牌面向上(即,亮牌),赢者立即可以确定;
 *        4.最高等级的一手牌称为同花顺,即3张牌均为同一种花色,最大的同花牌是同一种花色的Q、K、A;
 *        5.第二等级的牌称为顺子,即点数相同的3张牌,最大的顺子是花色不同的Q、K、A;
 *        6.第三等级的牌是同点,即点数相同的3张牌,最大的同点是A、A、A;
 *        7.第四等级的牌是对子,即3张牌中有两张牌点数相同,最大的对子是A、A、K;
 *        8.第五等级的牌是杂牌,即除去上列四等之外的任何一手牌,最大的杂牌是不同花色的A、K、J;
 *        9.若两人的牌类型不同,则等级高者胜;若等级相同,则点数高者胜;若点数也相同,则为平局。
 *       
 */
public class PKGame {	
	public static void main(String[] argv){
		final int N = 13;	//扑克的数量
		final int COLOR = 4;	//扑克花色
		final int N1 = 3; //发牌数量
//		final int N2 = 2; //玩家数
		final int NUM = 10000;	//插牌次数
		
		Pcard[] pcard = new Pcard[N * COLOR];
		Pcard[] temp = new Pcard[N * COLOR];
		
		XiPai(pcard,temp,N * COLOR,COLOR,N,NUM);
		BeginPlay(pcard,N1);
	}	
	/*
	 * XiPai():为洗牌方法,先初始化牌的序列。利用产生一个随机数作为分界的方法,分得牌少的一组插入多的一组中,
	 *    两堆牌间隔着插入,重复此操作多次,可将有序的数打乱,成为随机数串
	 * pcard[]作为存储洗牌结果,temp[]作为临时交换的存储结果
	 * n为牌的数量,c为牌的花色,n1为一种花色牌的数量,num为洗牌的次数
	 */
	public static Pcard[] XiPai(Pcard pcard[],Pcard temp[],int n,int c,int n1,int num) {
		for(int i = 0, j = 0; i < c; i++)
			for(int h = 0; h < n1; h++)
				pcard[j++] = new Pcard(i, h);	//i:0~3表示花色;h:0~12表示2~A
		Random rd = new Random();	//Random()为随机函数
		int j,m;
		for(int i = 0; i < num; i++){
			int k = rd.nextInt(n) + 1; //产生1到N的随机数,将数字串分为两组
			
			if(k <= n/2){ //产生的随机数比N的一半小,则用前一组往后一组插
				for(m = 0, j = 0; j < k; j++){
					temp[m++] = pcard[j + k];
					temp[m++] = pcard[j];
				}
				for( ; j + k < n; j++){
					temp[m++] = pcard[j + k];
				}
			}
			else {	//否则,后一组插入前一组
				for(m = 0, j = 0;j + k < n; j++){
					temp[m++] = pcard[j];
					temp[m++] = pcard[j + k];
				}
				for(; j < k; j++){
					temp[m++] = pcard[j];
				}
			}
			
			for(m = j = 0; j < n; j++)	//将临时数组里的数字移入主数组中
				pcard[j] = temp[m++];
		}
		return pcard;
	}
	/*
	 * BeginPlay():发牌并判断输赢
	 * pcard[]为洗好的牌,n1为发牌数量
	 */
	public static void BeginPlay(Pcard pcard[],int n1){
		Pcard[] pcard1 = new Pcard[n1];	//存储发给A的牌
		Pcard[] pcard2 = new Pcard[n1];	//存储发给B的牌
		Random rd = new Random();	//Random()为随机函数
		int j = rd.nextInt(46) + 1; //产生1到46的随机数,从j开始发牌;46为52-6,确保不发生边界错误
		for(int i = 0; i < n1; i++){	//给A、B发牌
			pcard1[i] = pcard[j++];
			pcard2[i] = pcard[j++];
		}
		pcard1 = SortCard(pcard1,n1);
		pcard2 = SortCard(pcard2,n1);
		
	//	char pcardcolor[] = {'\3','\4','\5','\6'};
	//	char pcardnum[] = {'2','3','4','5','6','7','8','9','0','J','Q','K','A'};
		int grade1 = GradeJudge(pcard1);
		int grade2 = GradeJudge(pcard2);
		
		String result = "PlayerA的牌:  ";
		result += Change(pcard1,n1);
		result += "\nPlayerB的牌:  ";
		result += Change(pcard2,n1);
		result += "\n结果是:\n    ";
		
		if(grade1 < grade2){
			result += "PlayerA   Win!\n";
			result += GradeOut(grade1);
		}
		else if(grade1 > grade2){
			result += "PlayerB   Win!\n";
			result += GradeOut(grade2);
		}
		else{
			switch(grade1){
			case 1:	//属于同花,按照从大到小的牌进行比较。
				if(pcard1[2].ReadNum() > pcard2[2].ReadNum())
					result += "PlayerA   Win!\n";
				else if(pcard1[2].ReadNum() < pcard2[2].ReadNum())
					result += "PlayerB   Win!\n";
				else if(pcard1[1].ReadNum() > pcard2[1].ReadNum())
					result += "PlayerA   Win!\n";
				else if(pcard1[1].ReadNum() < pcard2[1].ReadNum())
					result += "PlayerB   Win!\n";
				else if(pcard1[0].ReadNum() > pcard2[0].ReadNum())
					result += "PlayerA   Win!\n";
				else if(pcard1[0].ReadNum() < pcard2[0].ReadNum())
					result += "PlayerB   Win!\n";
				else
					result += "平局!!\n";
				result += GradeOut(grade1);
				break;
			case 2:case 3:	//是顺子或三张同点牌,只需比较点数最大的牌
				if(pcard1[2].ReadNum() > pcard2[2].ReadNum())
					result += "PlayerA   Win!\n";
				else if(pcard1[2].ReadNum() < pcard2[2].ReadNum())
					result += "PlayerB   Win!\n";
				else
					result += "平局!\n";
				result += GradeOut(grade1);
				break;
			case 4:	//是对子,首先判断对子点数的大小,再进行比较。
				if(pcard1[0].ReadNum() == pcard1[1].ReadNum())	//PlayerA的点数小的是对子
					if(pcard2[0].ReadNum() == pcard2[1].ReadNum())	//PlayerB的点数小的是对子
						if(pcard1[0].ReadNum() > pcard2[0].ReadNum())	//比较对子点数的大小
							result += "PlayerA   Win!\n";
						else if(pcard1[0].ReadNum() < pcard2[0].ReadNum())
							result += "PlayerB   Win!\n";
						else if(pcard1[2].ReadNum() > pcard2[2].ReadNum())	//对子点数相同,比较最大的那张
							result += "PlayerA   Win!\n";
						else if(pcard1[2].ReadNum() < pcard2[2].ReadNum())
							result += "PlayerB   Win!\n";
						else
							result += "平局!\n";
					else if(pcard1[0].ReadNum() > pcard2[1].ReadNum())	//PlayerB点数大的是对子
						result += "PlayerA   Win!\n";
					else if(pcard1[0].ReadNum() < pcard2[1].ReadNum())
						result += "PlayerB   Win!\n";
					else 
						result += "PlayerA   Win!\n";
				else if(pcard2[0].ReadNum() == pcard2[1].ReadNum())	//PlayerA点数大的为对子,PlayerB点数小的为对子
					if(pcard1[1].ReadNum() > pcard2[0].ReadNum())
						result += "PlayerA   Win!\n";
					else if(pcard1[1].ReadNum() < pcard2[0].ReadNum())
						result += "PlayerB   Win!\n";
					else
						result += "PlayerB   Win!\n";
				else if(pcard1[1].ReadNum() > pcard2[1].ReadNum())//PlayerA、PlayerB点数大的是对子
					result += "PlayerA   Win!\n";
				else if(pcard1[1].ReadNum() < pcard2[1].ReadNum())
					result += "PlayerB   Win!\n";
				else if(pcard1[0].ReadNum() > pcard2[0].ReadNum())//对子点数相等,比较点数小的一张
					result += "PlayerA   Win!\n";
				else if(pcard1[0].ReadNum() < pcard2[0].ReadNum())
					result += "PlayerB   Win!\n";
				else
					result += "平局!\n";
				result += GradeOut(grade1);
				break;
			case 5:	//杂牌,比较的时候按从大牌到小牌的顺序比较
				if(pcard1[2].ReadNum() > pcard2[2].ReadNum())
					result += "PlayerA   Win!\n";
				else if(pcard1[2].ReadNum() < pcard2[2].ReadNum())
					result += "PlayerB   Win!\n";
				else if(pcard1[1].ReadNum() > pcard2[1].ReadNum())
					result += "PlayerA   Win!\n";
				else if(pcard1[1].ReadNum() < pcard2[1].ReadNum())
					result += "PlayerB   Win!\n";
				else if(pcard1[0].ReadNum() > pcard2[0].ReadNum())
					result += "PlayerA   Win!\n";
				else if(pcard1[0].ReadNum() < pcard2[0].ReadNum())
					result += "PlayerB   Win!\n";
				else
					result += "平局!\n";
				result += GradeOut(grade1);
				break;
			}
		}
			JOptionPane.showMessageDialog(null,result,"Game Result",JOptionPane.INFORMATION_MESSAGE);
	}
	/*
	 * SortCard:将pcard[]以点数从小到大排序,以便在后续操作中进行比较
	 */
	public static Pcard[] SortCard(Pcard pcard[],int n){
		Pcard tp;
		for(int i = 0; i < n - 1; i++)
			for(int j = i + 1; j < n; j++)
			if(pcard[i].ReadNum() > pcard[j].ReadNum()){
				tp = pcard[i];
				pcard[i] = pcard[j];
				pcard[j] = tp;
			}
		return pcard;
	}
	/*
	 * GradeJudge():判断手中牌的等级,1为最高,5为是低
	 * pram:pcard[]为玩家手中的牌
	 */
	public static int GradeJudge(Pcard pcard[]){
		int p;
		if(pcard[0].ReadColor() == pcard[1].ReadColor() && pcard[0].ReadColor() == pcard[2].ReadColor())
			p = 1;	//同花
		else if(pcard[2].ReadNum() - pcard[1].ReadNum() == 1 && pcard[1].ReadNum() - pcard[0].ReadNum() == 1)
			p = 2;	//顺子
		else if(pcard[0].ReadNum() == pcard[1].ReadNum() && pcard[1].ReadNum() == pcard[2].ReadNum())
			p = 3;	//三张同点
		else if(pcard[0].ReadNum() == pcard[1].ReadNum() || pcard[1].ReadNum() == pcard[2].ReadNum())
			p = 4;	//对子
		else	//杂牌
			p = 5;
		return p;
	}
	/*
	 * Change():将pcard[]中的数字转换为实际的牌,存入字符串
	 * n1为需要转换的牌数
	 */
	public static String Change(Pcard[] pcard, int n1){
		String str = "";
		for(int i = 0; i < n1; i++){
			switch(pcard[i].ReadColor()){
			case 0: str += "红桃"; break;
			case 1: str += "方块"; break;
			case 2: str += "黑桃"; break;
			case 3: str += "梅花"; break;
			}
			switch(pcard[i].ReadNum()){
			case 8: str += "10  "; break;
			case 9: str += "J    "; break;
			case 10: str += "Q    "; break;
			case 11: str += "K    "; break;
			case 12: str += "A    "; break;
			default: str += pcard[i].ReadNum() + 2 + "    ";
			}
		}
		return str;
	}
	/*
	 * GradeOut():判断赢牌类型,并添加到输出字串
	 * grade为玩家牌的等级类型
	 * 返回类型为String
	 */
	public static String GradeOut(int grade){
		String str = null;
		switch(grade){
		case 1: str = "      (同花)\n"; break;
		case 2: str = "      (顺子)\n"; break;
		case 3: str = "      (同点)\n"; break;
		case 4: str = "      (对子)\n"; break;
		case 5: str = "      (杂牌)\n";
		}
		return str;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -