为了账号安全,请及时绑定邮箱和手机立即绑定

简易扑克牌游戏,写的略长了点,花了一下午,给大家看一下

游戏开始:O(∩_∩)O哈哈~

package imooc.pocker;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

/*
 * 可改变玩家数量和玩家手牌数
 * 根据手牌中最大牌进行简单大小比较
 */
public class Test {

	public static void main(String[] args) {
		System.out.println("--------产生一副扑克牌--------");
		List<Pocker> pockers = Pocker.createPocker();
		System.out.println("--------扑克牌创建成功--------");
		System.out.println(pockers.toString());
		System.out.println("--------开始洗牌--------");
		Collections.shuffle(pockers);
		System.out.println("--------洗牌结束--------");
		System.out.println(pockers.toString());
		System.out.println("--------创建玩家--------");
		Scanner scanner = new Scanner(System.in);
		List<Player> players = new ArrayList<Player>();
		int handCardNum = 3;
		int playerNum = 2;
		while (true) {
			try {
				System.out.println("请输入玩家数量:");
				playerNum = scanner.nextInt();
				int id;
				String name;
				for (int i = 0; i < playerNum; i++) {
					System.out.println("创建第" + (i + 1) + "位玩家的ID和姓名:");
					System.out.println("输入玩家id(int): ");
					id = scanner.nextInt();
					System.out.println("输入玩家姓名:");
					name = scanner.next();
					players.add(new Player(id, name));
				}
				for (int i = 0; i < playerNum; i++) {
					System.out.println("欢迎玩家:" + players.get(i).getName());
				}
				System.out.println("--------开始发牌--------");
				int cardNums = handCardNum * playerNum;
				Pocker pocker;
				for (int i = 0; i < cardNums; i++) {
					pocker = pockers.get(i);
					players.get(i % playerNum).getHandPockers().add(pocker);
				}
				System.out.println("--------发牌结束--------");
				System.out.println("--------开始游戏--------");
				Pocker maxPocker = new Pocker("方块", "2");
				int winPlayer = 0;
				for (int i = 0; i < playerNum; i++) {
					Collections.sort(players.get(i).getHandPockers()); // 对手牌进行排序
					Collections.reverse(players.get(i).getHandPockers()); // 排序后的手牌进行翻转,第一位为最大值
					System.out
							.println("玩家"
									+ players.get(i).getName()
									+ "最大手牌为:"
									+ players.get(i).getHandPockers().get(0)
											.toString());
					if (maxPocker.compareTo(players.get(i).getHandPockers()
							.get(0)) < 0) {
						maxPocker = players.get(i).getHandPockers().get(0);
						winPlayer = i;
					}
				}
				System.out.println("玩家" + players.get(winPlayer).getName()
						+ "获胜");
				System.out.println("玩家各自的手牌为:");
				for (int i = 0; i < playerNum; i++) {
					System.out.println(players.get(i).getName() + ": "
							+ players.get(i).getHandPockers().toString());
				}
				break;
			} catch (Exception e) {
				System.out.println("输入值错误,请重新输入");
				scanner = new Scanner(System.in);
			}
		}

	}

}

玩家类:Player

package imooc.pocker;

import java.util.ArrayList;
import java.util.List;

public class Player {
	/*
	 * 玩家
	 * 属性:ID,姓名,手牌
	 * 手牌为扑克牌的集合
	 */
	private int id;
	private String name;
	private List<Pocker> handPockers;
	
	public Player(int id, String name) {
		this.id = id;
		this.name = name;
		this.handPockers = new ArrayList<Pocker>();
	}
	
	public int getId() {
		return id;
	}

	public String getName() {
		return name;
	}

	public List<Pocker> getHandPockers() {
		return handPockers;
	}

}

扑克牌类:Pocker

package imooc.pocker;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * 
 * @author sun
 *  扑克牌
 *  包括四种花色:黑桃、红桃、梅花、方块、
 *  十三中点数:2~10,J、Q、K、A,不包括大小王
 */
public class Pocker implements Comparable<Pocker>{
	private String color;  //扑克牌花色
	private String value;  //扑克牌面值
	private static final int CARDNUM = 52;   //扑克牌总量
	private static final int SINGLECOLORNUM = 13; //每种颜色扑克牌数量
	
	public Pocker(){
	}
	
	public Pocker(String color, String value) {
		this.color = color;
		this.value = value;
	}

	public String getColor() {
		return color;
	}

	public String getValue() {
		return value;
	}

	/*
	 * 产生52张扑克牌
	 * return List<Pocker>
	 */
	 
	public static List<Pocker> createPocker(){
		List<Pocker> pockers = new ArrayList<Pocker>();
		for(int i = 0; i < CARDNUM; i++){
			String newValue = null;
			int temp = i % SINGLECOLORNUM;
			switch (temp) {
			case 11:
				newValue = "j";
				break;
			case 12:
				newValue = "Q";
				break;
			case 0:
				newValue = "K";
				break;
			case 1:
				newValue = "A";
				break;
			default:
				newValue = String.valueOf(temp);
			}
			
			String newColor = null;
			switch (i / SINGLECOLORNUM) {
			case 0:
				newColor = "黑桃";
				break;
			case 1:
				newColor = "红桃";
				break;
			case 2:
				newColor = "梅花";
				break;
			case 3:
				newColor = "方块";
			}
			pockers.add(new Pocker(newColor,newValue));
		}
		return pockers;
	}
	
	/*
	 * Collections.shuffle进行洗牌
	 */
	public static List<Pocker> shuffle(List<Pocker> pockers){
		Collections.shuffle(pockers);
		return pockers;
	}
	
	/*
	 * (non-Javadoc)
	 * @see java.lang.Comparable#compareTo(java.lang.Object)
	 * 重写了copmareTo方法,实现了Comparable接口
	 * 根据牌值和花色在列表中的顺序进行比较
	 */
	@Override
	public int compareTo(Pocker o) {
		List<String> valueBase = Arrays.asList("2","3","4","5","6","7","8","9","10","J","Q","K","A");
		List<String> colorBase = Arrays.asList("方块","梅花","红桃","黑桃");
		if(valueBase.indexOf(this.value) == valueBase.indexOf(o.value))
			return Integer.valueOf(colorBase.indexOf(this.color)).compareTo(Integer.valueOf(colorBase.indexOf(o.getColor())));
		else 
			return Integer.valueOf(valueBase.indexOf(this.value)).compareTo(Integer.valueOf(valueBase.indexOf(o.getValue())));

	}

	@Override
	public String toString() {
		return color+value;
	}

}


正在回答

15 回答

虽然我暂时写不好,但是这个软件问题太多了,比如玩家数可以大于17,在输完id和姓名后才报错,然后我试了下17,然后创建玩家就会一直进行下去。

0 回复 有任何疑惑可以回复我~

好东西~

0 回复 有任何疑惑可以回复我~

 pockers.add(new Pocker(newColor,newValue));这里为什么出错啊

0 回复 有任何疑惑可以回复我~
 if( if(valueBase.indexOf(this.value) == valueBase.indexOf(o.value))
            return Integer.valueOf(colorBase.indexOf(this.color)).compareTo(Integer.valueOf(colorBase.indexOf(o.getColor())));
        else 
            return Integer.valueOf(valueBase.indexOf(this.value)).compareTo(Integer.valueOf(valueBase.indexOf(o.getValue())));) == valueBase.indexOf(o.value))
            return Integer.valueOf(colorBase.indexOf(this.color)).compareTo(Integer.valueOf(colorBase.indexOf(o.getColor())));
        else 
            return Integer.valueOf(valueBase.indexOf(this.value)).compareTo(Integer.valueOf(valueBase.indexOf(o.getValue())));

这段代码比较的是什么和什么啊,这段代码看不懂了,大神们能解释一下么?valueBase.indexOf(this.value)是谁的值的位置,valueBase.indexOf(o.value)又是谁的值在valueBase里的位置?

0 回复 有任何疑惑可以回复我~
#1

指与点

取模运算和整除运算的使用把我惊呆了!
2015-08-13 回复 有任何疑惑可以回复我~

666

0 回复 有任何疑惑可以回复我~

public int compareTo(Pocker o) {

       List<String> valueBase = Arrays.asList("2","3","4","5","6","7","8","9","10","J","Q","K","A");

       List<String> colorBase = Arrays.asList("方块","梅花","红桃","黑桃");

       if(valueBase.indexOf(this.value) == valueBase.indexOf(o.value))

           return Integer.valueOf(colorBase.indexOf(this.color)).compareTo(Integer.valueOf(colorBase.indexOf(o.getColor())));

       else

           return Integer.valueOf(valueBase.indexOf(this.value)).compareTo(Integer.valueOf(valueBase.indexOf(o.getValue())));

   }

请教下各位大牛,这个方法内部为啥可以调用compareTo本身呢?

0 回复 有任何疑惑可以回复我~
return Integer.valueOf(colorBase.indexOf(this.color)).compareTo(Integer.valueOf(colorBase.indexOf(o.getColor())));

这一句怎么理解?直接返回

colorBase.indexOf(this.color).compareTo(colorBase.indexOf(o.getColor()))

不行吗?

0 回复 有任何疑惑可以回复我~
#1

sunjelly

需要强制类型转换
2015-07-10 回复 有任何疑惑可以回复我~
#2

五竹 回复 sunjelly

我明白的。但是compare to 方法本身不就是返回int类型的值吗?还要装箱为Integer类型吗?
2015-07-13 回复 有任何疑惑可以回复我~
#3

feeling007

要用包装类
2015-07-14 回复 有任何疑惑可以回复我~
#4

五竹 回复 feeling007

差不多搞清楚了。一个对象才能调用compare to方法,而colorBase.indexOf(this.color)返回的是一个int类型的值,属于基本数据类型,并非对象,所以要用包装类Integer的valueOf方法将这个值包装成Integer对象才可以进行调用。非常感谢各位慕友的指正~
2015-07-14 回复 有任何疑惑可以回复我~
#5

sd1700092 回复 feeling007

你胡说,直接return colorBase.indexOf(this.color).compareTo(colorBase.indexOf(o.getColor()))明明可以的
2015-07-16 回复 有任何疑惑可以回复我~
#6

feeling007 回复 sd1700092

如果可以,我觉得也是int隐式转化成Integer
2015-07-17 回复 有任何疑惑可以回复我~
#7

Lubywu

字符串型怎么比较,得抓成int 型才可以比较值
2015-11-30 回复 有任何疑惑可以回复我~
查看4条回复

大赞!

0 回复 有任何疑惑可以回复我~

写的太棒了~~~~

0 回复 有任何疑惑可以回复我~

就是,传作品里去吧。

0 回复 有任何疑惑可以回复我~
首页上一页12下一页尾页

举报

0/150
提交
取消
Java入门第三季
  • 参与学习       409792    人
  • 解答问题       4340    个

Java中你必须懂得常用技能,不容错过的精彩,快来加入吧

进入课程

简易扑克牌游戏,写的略长了点,花了一下午,给大家看一下

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信