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

原谅我到现在才理解Comparable的compareTo方法如何使用....今天回头写代码,这么写都不对,最后又看了遍comparable才理解了 ....

注意这里的内容我已经更新了,原来的删掉了.这是我最新的代码..修改过的,上午半天写出来了,结果bug好几个,然后就是排序不正常,一直弄到快晚上...现在好了,,大家看看有什么问题没有,提供下载地址:

http://pan.baidu.com/s/1hrL2SS0

整体结构如下:

package item;

public class Card implements Comparable<Card> {

	private String point;
	private String variety;
	private String[] p = { "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A" };
	private String[] v = { "黑桃", "红桃", "梅花", "方块" };

	public String getVariety() {
		return variety;
	}

	public void setVariety(int variety) {
		this.variety = v[variety];
	}

	public String getPoint() {
		return point;
	}

	public void setPoint(int point) {
		this.point = p[point];
	}

	public Card() {

	}

	@Override
	public String toString() {
		return this.getVariety() + this.getPoint();
	}

	@Override
	public int compareTo(Card o) {
		String point = "12345678910JQKA";
		String variety = "方块梅花红桃黑桃";
		int p = point.indexOf(this.getPoint())-point.indexOf(o.getPoint());
		int v = variety.indexOf(this.getVariety())-variety.indexOf(o.getVariety());
		//String str2 = "黑桃红桃梅花方块";
		return p*4+v/2;
	}

}
package item;

import java.util.List;
import java.util.Scanner;

public class Player {

	private String name;
	private int id;
	private List<Card> cardList;
	int count;
	Scanner in;

	public Player() {

	}

	public String getName() {
		return name;
	}

	public int getId() {
		return id;
	}

	public void setName() {
		in = new Scanner(System.in);
		System.out.println("请输入姓名");
		name = in.next();
	}

	public void SetId() {
		if (count == 3) {
			System.out.println("对不起,输出次数达到上限,即将退出系统");
			return;
		}
		count++;
		in = new Scanner(System.in);
		System.out.println("请输出入id");
		try {
			id = in.nextInt();
			if(id<=0){
				throw new RuntimeException();
			}
		} catch (Exception e) {
			if (count < 3)
				System.out.println("对不起,请输出一个正整数");
			SetId();
		}
	}

	@Override
	public String toString() {
		return "Player [name=" + name + ", id=" + id + "]";
	}

	public List<Card> getCardList() {
		return cardList;
	}

	public void setCardList(List<Card> cardList) {
		this.cardList = cardList;
	}

	public void addCardList(Card c) {
		
		this.cardList.add(c);

	}

}
package util;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import item.Card;
import item.Player;

public class Utils {

	List<Card> cardList = new ArrayList<Card>();

	public List<Card> createCard() {
		for (int i = 0; i < 13; i++) {
			for (int j = 0; j < 4; j++) {
				Card card = new Card();
				card = new Card();
				card.setPoint(i);
				card.setVariety(j);
				cardList.add(card);
			}
		}
		System.out.println();
		return cardList;
	}

	public Player playerRegistered() {
		Player p = new Player();
		p.SetId();
		p.setName();
		return p;
	}

	public void dealCard(Player p1, Player p2, List<Card> cardList) {
		int i = 1;
		p1.setCardList(new ArrayList<Card>());
		p2.setCardList(new ArrayList<Card>());
		Iterator<Card> iterator = cardList.iterator();
		while (iterator.hasNext()) {
			if (i % 2 == 1) {
				System.out.println("玩家" + p1.getName() + "拿牌");
				p1.addCardList(iterator.next());
			}
			if (i % 2 == 0) {
				System.out.println("玩家" + p2.getName() + "拿牌");
				p2.addCardList(iterator.next());
			}
			if (i >= 4) {
				break;
			}
			i++;
		}
	}

	public  void sortCard(List<Card> cardList){
		Collections.sort(cardList);
		System.out.println(cardList);
	}


	public void shffleCard(List<Card> cardList){
        Collections.shuffle( cardList);
    }
	public Player pointCard(Player p1, Player p2) {
		List<Card> sum = new ArrayList<Card>();
		sum.addAll(p1.getCardList());
		sum.addAll(p2.getCardList());
		Card max = Collections.max(sum);
		Player winner = sum.indexOf(max) <= 2 ? p1 : p2;
		System.out.println("玩家" + winner.getName() + "赢");
		System.out.println("玩家" + winner.getName() + "最大的手牌为:" + max.toString());
		return winner;
	}
}
package View;

import java.util.List;
import item.Card;
import item.Player;
import util.Utils;

public class View {

	public static void main(String[] args) {
		
		Utils util = new Utils();
		System.out.println("------------创建扑克牌------------");
		List<Card> cardList = util.createCard();
		System.out.println(cardList);
		System.out.println("-----------扑克牌创建成功----------");
		System.out.println("------------玩家注册……-------------");
		
		Player p1 = util.playerRegistered();
		if(p1.getId()==0){
			return;
		}
		Player p2 = util.playerRegistered();
		if(p2.getId()==0){
			return;
		}
		System.out.println("注册的玩家为:");
		System.out.println(p1.toString());
		System.out.println(p2.toString());
		System.out.println("------------开始洗牌:-------------");
		util.shffleCard(cardList);
		System.out.println("------------开始发牌:-------------");
		util.dealCard(p1, p2, cardList);
		System.out.println("------------发牌结束!-------------");
		System.out.println("------------开始游戏……-------------");
		Player winner = util.pointCard(p1, p2);
		//这里可以把pointCard()方法该为返回值为void类型的;
		System.out.println("两人的手牌分别为:");
		System.out.println("玩家"+p1.getName()+"手牌为:"+p1.getCardList());
		System.out.println("玩家"+p2.getName()+"手牌为:"+p2.getCardList());
		System.out.println("本局胜利者的信息为:"+winner.toString());
		System.out.println("---------本局结束,再来一次吧!!----------");
		
		
	}
}

注意楼下我写的都有点问题,不用看了...

正在回答

5 回答

啊...有一个bug,现稍作修改..见谅..bug原因输入一个负数的id 能通过...

然后如果一直输入非int类型的id,会让id为0..在这里修改了..代码如下...

player:

package item;

import java.util.List;
import java.util.Scanner;

public class Player {

	private String name;
	private int id;
	private List<Card> cardList;
	int count;
	Scanner in;

	public Player() {

	}

	public String getName() {
		return name;
	}

	public int getId() {
		return id;
	}

	public void setName() {
		in = new Scanner(System.in);
		System.out.println("请输入姓名");
		name = in.next();
	}

	public void SetId() {
		if (count == 3) {
			System.out.println("对不起输出次数上限");
			return;
		}
		count++;
		in = new Scanner(System.in);
		System.out.println("请输出入id");
		try {
			id = in.nextInt();
			if(id<=0){
				throw new RuntimeException();
			}
		} catch (Exception e) {
			if (count < 3)
				System.out.println("对不起,请输出数字");
			SetId();
		}
	}

	@Override
	public String toString() {
		return "Player [name=" + name + ", id=" + id + "]";
	}

	public List<Card> getCardList() {
		return cardList;
	}

	public void setCardList(List<Card> cardList) {
		this.cardList = cardList;
	}

	public void addCardList(Card c) {
		
		this.cardList.add(c);

	}

}

view层

package View;

import java.util.Set;
import item.Card;
import item.Player;
import util.Utils;

public class View {

	public static void main(String[] args) {
		Utils util = new Utils();
		System.out.println("------------创建扑克牌------------");
		Set<Card> cardSet = util.createCard();
		System.out.println("-----------扑克牌创建成功----------");
		System.out.println("------------玩家注册……-------------");
		Player p1 = util.playerRegistered();
		if(p1.getId()==0){
			return;
		}
		Player p2 = util.playerRegistered();
		if(p1.getId()==0){
			return;
		}
		System.out.println("注册的玩家为:");
		System.out.println(p1.toString());
		System.out.println(p2.toString());
		System.out.println("------------开始发牌:-------------");
		util.dealCard(p1, p2, cardSet);
		System.out.println("------------发牌结束!-------------");
		System.out.println("------------开始游戏……-------------");
		Player winner = util.pointCard(p1, p2);
		//这里可以把pointCard()方法该为返回值为void类型的;
		System.out.println("两人的手牌分别为:");
		util.showCard(p1);
		util.showCard(p2);
		System.out.println("本局胜利者的信息为:"+winner.toString());
		System.out.println("---------本局结束,再来一次吧!!----------");

	}
}

其他不动.

更改后的公开下载链接:http://pan.baidu.com/s/1geIhiIB

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

关于这个综合练习,当时我写的是半成品,很多不足,今天我重新写了代码,有需要参考的可以来看看...http://pan.baidu.com/s/1nuLsISx

这个是view层:

package View;

import java.util.Set;
import item.Card;
import item.Player;
import util.Utils;

public class View {

	public static void main(String[] args) {
		Utils util = new Utils();
		System.out.println("------------创建扑克牌------------");
		Set<Card> cardSet = util.createCard();
		System.out.println("-----------扑克牌创建成功----------");
		Player p1 = util.playerRegistered();
		System.out.println("------------玩家注册……-------------");
		Player p2 = util.playerRegistered();
		System.out.println("注册的玩家为:");
		System.out.println(p1.toString());
		System.out.println(p2.toString());
		System.out.println("------------开始发牌:-------------");
		util.dealCard(p1, p2, cardSet);
		System.out.println("------------发牌结束!-------------");
		System.out.println("------------开始游戏……-------------");
		Player winner = util.pointCard(p1, p2);
		//这里可以把pointCard()方法该为返回值为void类型的;
		System.out.println("两人的手牌分别为:");
		util.showCard(p1);
		util.showCard(p2);
		System.out.println("本局胜利者的信息为:"+winner.toString());
		System.out.println("---------本局结束,再来一次吧!!----------");

	}
}

这个是Util层:

package util;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import item.Card;
import item.Player;

public class Utils {

	Set<Card> cardSet = new HashSet<Card>();

	public Set<Card> createCard() {
		for (int i = 0; i < 13; i++) {
			for (int j = 0; j < 4; j++) {
				Card card = new Card();
				card = new Card();
				card.setPoint(i);
				card.setVariety(j);
				// Card c = new Card(card.getPoint(), card.getVariety());
				System.out.print(card.toString() + " ");
				cardSet.add(card);
			}
		}
		System.out.println();
		return cardSet;
	}

	public Player playerRegistered() {
		Player p = new Player();
		p.SetId();
		p.setName();
		return p;
	}

	public void dealCard(Player p1, Player p2, Set<Card> cardSet) {
		/*在这里使用ForEach亦可以
		 * System.out.println(cardSet.size()); for (Card card : cardSet) {
		 * System.out.print(card.toString()+"  "); }
		 */
		int i = 1;
		p1.setCardList(new ArrayList<Card>());
		p2.setCardList(new ArrayList<Card>());
		Iterator<Card> iterator = cardSet.iterator();
		while (iterator.hasNext()) {
			if (i % 2 == 0) {
				System.out.println("玩家" + p1.getName() + "拿牌");
				// System.out.println(iterator.next().toString() + " ");
				p1.addCardList(iterator.next());
			}
			if (i % 2 == 1) {
				System.out.println("玩家" + p2.getName() + "拿牌");
				// System.out.println(iterator.next().toString() + " ");
				p2.addCardList(iterator.next());
			}
			if (i >= 4) {
				break;
			}
			i++;
		}
	}

	public void showCard(Player p) {
		System.out.println("玩家"+p.getName() + "手牌:");
		for (Card card : p.getCardList()) {
			System.out.print(card.toString() + " ");
		}
		System.out.println();
	}

	public Player pointCard(Player p1, Player p2) {
		List<Card> sum = new ArrayList<Card>();
		sum.addAll(p1.getCardList());
		sum.addAll(p2.getCardList());
		for (Card card : sum) {
			System.out.println(card.toString());
		}
		Card max = Collections.max(sum);
		Player winner = sum.indexOf(max) <= 2 ? p1 : p2;
		System.out.println("玩家"+winner.getName() + "赢");
		System.out.println("玩家"+winner.getName()+"最大的手牌为:" + max.toString());
		return winner;
	}
}

这个是items层

Card类:

package item;

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

public class Card implements Comparable<Card> {

	private String point;
	private String variety;
	private String[] p = { "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A" };
	private String[] v = { "黑桃", "红桃", "梅花", "方块" };
	public String getVariety() {
		return variety;
	}

	public void setVariety(int variety) {
		this.variety = v[variety];
	}

	public String getPoint() {
		return point;
	}

	public void setPoint(int point) {
		this.point = p[point];
	}

	public Card() {

	}

	@Override
	public String toString() {
		return this.getVariety() + this.getPoint();
	}

	@Override
	public int compareTo(Card o) {
		  List<String> point=new ArrayList<String>();  
		  List<String> variety=new ArrayList<String>();  
		  point.addAll(Arrays.asList(p));
		  variety.addAll(Arrays.asList(v));
		  int num = (point.indexOf(o.getPoint()))*4+variety.indexOf(o.getVariety());
		return num;
	}

}

Player类:

package item;

import java.util.List;
import java.util.Scanner;

public class Player {

	private String name;
	private int id;
	private List<Card> cardList;
	int count;
	Scanner in;

	public Player() {

	}

	public String getName() {
		return name;
	}

	public int getId() {
		return id;
	}

	public void setName() {
		in = new Scanner(System.in);
		System.out.println("请输入姓名");
		name = in.next();
	}

	public void SetId() {
		if (count == 3) {
			System.out.println("对不起输出次数上限");
			return;
		}
		count++;
		in = new Scanner(System.in);
		System.out.println("请输出入id");
		try {
			id = in.nextInt();
		} catch (Exception e) {
			if (count < 3)
				System.out.println("对不起,请输出数字");
			SetId();
		}
	}

	@Override
	public String toString() {
		return "Player [name=" + name + ", id=" + id + "]";
	}

	public List<Card> getCardList() {
		return cardList;
	}

	public void setCardList(List<Card> cardList) {
		this.cardList = cardList;
	}

	public void addCardList(Card c) {
		
		this.cardList.add(c);

	}

}

还有,我上传了包里有个test.java和Variety.java没用,可以删掉

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

写的太好啦!!!有个问题想问一下,Comparat类应该是跟max()方法有关,比较四种花色的大小?能详细讲解一下这块的原理吗?

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

gao634209276 提问者

那个是半成品,今天我特意回头重新写了代码.可以下过去看看http://pan.baidu.com/s/1nuLsISx
2016-04-16 回复 有任何疑惑可以回复我~
#2

gao634209276 提问者

用这个下载http://pan.baidu.com/s/1geIhiIB
2016-04-16 回复 有任何疑惑可以回复我~
#3

gao634209276 提问者

这里我今天该了代码,max是使用了compareTo()方法,主要是要理解复写这个方法..方法中的this和o不是一个对象...是两个比较对象. 我把扑克牌按大小顺序,用整数0-52依次代表,然后retrun 比较后的结果.
2016-04-16 回复 有任何疑惑可以回复我~
#4

gao634209276 提问者 回复 qq_星语_4

同点数有4个花色,每增加一点,需要留4个数字来给这个点数花色排序. 对啊,sort是验证排序规则是否生效,是否符合要求.如果你把p*4改为比4小的数你试试sort结果就知道了
2016-04-18 回复 有任何疑惑可以回复我~
查看2条回复

写的真好,你那个怎么比较大小的啊?没看太明白!把思路说一下呗,谢谢了!

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

gao634209276 提问者

我发的这个当时没完善,代码中默认排序根据List元素大小排,如果数字相同,根据设置的Comparator<Card>临时排序,在实现类中复写排序规则.. 排序规则是设置四种花色为一个有序的list,取出方法参数中的花色找到list中的index,返回index的差值.
2016-04-12 回复 有任何疑惑可以回复我~
#2

gao634209276 提问者

现在觉得这样设置一个Map不是很好..如果给这个项目中再添加功能,还需要每次手工判断把11,12,13,14换为JQKA.不如直接设置一个字符串的List...
2016-04-12 回复 有任何疑惑可以回复我~
#3

qq_搥忆迣厾沬唻_0 回复 gao634209276 提问者

哦哦,那你现在有完善的吗?
2016-04-12 回复 有任何疑惑可以回复我~
#4

gao634209276 提问者 回复 qq_搥忆迣厾沬唻_0

时间太长,代码早删了...
2016-04-12 回复 有任何疑惑可以回复我~
#5

gao634209276 提问者 回复 qq_搥忆迣厾沬唻_0

改成str类型的list我当时没编写
2016-04-12 回复 有任何疑惑可以回复我~
#6

gao634209276 提问者 回复 qq_搥忆迣厾沬唻_0

看到大家又恢复我,今天花了半天又重新做了这个小项目. 改进了很多.可以下载看看.http://pan.baidu.com/s/1nuLsISx
2016-04-16 回复 有任何疑惑可以回复我~
#7

gao634209276 提问者 回复 qq_搥忆迣厾沬唻_0

使用这个地址:http://pan.baidu.com/s/1geIhiIB
2016-04-16 回复 有任何疑惑可以回复我~
#8

gao634209276 提问者 回复 qq_搥忆迣厾沬唻_0

上面的都写的不对,这是最终版... http://pan.baidu.com/s/1hrL2SS0
2016-04-16 回复 有任何疑惑可以回复我~
查看5条回复

扑克不能有1,小改了一下,在num数组里删除1,在最后加上14,然后在hashMap映射里加上put(14,'A');发现我这编码是编的最少的。。差很多内容啊,这个就当初稿吧,明天再看看

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

举报

0/150
提交
取消

原谅我到现在才理解Comparable的compareTo方法如何使用....今天回头写代码,这么写都不对,最后又看了遍comparable才理解了 ....

我要回答 关注问题
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号