梭哈游戏
电信大二,刚开始学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();
}
}