栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java入门第三季第7章 综合实战- 简易扑克牌游戏

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java入门第三季第7章 综合实战- 简易扑克牌游戏

Reference:这位老哥的 AllenRp的手记
耗时:三天(痛苦…)

思路(Workload):

1.创建player对象,仅仅包含最基本的属性,不包含创建玩家的方法(基本属性:玩家id、玩家姓名和玩家所持有的poker集)
实际编写中,将其设置为private属性,对于调用还是不怎么习惯,尤其是考虑玩家手牌,getter()方法事实上只是返回player的手牌集合,而不需要setter()方法来设置手牌;另外,针对于player对象的equals()和toString()方法也进行了针对性的改写;

2.同样的Poker对象,仅仅针对poker的两个属性(花色 和数字)初始化了一些数组,比如对字符串"梅花,方片,红桃,黑桃"和"2,3,4,5,6,7,8,9,10,J,Q,K,A"了数组的拆分,字符串常用的方法见:String方法必知必会 改写了toString()方法;

3.创建游戏类,在游戏类中实现了很多针对于玩家和poker的设置

玩家:创建玩家列表list,针对用户输入游戏ID增加了一个Exception的报错,规定输入int型,若不是,报错提醒并回去继续接受键盘输入,同时展示玩家信息(用到player的toString改写方法)
Notice:针对报错部分,这里如果写不好,会出现一个死循环。可使用nextLine()吸收System.out.println()中的ln 换行

Poker:创建原始的扑克牌集合并且展示扑克牌(考虑到不会转化数组,就用笨办法,前n-1个输出为card+“,”,最后一个card+“]”不用加“,”), cardList就是原始的poker对象的list,这里就用到泛型<@Poker>
之后就是发牌,这时候就需要将card加入到player手中的集合(Set–无序不重复)
展示玩家发到的牌,开始游戏决出胜者,这时候set就头疼了,需要list才能排序,用到了Comparator临时比较接口。
将各玩家最大的card集合在一起,找出其中最最大,得到最最大card的索引位置,从而得到拥有最最大card的玩家的姓名

完结~~~~~~

收获的知识点:

1.私有属性的get/set
2.类的构造方法的意义,初始化(无参不写,会报错nullpointer)
3.改写方法(equals和toString)
4.List和Set的基本操作
5.Exception知识点的回顾
6.针对list中contains方法,用来判断id/姓名的重复!!就用到改写的equals()方法
7.死循环的应用,continue和break的结合
8.nextLine和next的区别
9.在另外一个类中引入其他对象,从而完成对象属性的初始化
10.遍历list
11.学会在一个方法中调用另一个方法
12.排序,学会用自定义的方法排序,poker就要两种属性,比较是有原则,使用comparator接口,重写compare方法 sort(list,comparator)

困惑

1、定义了comparator比较规则,compare(o1,o2)所返回的值为什么能决定list的排列顺序?自己该如何根据多重属性进行对象的排序?
2、在game类中定义了public的Scanner类,同时在构造方法完成了初始化,应该在整个class应该都适用,为啥在main()中直接调用,程序就无法执行,无法一劳永逸?

代码

player类:

package com.imooc.game;

import java.util.*;

public class Player {
	//创建玩家基本属性 id name 手牌
	private int playerId;
	private String playerName;
	private SetplayerCard;
	
	//玩家id需要自己输入
	public Player(int playerId,String playerName) {
		playerCard = new HashSet();//玩家手牌集合
	}
	
	public Player() {//无参构造器
		playerCard = new HashSet();//玩家手牌集合
	}
	
	public int getPlayerId() {//获取玩家Id
		return playerId;
	}
	public void setPlayerId(int playerId) {//设置玩家Id
		this.playerId = playerId;
	}
	public String getPlayerName() {//获取玩家姓名
		return playerName;
	}
	public void setPlayerName(String playerName) {//设置玩家姓名
		this.playerName = playerName;
	}
	
	public Set getPlayerCard() {//获取玩家手牌
		return playerCard;
	}
	
//	public void setPlayerCard(Set playerCard) {
//		this.playerCard = playerCard;
//	}
	

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + playerId;
		result = prime * result + ((playerName == null) ? 0 : playerName.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (!(obj instanceof Player))
			return false;
		Player other = (Player) obj;
		if (this.getPlayerId() == other.getPlayerId())//只要id相同
			return true;
		if (this.getPlayerName() == null) {
			if (other.getPlayerName() != null)
				return false;
		} else if (!this.getPlayerName().equals(other.getPlayerName()))//只要姓名相同
			return false;
		return true;
	}
	
	@Override
	public String toString() {
		return ""+playerId+"."+playerName;
	}
}

Poker类:

package com.imooc.game;
import java.util.*;

public class Poker {
	
	//花色和点数数组化
	private String baseKind = "梅花,方片,红桃,黑桃";
	private String baseNumber = "2,3,4,5,6,7,8,9,10,J,Q,K,A";
	private String[] cardKindList = baseKind.split(",");
	private String[] cardNumberList = baseNumber.split(",");
	
	private String cardKind;
	private String cardNumber;
	
	public Poker(String cardKind,String cardNumber) {
		//初始化poker对象具有的属性
		this.cardKind = cardKind;
		this.cardNumber = cardNumber;
		
	}
	public Poker() {
	
	}
	//访问属性
	public String getCardKind() {
		return cardKind;
	}
	public String getCardNumber() {
		return cardNumber;
	}

	//访问花色/数字 数组
	public String getbaseKind() {
		return baseKind;
	}
	
	public String getbaseNumber() {
		return baseNumber;
	}
	
	//访问poker集
	public String[] getCardKindList() {
		return cardKindList;
	}
	
	public String[] getCardNumberList() {
		return cardNumberList;
	}
	
	@Override
	public String toString() {
		return cardKind+cardNumber;
	}
}

主类(game)

package com.imooc.game;

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


public class cardGame {
	
	private ListplayerList;
	private ListcardList;
//	public Scanner console;//创建Scanner属性
	
	
	public cardGame() {
		this.playerList = new ArrayList();
		this.cardList = new ArrayList();
//		console = new Scanner(System.in);//初始化Scanner属性
	}
	
	
	
	
	public void creatNewPlayer(int NumberOfPlayer) throws Exception {
		System.out.println("--------创建玩家------------");
		Scanner console = new Scanner(System.in);
		for(int i=0;imaxPoker = new ArrayList();//用于存入每个玩家的最大手牌
	
	public void maxCardAndWin(int NumberOfPlayer) {
		System.out.println("---------开始游戏------------");
		for (int i=0; i sortSet = new TreeSet(new PokerComparator());
//			sortSet.addAll(pr.getPlayerCard());
			
			//转成list再排序
			ListpokerList =new ArrayList(playerList.get(i).getPlayerCard());
			Collections.sort(pokerList, new PokerComparator());
			
			System.out.println("玩家"+playerList.get(i).getPlayerName()+"最大手牌为:"+pokerList.get(pokerList.size()-1));
			maxPoker.add(i,pokerList.get(pokerList.size()-1));//i号玩家最大手牌插入maxPoker的i位置
		}
		//利用collections的max返回最大元素,再利用ArrayList的indexOf方法返回索引值
		
		
		Poker max = Collections.max(maxPoker, new PokerComparator());//比较器类
		int i = maxPoker.indexOf(max);
		System.out.println("-------Champion:"+playerList.get(i).getPlayerName()+"--------");
		
	}
	
	
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		cardGame cg = new cardGame();
		cg.creatCardListAndShuffleCard();//创建并洗牌
		System.out.println("输入玩家数量:");
		Scanner console = new Scanner(System.in);
		int NumberOfPlayer = console.nextInt();	
		System.out.println("输入各玩家持有的卡牌数量:");
		int NumberOfCard = console.nextInt();	
		cg.creatNewPlayer(NumberOfPlayer);
		cg.giveCards(NumberOfPlayer,NumberOfCard);  
		cg.maxCardAndWin(NumberOfPlayer);
		cg.showCards(NumberOfPlayer);  
		
		console.close();
		
	}

}

pokerComparator类:

package com.imooc.game;

import java.util.Comparator;

public class PokerComparator implements Comparator {

	@Override
	public int compare(Poker o1, Poker o2) {//按照花色和点色排序
		//等于0 相等;    大于0,o1比o2大;   小于0,o1比o2小
		// TODO Auto-generated method stub
		String o1_num = o1.getCardNumber();
		String o1_kind =o1.getCardKind();
		String o2_num = o2.getCardNumber();  //j q k 这种无法转化为数字
		String o2_kind =o2.getCardKind();
		Poker poker = new Poker();//利用子串在数组的位置进行排序
		if(poker.getbaseNumber().indexOf(o1_num)!=poker.getbaseNumber().indexOf(o2_num)) {//点数不等,直接比较
			return poker.getbaseNumber().indexOf(o1_num)-poker.getbaseNumber().indexOf(o2_num);
		}else {//点数相等,再比较花色(按照花色靠前大)
			return poker.getbaseKind().indexOf(o1_kind)-poker.getbaseKind().indexOf(o2_kind);
		}
	}

}
转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号