一、游戏要求
1.设置参与的人数,并给每个人设置名字、序号和初始金币
2.设置本局消耗金币(底注)
3.开始玩游戏
每位玩家看牌后选择下注或者弃牌
当仅剩2名玩家的时候开始比牌
4、一局游戏结束,显示所有玩家当前的金币信息
二、代码分析
1、Java是面向对象编程,所以我们要抽类
- ①Poker类(包含准备一副牌,产生发牌索引便于后续发牌)
- ②Player类(包含玩家的基本信息,getPoker方法==通过Poker类的索引获取三张牌,lostMoney抛出的钱,winMoney赢的钱,当然还有构造方法和getter and setter)
2、在主方法中按照代码要求依次实现
三、代码实现
1、Poker类
import java.util.*;
public class Poker {
public Poker() {
}
//准备一副牌
public HashMap<Integer, String> prePoker(){
List<String> colors = List.of("♠", "♥", "♣", "♦");
List<String> num = List.of("2", "A", "K", "Q", "J", "9", "8", "7", "6", "5", "4", "3");
HashMap<Integer, String> map = new HashMap<>();
int index = 0;
for (String color : colors) {
for (String number : num) {
map.put(index, "-"+color +"-"+ number+"-");
index++;
}
}
return map;
}
public List<Integer> index(){
List<Integer> list=new ArrayList<>();
for (int i = 0; i < 52; i++) {
list.add(i);
}
Collections.shuffle(list);
return list;
}
}
PS:
-
为什么我在拼接一副牌的时候前后都加了"-"
这是为饿了最后比牌的时候通过String类的split方法将花色与点数分开以便于比较 -
调用shuffle方法后后续发牌只需要调用index集合中不重复的元素,即可实现洗牌和发牌。
2、Player类
import java.util.*;
public class Player {
private String name;
private int number;
private int money;
//玩家的是否弃牌状态 true==继续游戏 false==弃牌
private boolean flag=true;
public Player(String name, int number, int money) {
this.name = name;
this.number = number;
this.money = money;
}
public Player() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
public void winnerMoney(int win){
money=money+win;
}
public void lostMoney(int lost) {
if (lost <= money) {
money = money - lost;
} else {
System.out.println("下注失败请重新下注");
lose(lost);
}
}
private void lose(int lose){
if(lose<=money ){
money=money-lose;
}
}
//产生三张玩家牌
public ArrayList<String> getpocker(List<Integer> index,int number,HashMap<Integer, String> map){
ArrayList<String > pai=new ArrayList<>();
int r = 3 * number - 1;
for (int i=0; i < 3; i++) {
pai.add(map.get(index.get(r)));
r--;
}
return pai;
}
}
PS:
- 1、为什么有两个关于输钱的方法
虽然他们都是关于输钱的方法但是当中的修饰符不一样private修饰的方法仅Player类内部可使用,是为了解决lostMoney方法中下注失败的问题
3、主方法
import java.util.*;
public class Run {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
//准备一副牌
Poker poker=new Poker();
HashMap<Integer, String> prePoker = poker.prePoker();
List<Integer> index = poker.index();
//创建玩家
ArrayList<Player> players=new ArrayList<>();
System.out.println("请输入参入人数(2-5)");
Hashtable<Integer, String> playernamenum = new Hashtable();
Hashtable<Integer, Integer> playermoney = new Hashtable();
int playercount = sc.nextInt();
for (int i = 1; i < playercount + 1; i++) {
System.out.println("请输入第" + i + "号玩家的姓名");
String name = sc.next();
System.out.println("该玩家所拥有的初始金额");
Integer money = sc.nextInt();
playernamenum.put(i, name);
playermoney.put(i, money);
}
/* for (int i = 0; i < playercount; i++) {
players.add(sc.next(),sc.nextInt(),sc.nextInt());
}*/
//将玩家存储到玩家类里
if(playercount==2){
Player player1=new Player();
player1.setMoney(playermoney.get(1));
player1.setName(playernamenum.get(1));
player1.setNumber(1);
Player player2=new Player();
player2.setMoney(playermoney.get(2));
player2.setName(playernamenum.get(2));
player2.setNumber(2);
players.add(player1);
players.add(player2);
}else if(playercount==3){
Player player1=new Player();
player1.setMoney(playermoney.get(1));
player1.setName(playernamenum.get(1));
player1.setNumber(1);
Player player2=new Player();
player2.setMoney(playermoney.get(2));
player2.setName(playernamenum.get(2));
player2.setNumber(2);
Player player3=new Player();
player3.setMoney(playermoney.get(3));
player3.setName(playernamenum.get(3));
player3.setNumber(3);
players.add(player1);
players.add(player2);
players.add(player3);
}else if(playercount==4){
Player player1=new Player();
player1.setMoney(playermoney.get(1));
player1.setName(playernamenum.get(1));
player1.setNumber(1);
Player player2=new Player();
player2.setMoney(playermoney.get(2));
player2.setName(playernamenum.get(2));
player2.setNumber(2);
Player player3=new Player();
player3.setMoney(playermoney.get(3));
player3.setName(playernamenum.get(3));
player3.setNumber(3);
Player player4=new Player();
player4.setMoney(playermoney.get(4));
player4.setName(playernamenum.get(4));
player4.setNumber(4);
players.add(player1);
players.add(player2);
players.add(player3);
players.add(player4);
}else if(playercount==5){
Player player1=new Player();
player1.setMoney(playermoney.get(1));
player1.setName(playernamenum.get(1));
player1.setNumber(1);
Player player2=new Player();
player2.setMoney(playermoney.get(2));
player2.setName(playernamenum.get(2));
player2.setNumber(2);
Player player3=new Player();
player3.setMoney(playermoney.get(3));
player3.setName(playernamenum.get(3));
player3.setNumber(3);
Player player4=new Player();
player4.setMoney(playermoney.get(4));
player4.setName(playernamenum.get(4));
player4.setNumber(4);
Player player5=new Player();
player5.setMoney(playermoney.get(5));
player5.setName(playernamenum.get(5));
player5.setNumber(5);
players.add(player1);
players.add(player2);
players.add(player3);
players.add(player4);
players.add(player5);
}
//开始游戏
int poolMoney=0;//场上金额
//设置底注
System.out.println("请设置底注");
int leastMoney=sc.nextInt();
poolMoney=leastMoney*playercount;
for (Player player : players) {
player.lostMoney(leastMoney);
}
//下注阶段
while(playercount>2){
for (Player player : players) {
if(player.isFlag()==false){
continue;
}else if(player.isFlag()==true){
System.out.println("玩家"+player.getName()+"的牌为"+player.getpocker(index,player.getNumber(),prePoker).toString());
System.out.println("请玩家选择 1、下注or 2、弃牌" );
int choice=sc.nextInt();
if(choice==1){
System.out.println("请玩家"+player.getName()+"开始下注"+"下注金额大于等于"+leastMoney);
int lost = sc.nextInt();
player.lostMoney(lost);
poolMoney=poolMoney+lost;
}
if(choice==2){
//玩家弃牌 状态改为false
player.setFlag(false);
// playernamenum.remove(count);
playercount--;
//只剩两人是结束战斗
if(playercount==2){
break;
}
}
}
}
}
System.out.println("开始比牌");
//Hashtable<Integer, String> finalpai = new Hashtable();
ArrayList<String> finalpai=new ArrayList<>();
//提取出最后的牌
int[] num=new int[2];
int t=0;
for (Player player : players) {
if(player.isFlag()==true){
finalpai.add(player.getpocker(index,player.getNumber(),prePoker).toString());
num[t]=player.getNumber();
t++;
}
}
/*for (String s : finalpai) {
System.out.println(s);
}*/
//System.out.println("=====================");
String[] split = finalpai.get(0).split("-");
String[] split2 = finalpai.get(1).split("-");
/*for (int i = 0; i < split.length; i++) {
System.out.println(split[i]+i);
}*/
/*
* [-♦-8-, -♥-9-, -♦-A-]
[-♣-5-, -♥-5-, -♥-8-]
=====================
[ 0
♦ 1
8 2
, 3
♥ 4
9 5
, 6
♦ 7
A 8
] 9
* */
int score1 = score(split);
int score2 = score(split2);
if(score1>score2){
for (Player player : players) {
if(player.getNumber()==num[0]){
System.out.println("玩家:"+player.getName()+"获胜");
player.winnerMoney(poolMoney);
}
}
}else if(score1<score2) {
for (Player player : players) {
if (player.getNumber() == num[1]) {
System.out.println("玩家:" + player.getName() + "获胜");
player.winnerMoney(poolMoney);
}
}
}else if(score1==score2){
for (Player player : players) {
if (player.getNumber() == num[1]) {
System.out.println("平局");
player.winnerMoney((poolMoney)/2);
}
if(player.getNumber()==num[0]){
player.winnerMoney((poolMoney)/2);
}
}
}
for (Player player : players) {
System.out.println("第"+player.getNumber()+"号"+player.getName()+"的金币为"+player.getMoney());
}
}
public static int score(String[] split1){
int score=0;
if(split1[1]==split1[4]&&split1[4]==split1[7]){
score=score+1000;
}
//对子
if(split1[2]==split1[5]||split1[8]==split1[5]||split1[3]==split1[8]){
score=score+50;
}
//顺子
ArrayList<Integer> arr=new ArrayList<>();
for (int i = 2; i < 9;i=i+3){
switch (split1[i]){
case "3":arr.add(3);
case "4":arr.add(4);
case "5":arr.add(5);
case "6":arr.add(6);
case "7":arr.add(7);
case "8":arr.add(8);
case "9":arr.add(9);
case "J":arr.add(10);
case "Q":arr.add(11);
case "K":arr.add(12);
case "A":arr.add(13);
case "2":arr.add(14);
}
}
int max=0;
for (Integer integer : arr) {
if(max<integer){
max=integer;
}
}
if(max-((arr.get(0)+arr.get(1)+arr.get(2))/3)==1){
score=score+100;
}
//炸弹
if(split1[2]==split1[5]&&split1[5]==split1[8]){
score=score+2000;
}
//普通牌
for (int i = 2; i < 9;i=i+3){
switch (split1[i]){
case "3":score=score+3;
case "4":score=score+4;
case "5":score=score+5;
case "6":score=score+6;
case "7":score=score+7;
case "8":score=score+8;
case "9":score=score+9;
case "J":score=score+10;
case "Q":score=score+11;
case "K":score=score+12;
case "A":score=score+13;
case "2":score=score+14;
}
}
return score;
}
}
PS:
- 1、首先就为什么有这么多的重复代码块
我也表示无奈
我也尝试过
直接输入到players集合中,奈何报错,目前还没有想到好的方法解决 - 2、这一块注释是split集合的遍历 便于确定索引来比牌
四、写在最后(希望广大读者爸爸回复更好的方法)
因为我小白初学不久,很多
代码都显得冗余,杂乱;
思想也不够严谨
甚至一些功能都无法实现(比如这个demo中跟注,或者allin的代码都没有实现,说来惭愧学了这么旧,写个代码能把自己绕进去)
希望读者爸爸们,大佬们等给我建议,要是能帮我改改那就更好了