Java基础综合案列——扑克牌人机小游戏
/*
*
* Pooker类
*
* */
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
public class Pooker {
//pookerMap存放数字与牌的对应关系,pookerList存放牌对应的数值
private static HashMap<Integer,String> pookerMap=new HashMap<>();
private static ArrayList<Integer> pookerList=new ArrayList<>();
static{String[] colors="♠-♥-♣-♦".split("-");
String[] nums="2-3-4-5-6-7-8-9-10-J-Q-K-A".split("-");
int index=0;
for (String color : colors) {
for (String num : nums) {
String onepooker=color+num;
pookerMap.put(index,onepooker);
pookerList.add(index++);}
}
}
//打乱数值洗牌
public static void shufflePooker(){
Collections.shuffle(pookerList);
}
//发牌
public static ArrayList<Integer>[] deal(ArrayList<Integer>... players){
int nums= players.length;
for (int i=0;i<3*nums;i++){
int x=i%nums;
players[x].add(pookerList.get(i));
}
return players;
}
//看牌,查看多人
public static void show(String[] name,ArrayList<Integer>... players){
for (int i = 0; i < players.length; i++) {
Collections.sort(players[i], new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1%13-o2%13;
}
});
System.out.print(name[i]+":\t");
for (Integer x : players[i]) {
System.out.print(pookerMap.get(x)+"\t");
}
System.out.println(pookerGrade(players[i]));
}
}
//看牌重载,只看一个人
public static void show(String name,ArrayList<Integer> player){
Collections.sort(player, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1%13-o2%13;
}
});
System.out.print(name+":\t");
for (Integer x : player) {
System.out.print(pookerMap.get(x)+"\t");
}
System.out.println(pookerGrade(player));
}
//查询牌型
public static String pookerGrade(ArrayList<Integer> pooker){
int max=pooker.get(0);
int med=pooker.get(0);
int min=pooker.get(0);
for (int i = 1; i < pooker.size(); i++) {
max=max>pooker.get(i)?max:pooker.get(i);
min=min<pooker.get(i)?min:pooker.get(i);
}
med=pooker.get(0)+pooker.get(1)+pooker.get(2)-max-min;
int imax=pooker.get(0)%13;
int imed=pooker.get(0)%13;
int imin=pooker.get(0)%13;
for (int i = 1; i < pooker.size(); i++) {
imax=imax>pooker.get(i)%13?imax:pooker.get(i)%13;
imin=imin<pooker.get(i)%13?imin:pooker.get(i)%13;
}
imed=pooker.get(0)%13+pooker.get(1)%13+pooker.get(2)%13-imin-imax;
if (imax-imin==0){
return "豹子";
}
else if (imax-imin==2&&max/13==min/13){
return "顺金";
}
else if (max/13==min/13){
return "金花";
}
else if (imax+imin==2*imed&&imax-imin==2){
return "顺子";
}
else if(imax==imed||imin==imed){
return "对子";
}
else {
return "单张";
}
}
//比牌,player1赢返回true
public static boolean compare(ArrayList<Integer> pooker1,ArrayList<Integer> pooker2){
int max=pooker1.get(0);
int med=pooker1.get(0);
int min=pooker1.get(0);
for (int i = 1; i < pooker1.size(); i++) {
max=max>pooker1.get(i)?max:pooker1.get(i);
min=min<pooker1.get(i)?min:pooker1.get(i);
}
med=pooker1.get(0)+pooker1.get(1)+pooker1.get(2)-max-min;
int imax=pooker1.get(0)%13;
int imed=pooker1.get(0)%13;
int imin=pooker1.get(0)%13;
for (int i = 1; i < pooker2.size(); i++) {
imax=imax>pooker1.get(i)%13?imax:pooker1.get(i)%13;
imin=imin<pooker1.get(i)%13?imin:pooker1.get(i)%13;
}
imed=pooker1.get(0)%13+pooker1.get(1)%13+pooker1.get(2)%13-imin-imax;
int dui=imax==imed?imax:imin;
int max2=pooker2.get(0);
int med2=pooker2.get(0);
int min2=pooker2.get(0);
for (int i = 1; i < pooker2.size(); i++) {
max2=max2>pooker2.get(i)?max2:pooker2.get(i);
min2=min2<pooker2.get(i)?min2:pooker2.get(i);
}
med2=pooker2.get(0)+pooker2.get(1)+pooker2.get(2)-max2-min2;
int imax2=pooker2.get(0)%13;
int imed2=pooker2.get(0)%13;
int imin2=pooker2.get(0)%13;
for (int i = 1; i < pooker2.size(); i++) {
imax2=imax2>pooker2.get(i)%13?imax2:pooker2.get(i)%13;
imin2=imin2<pooker2.get(i)%13?imin2:pooker2.get(i)%13;
}
imed2=pooker2.get(0)%13+pooker2.get(1)%13+pooker2.get(2)%13-imin2-imax2;
int dui2=imax2==imed2?imax2:imin2;
HashMap<String,Integer> gradeMap=new HashMap<>();
gradeMap.put("豹子",6);
gradeMap.put("顺金",5);
gradeMap.put("金花",4);
gradeMap.put("顺子",3);
gradeMap.put("对子",2);
gradeMap.put("单张",1);
Integer p1Value=gradeMap.get(pookerGrade(pooker1));
Integer p2Value=gradeMap.get(pookerGrade(pooker2));
if (p1Value!=p2Value){
return p1Value>p2Value?true:false;
}
else{
switch (p1Value){
case 2:
if (dui!=dui2){
return dui>dui2?true:false;
}
else if (3*imed-2*dui!=3*imed2-2*dui2){
return 3*imed-2*dui>3*imed2-2*dui2?true:false;
}
else
return false;
case 1:
case 3:
case 4:
if (imax!=imax2){
return imax>imax2?true:false;
}
else if (imed!=imed2){
return imed>imed2?true:false;
}
else if (imin!=imin2){
return imin>imin2?true:false;
}
else {
return max<max2?true:false;
}
case 5:
if(imax!=imax2){
return imax>imax2?true:false;}
else{
return max<max2?true:false;
}
case 6:
return imax>imax2?true:false;
default:
return false;
}
}
}
//构造方法
public Pooker() {
}
public static HashMap<Integer, String> getPookerMap() {
return pookerMap;
}
public static ArrayList<Integer> getPookerList() {
return pookerList;
}
}
/*
*
* 游戏界面
*
* */
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class PookerMainApp {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Random r=new Random();
//设置电脑和玩家的初始金额,创建一个数组存放玩家和电脑的牌
int computerM=100;
int playerM=100;
String[] name="电脑-玩家".split("-");
ArrayList<Integer> computer=new ArrayList<>();
ArrayList<Integer> player=new ArrayList<>();
ArrayList<Integer>[] players=new ArrayList[]{computer,player};
System.out.println("欢迎来到炸金花人机对战");
String s="Y";
b:while (s.equalsIgnoreCase("Y")){
System.out.println("电脑当前金额:"+computerM+"元\t玩家当前金额:"+playerM+"元");
System.out.println("是否开始游戏?(Y/N)");
s=sc.next();
if (!s.equalsIgnoreCase("y")){
break;
}
System.out.println("开始洗牌");
Pooker.shufflePooker();
int money=0;//水钱初始化
System.out.println("正在注入水钱");
computerM-=2;
playerM-=2;
money+=4;
System.out.println("当前水钱:"+money+"元\t电脑当前金额:"+computerM+"元\t玩家当前金额:"+playerM+"元");
System.out.println("现在开始发牌");
players=Pooker.deal(players[0],players[1]);
System.out.println("…………");
System.out.println("牌已发好");
//初始化每一注的价格,初始化倍数(看牌后为两倍)
int wM=2;
int MA=1;
a:while (true){
System.out.println("请选择你要进行的操作");
System.out.println("放弃(1);看牌(2);跟注(3);加注(4);比牌(5)");
switch (sc.nextInt()){
//玩家放弃,电脑直接获胜
case 1:
System.out.println("您选择了放弃,电脑胜利,获得所有水钱");
computerM+=money;
System.out.println("电脑当前金额:"+computerM+"元\t玩家当前金额:"+playerM+"元");
System.out.println("是否再来一局?(Y/N)");
s=sc.next();
continue b;
//玩家看牌,倍数成为2
case 2:
System.out.println("您选择看牌,之后的每次跟注,加注都将是两倍");
MA=2;
Pooker.show(name[1],players[1]);
continue;
//玩家跟注
case 3:
System.out.println("你选择跟注,当前跟注价格为"+wM+"元(看牌后为两倍)");
money+=wM*MA;
playerM-=wM*MA;
System.out.println("当前水钱:"+money+"元\t电脑当前金额:"+computerM+"元\t玩家当前金额:"+playerM+"元");
break;
//玩家加注
case 4:
System.out.println("你选择加注,请输入加注金额");
int jia1=sc.nextInt();
int yizhu=(jia1+wM)*MA;
money+=yizhu;
wM+=jia1;
playerM-=yizhu;
System.out.println("当前水钱:"+money+"元\t电脑当前金额:"+computerM+"元\t玩家当前金额:"+playerM+"元");
break;
//玩家比牌
case 5:
System.out.println("你选择比牌");
money+=wM*MA;
playerM-=wM*MA;
System.out.println("当前水钱:"+money+"元\t电脑当前金额:"+computerM+"元\t玩家当前金额:"+playerM+"元");
break a;
default:
System.out.println("没有该项选择,请重选");
continue ;
}
//电脑根据输赢结果进行选择,有一定的概率输
System.out.println("电脑开始进行选择");
if (Pooker.compare(players[0],players[1])){
if (r.nextInt(10)<8){
System.out.println("电脑选择跟注");
computerM-=wM;
money+=wM;
System.out.println("当前水钱:"+money+"元\t电脑当前金额:"+computerM+"元\t玩家当前金额:"+playerM+"元");
}
else {
System.out.println("电脑选择比牌");
break ;
}
}
else {
if (r.nextInt(10)<7){
System.out.println("电脑选择放弃");
break ;
}
else {
System.out.println("电脑选择跟注");
computerM-=wM;
money+=wM;
System.out.println("当前水钱:"+money+"元\t电脑当前金额:"+computerM+"元\t玩家当前金额:"+playerM+"元");
}
}
if (computerM<0||playerM<0){
System.out.println("已有一方没钱了,直接开牌");
break ;
}
}
System.out.println("现在开牌");
Pooker.show(name,players);
//判定胜负,决定水钱归属
if (Pooker.compare(players[0],players[1])){
System.out.println("电脑获胜");
computerM+=money;
System.out.println("电脑当前金额:"+computerM+"元\t玩家当前金额:"+playerM+"元");
}
else {
System.out.println("恭喜您取得胜利");
playerM+=money;
System.out.println("电脑当前金额:"+computerM+"元\t玩家当前金额:"+playerM+"元");
}
if (computerM<0||playerM<0){
System.out.println("已有一方没钱了,游戏结束");
break ;
}
System.out.println("是否再来一局?(Y/N)");
s=sc.next();
}
System.out.println("谢谢惠顾,期待您的再次光临");
}
}
/**
基础知识的综合运用
运行效果如下
*/