📄 pkgame.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 + -