梭哈游戏

梭哈游戏

电信大二,刚开始学Java两星期,然后写了梭哈游戏,里面向大佬借鉴了不少,还有不少错误,望指正

package my;
import java.util.*;

public class SuoHa
{
/****************************************************************************/
	private String[] Size = { "", "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A" };// 表示牌的大小(A在顺子里最小(ace!),在单张里最大)
	private String[] Color = { "", "方块", "草花", "红桃", "黑桃" };// 表示牌的花色
	private static int money_in;                                   // 记录前面轮中下注的最大筹码
	private static int win;                                        // 获胜玩家
	private static int time;                                       // 目前进行到第几轮
	private static int[] used = new int[1000];                     // 用于标记用过的牌

	public int[] all_money = new int[10];                           // 记录玩家剩余筹码
	public int[] drop_money = new int[10]; 						   // 记录玩家下注的筹码
	public int[] flag = new int[10]; 							   // 记录玩家是否放弃
	public int[] card[] = new int[10][10];						   // 记录玩家手上的牌
/****************************************************************************/	
public SuoHa()               //构造函数
	{
		for (int i = 1; i <= 5; i++)
		{
			all_money[i] = 10000;
			drop_money[i] = 0;
		}
	}

	// 初始化全局变量
	public static void Chushihua()
	{
		time = 1;
		used[0] = 1;
		win = 0;
		money_in = 0;
	}

//-------------------------初始化结束---------------------------//
	
/***************************************************************************Fapai*/	
	// 发牌
	public void Fapai(int num, int i)
	{
		if (flag[num] == 1) // 如果已经放弃,则不发牌
		return;
		Random rand = new Random();
		int t1 = 0, t2 = 0, t = 0;
		while (used[t] == 1)
		{
			t1 = rand.nextInt(12) + 1;//大小
			t2 = rand.nextInt(3) + 1;//花色
			t = color_comb(t1, t2);
			if (used[t] == 0)        //判断这张牌有没有用过
			{
				used[t] = 1;
				card[num][i] = t;    //i表示第几张牌
				return;             //结束发牌
			}
		}
	}		
/***************************************************************************choice*/
	// 下注
	public int choice(int num)
	{
		Scanner sc = new Scanner(System.in);
//----------------------------------------------------特殊情况---------------------------------------------------//	
		if (all_money[num] - drop_money[num] < money_in)   //筹码不够直接判输
		{
			System.out.println(num + "号玩家您手上的筹码不足!自动判输");
			all_money[num] -= drop_money[num];
			flag[num] = 1;
			return 0;
		}
		System.out.println(num + "号玩家请输入数字进行选择: ");
		if(time!=5)
		System.out.println("1.下注     2.放弃");
		else
		System.out.println("2.放弃    3.梭哈");
		int t;
		t = sc.nextInt();
		if (time != 5)                             //第五轮强制开始梭哈
		{
			while (t > 2 || t < 0)
			{
				System.out.println("输入有误!请重新输入: ");
				t = sc.nextInt();
			}
		} 
		else
		{
			while (t > 3 || t < 2)
			{
				System.out.println("输入有误!请重新输入: ");
				t = sc.nextInt();
			}
		}
//----------------------------------------------------特殊情况---------------------------------------------------//		
		if (t == 1)
		{   
			int kk=all_money[num] - drop_money[num];
			System.out.println(num + "号玩家请选择下注的筹码(现有筹码" + money_in + "~" + kk + "): ");
			
			int chouma;
			chouma = sc.nextInt();
			while (chouma < money_in || chouma > kk)
			{
				System.out.println("输入错误!请重新输入:");
				chouma = sc.nextInt();
			}
			if (money_in < chouma)
			{
				money_in = chouma;
			}
			drop_money[num] += chouma;
			return 0;
		}
		if (t == 2)     //玩家放弃
		{
			all_money[num] -= drop_money[num];
			flag[num] = 2;
			return 0;
		}
		if (t == 3)     //玩家梭哈
		{
			drop_money[num] = all_money[num];
			return 1; // 有玩家梭哈时,返回1
		}
		sc.close();
		return 0;
	}
/******************************************************************************sort*/
	// 排序,从大到小
	public void sort(int[] a)
	{
		for (int i = 1; i <= 5; i++)
			for (int j = i + 1; j <= 5; j++)
			{
				if (a[i] < a[j])
				{
					int t = a[i];
					a[i] = a[j];
					a[j] = t;
				}
			}
	}
/***************************************************************************print*/	
	// 打印玩家的牌,j=2为最初状态
	public void print(int num, int j)
	{
		if (j == 2)
			System.out.print(num + "号玩家目前桌面上的牌为: ");
		else
			System.out.print(num + "号玩家手中的牌为: ");
		for (int i = j-1; i <= time; i++)
		{
			System.out.print(Color[Huase(card[num][i])]);
			System.out.print(Size[Daxiao(card[num][i], 0)] + " ");
		}
		System.out.println();
	}
/******************************************************************************Getnum*/
	// 得到需要处理玩家的编号,返回玩家手中牌对应的编号
    public int Getnum(int i)
	{
		//预处理
		boolean is_tonghua = false;  // 同花顺
		boolean is_shunzi = false;	 // 顺子
		int is_four = 0; 			 // 四条
		int is_three = 0;        	 // 三对
		int is_two = 0; 			 // 两对
		int[] t1 = new int[10]; 	 // 记录玩家牌的大小
		int[] t2 = new int[10]; 	 // 记录玩家牌的花色
		int j;
		for (j = 1; j <= 5; j++)
		{
			t1[j] = Daxiao(card[i][j], 1);
			t2[j] = Huase(card[i][j]);
		}
//-----------------------------花色判断--------------------------------//
		for (j = 2; j <= 5; j++)
		{
			if (t2[j] != t2[j - 1])
				break;
		}
		if (j > 5)
		{
			is_tonghua = true;
		}

//-----------------------------顺子判断--------------------------------//		
		sort(t1);
		for (j = 2; j <= 5; j++)
		{
			if (t1[j] != t1[j - 1] - 1)
				break;
		}
		if (j > 5)
		{
			is_shunzi = true;
		}
//-----------------------------两对三对--------------------------------//
		for (j = 1; j <= 5;)
		{
			if (j + 3 <= 5 && t1[j] == t1[j + 1] && t1[j] == t1[j + 2] && t1[j] == t1[j + 3])
			{
				is_four++;
				break;
			}
			if (j + 2 <= 5 && t1[j] == t1[j + 1] && t1[j] == t1[j + 2])
			{
				is_three++;
				j += 3;
			} else if (j + 1 <= 5 && t1[j] == t1[j + 1])
			{
				is_two++;
				j += 2;
			}
			j++;
		}
//-----------------------------总结判断--------------------------------//
		if (is_tonghua && is_shunzi) // 同花顺
			return 9;
		if (is_four == 1)//四条
			return 8;
		if (is_three == 1 && is_two == 1) // 满堂红(飞机)
			return 7;
		if (is_tonghua) // 同花
			return 6;
		if (is_shunzi) // 顺子
			return 5;
		if (is_three == 1)// 三条
			return 4;
		if (is_two == 2) // 对子
			return 3;
		if (is_two == 1) // 一对
			return 2;
		else
		return 1; // 散牌
	}
/******************************************************************************color_comb*/
	// 花色,大小组合成百位或十位,花色*100或10+大小
	public int color_comb(int t1, int t2)
	{
		if (t1 >= 10)
			return t2 * 100 + t1;
		else
			return t2 * 10 + t1;
	} 
/******************************************************************************huase*/
  	// 返回一张牌的花色  	
    public int Huase(int x)  
  	{
  		if (x > 100)       //大小是10~14
  			return x / 100;
  		else
  			return x / 10; //大小是1~9
  	}
/******************************************************************************Daxiao*/ 	
  	// 返回一张牌的大小
  	public int Daxiao(int x, int paixu)
  	{
  		if (x > 100)
  			x = x % 100;
  		else
  			x = x % 10;
  		if (paixu == 0 && x == 1)  //散牌最大
  			return 14;
  		if (paixu == 1 && x == 1)  //顺子最小
  			return 1;
  		return x;
  	}
/******************************************************************************judge*/
  	// 得到牌最大的玩家
 	public int judge()
 	{
 			int[] num = new int[10]; // 每个玩家手上牌对应的编号,初始为-1
 			for (int i = 1; i <= 5; i++)
 				num[i] = -1;
 			for (int i = 1; i <= 5; i++)
 			{
 				if (flag[i] == 0)
 				{
 					num[i] = Getnum(i);        //得到5张牌的类别
 				}
 			}

 			int temp1 = 0, temp2 = -1;        // tmp1记录牌最大的玩家编号,tmp2记录当前最大的序号
 			for (int i = 1; i <= 5; i++)
 			{
 				if (num[i] > temp2)
 				{
 					temp2 = num[i];
 					temp1 = i;
 				} 
 				else if (num[i] == temp2)
 				{
 					temp1 = compare(temp1, i, temp2);  //调用同类型的比较函数
 				}
 			}
 			return temp1;
 	}
 /******************************************************************************print_final*/
 	// 游戏结束后将玩家的牌从大到小输出
 	public void print_final(int num)
 	{
 		int[] pai = new int[20]; // pai记录牌的大小
 		for (int i = 0; i < 20; i++)
 		{
 			pai[i] = 0;
 		}
 		for (int i = 1; i <= 5; i++)
 		{
 			int t = Daxiao(card[num][i], 0);
 			pai[t]++;
 		}
 		System.out.print(num + "号玩家手中的牌为: ");
 		for (int d = 4; d >= 1; d--)
 		{
 			for (int i = 14; i >= 1; i--)
 			{
 				if (pai[i] == d)
 				{
 					for (int j = 1; j <= 5; j++)
 					{
 						if (Daxiao(card[num][j], 0) == i)
 						{
 							System.out.print(Color[Huase(card[num][j])] + Size[i] + " ");
 						}
 					}
 				}
 			}
 		}
 		System.out.println("");
 	}
/******************************************************************************compare*/
	// 得到两个玩家的牌,返回其中牌大的玩家
	public int compare(int x1, int x2, int num)
	{
		int[] t1 = new int[20]; // 记录玩家1牌的大小
		int[] t2 = new int[10]; // 记录玩家1牌的花色
		int[] t3 = new int[20]; // 记录玩家2牌的大小
		int[] t4 = new int[10]; // 记录玩家2牌的花色
		for (int j = 1; j <= 5; j++)
		{
			t1[j] = Daxiao(card[x1][j], 1);
			t3[j] = Daxiao(card[x2][j], 1);
			t2[j] = Huase(card[x1][j]);
			t4[j] = Huase(card[x2][j]);
		}
		if (num == 9 || num == 5)                     //顺子
		{
			int tt1 = 0, tt2 = 0;   // 记录最大牌的花色
			int j1 = 0, j2 = 0;
			for (int i = 1; i <= 5; i++)
			{
				if (t1[i] > j1)   
				{
					j1 = t1[i];    //第一个玩家的最大牌
					tt1 = t2[i];   //第一个玩家的最大牌的花色
				}
				if (t3[i] > j2)    
				{
					j2 = t3[i];		//第一个玩家的最大牌
					tt2 = t4[i];	//第一个玩家的最大牌的花色
				}
			}
			sort(t1);
			sort(t3);
			if (t1[1] > t3[1]) // 比较最大的牌
				return x1;
			else if (t1[1] < t3[1])
				return x2;
			else              // 顺子大小相同,比较花色
			{ 
				if (tt1 > tt2)
					return x1;
				else
					return x2;
			}
		} 
		else
		{
			for (int j = 1; j <= 5; j++)
			{ 
				t1[j] = Daxiao(card[x1][j], 0);
				t3[j] = Daxiao(card[x2][j], 0);
			}
			int tt1 = 0, tt2 = 0;// 记录最大的牌对应的花色
			int j1 = -1, j2 = -1;
			for (int i = 1; i <= 5; i++)
			{
				if (t1[i] > j1)
				{
					j1 = t1[i];
					tt1 = t2[i];
				}
				if (t3[i] > j2)
				{
					j2 = t3[i];
					tt2 = t4[i];
				}
			}
			sort(t1);
			sort(t3);
			/// 以下要按牌的分类进行不同的判断
			if (num == 8 || num == 7 || num == 4)
			{
				if (t1[3] > t2[3])  //3一定是满堂红或者三条里飞机
					return x1;
				else
					return x2;
			}
			if (num == 6)    //同花
			{ // 先比较大小,再比较花色
				int i = 0;
				for (i = 1; i <= 5; i++)
				{
					if (t1[i] > t3[i])
						return x1;
					else if (t1[i] < t3[i])
						return x2;
				}
				if (i > 5)
				{
					if (tt1 > tt2)
						return x1;
					else
						return x2;
				}
			}
			
			int[] used1 = new int[30];                 //两对一对
			int[] used2 = new int[30];
			for (int i = 0; i <= 20; i++)
			{
				used1[i] = 0;
				used2[i] = 0;
			}
			for (int i = 1; i <= 5; i++)
			{
				used1[t1[i]]++;
				used2[t3[i]]++;
			}
			if (num == 3)                                  //两对
			{ 
				int t11 = 0, t12 = 0, t13 = 0; 
				int t21 = 0, t22 = 0, t23 = 0;
				int time1 = 0, time2 = 0;
				for (int d = 14; d >= 1; d--)
				{
					if (used1[d] == 2 && time1 == 0)
					{
						t11 = d;
						time1++;
					}
					if (used1[d] == 2 && time1 == 1)
					{
						t12 = d;
						time1++;
					}
					if (used1[d] == 1)
						t13 = d;
					if (used2[d] == 2 && time2 == 0)
					{
						t21 = d;
						time2++;
					}
					if (used2[d] == 2 && time2 == 1)
					{
						t22 = d;
						time2++;
					}
					if (used2[d] == 1)
						t23 = d;
				}
				if (t11 > t21)
					return x1;
				else if (t11 < t21)
					return x2;
				else if (t12 > t22)
					return x1;
				else if (t21 < t22)
					return x2;
				else if (t13 > t23)
					return x1;
				else if (t13 < t23)
					return x2;
				else if (tt1 > tt2)
					return x1;
				else
					return x2;
			}
			if (num == 2)                 //一对
			{ 
				int pai = 0, xx2 = 0;
				for (int i = 1; i <= 5; i++)
				{
					if (used1[t1[i]] == 2)
					{
						pai = t1[i];
						t1[i] = -1;
					}
					if (used2[t3[i]] == 2)
					{
						xx2 = t3[i];
						t3[i] = -1;
					}
				}
				
				if (pai > xx2)
					return x1;
				else if (pai < xx2)
					return x2;
				sort(t1);
				sort(t3);
				int i = 0;
				for (i = 1; i < 5; i++)
				{
					if (t1[i] > t3[i])
						return x1;
					else if (t1[i] < t3[i])
						return x2;
				}
				if (i >= 5)
				{
					if (tt1 > tt2)
						return x1;
					else
						return x2;
				}
			}
			if (num == 1)                  //散牌
			{ 
				int i = 0;
				for (i = 1; i <= 5; i++)
				{
					if (t1[i] > t3[i])
						return x1;
					else if (t1[i] < t3[i])
						return x2;
				}
				if (i > 5)
				{
					if (tt1 > tt2)
						return x1;
					else
						return x2;
				}
			}
		}
		return 0;
	}
/******************************************************************************check*/
	//检查玩家是否全部放弃
	public void check()

	{
		int time = 0;
		int temp = 0;
		for (int i = 1; i <= 5; i++)
		{
			if (flag[i] == 0)
			{
				time++;
				temp = i;
			}
		}
		if (time == 1)
		{
			win = temp;
		} 
		else if (time == 0)
		{
			win = -1;
		}
	}
	
	
	// 游戏过程
	public void play()
	{
		while (time <= 5)   
		{
			if (time == 1)
			{// 第一轮发牌,每个玩家发2张,第一张作为底牌不显示,其余牌显示出来
				for (int j = 1; j <= 5; j++)
				{
					for (int i1 = 1; i1 <= 2; i1++)
					{
						Fapai(j, i1);
					}
				}
				time++;
				// 第一轮后打印出各玩家应该在桌上显示的牌
				for (int i1 = 1; i1 <= 5; i1++)
				{
					print(i1, 1);
				}
			} 
			else  // 牌最大的玩家做完选择再从顺时针下注和发牌
			{
				int temp=0,hao=0;
				for(int ss=1;ss<=5;ss++)
				{
					if(Daxiao(card[ss][time],0)>=temp&&flag[ss] == 0)
					temp=Daxiao(card[ss][time],0);
				}
				for(int ss=1;ss<=5;ss++)
				{
					if(Daxiao(card[ss][time],0)==temp&&flag[ss] == 0)
					hao=ss;
				}
				choice(hao);
				Fapai(hao, time + 1);
				
				
				for (int i1 = hao+1; i1 <hao+5; i1++)
				{
					if (i1<=5&&flag[i1] == 0)
					{
					choice(i1);
					Fapai(i1, time + 1);
					}
					if(i1>5&&flag[i1-5] == 0)
					{
					choice(i1-5);
					Fapai(i1-5, time + 1);
					}
					
				}
				check();	
				int j=judge();
//-------------------------------------游戏结束后清算------------------------------------------//		
				if (time == 5)
				{
					win = j;
				}
				if (win != 0)     //游戏结束后打印未放弃玩家的牌和筹码
				{ 
					if (win == -1)
					{
						System.out.println("所有玩家都放弃,游戏结束");
						return;
					}
					System.out.println("最终获胜者是: " + win + "号玩家");
					
					for (int i = 1; i <= 5; i++)    //计算赢家赢得的筹码
					{
						if (i!=win)
						all_money[win] += drop_money[i];
					}
					System.out.println("本局赢得分数为:" + (all_money[win] - 10000));
					
					for (int i = 1; i <= 5; i++)   // 打印出结束后未放弃玩家手中的筹码
					{
						if (flag[i] == 0 && i != win)
						{
							all_money[i] -= drop_money[i];
						}
						if (flag[i] == 0)
							{
								print_final(i);    //打印出未放弃玩家的牌
							}
					}
					for (int i = 1; i <= 5; i++)
					{
						System.out.println(i + "号玩家手中的筹码为: " + all_money[i]);
					}
					return;
				}
//-------------------------------------游戏结束后清算------------------------------------------//				
				
				time++; // 发牌后就应该增加
				for (int i1 = 1; i1 <= 5; i1++)
				{ /// 每轮发牌结束后都打印出玩家在桌上的牌
					if (flag[i1] == 0)
					{
						print(i1, 2);
					}
				}
	
			}
	
		}
	}

	
	//主方法
	public static void main(String[] args)
	{
		SuoHa s = new SuoHa();
		Chushihua();
		s.play();

	}
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
梭哈(来自英文showhands)是从扑克牌中借鉴过来的。每人五个骰子,摇出后,依其点数牌形可分为:散牌(五个骰子点数各不一样)、一对(五个骰子中仅有两个骰子点数一样,其余皆不一样)、两对(两个对子加一个其他点数,如一对二加一对四加一个三)、三条(三个骰子的点数一致,余下两个骰子点数各不相同,如三个四加一个二和一个六)、葫芦(也就是扑克牌中的三条带一对:三个骰子点数同为某数,余下两个骰子点数同为另一数,如三个三加一对二)、(其中四个骰子的点数一致,如四个一加一个五)、顺子(五个骰子点数呈连续分布,如12345和23456)、豹子(五个骰子点数全一样)。  胜负规则为豹子>顺子>炸弹>葫芦>三条>两对>对子>散牌。若属于同一类型,则依次比较类型构成主次要成分的骰子点数大小。如先比较四个相同骰子的点数,再比较散牌;葫芦先比较三个相同骰子再比较对牌;两对先比较较大的对,再比较稍小的对,最后比较散牌;如此类推。比较点数时1>6>5>4>3>2。试举例,如双方均为葫芦,一人为三个五带对二,另一人为三个四带对六,前者胜;又若双方均为两对,同有对二、对六,但一方散牌为五、另一方为一,则后者胜。 ◦ 要求:请编程实现如下功能:  分别产生六组随机数(对应六个玩家),根据上面的规则判断所产生的骰子点数牌型,并输出。  比较六个玩家的胜负,并输出。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值