Java学习之模拟纸牌游戏,List的ArrayList,Map的HashMap,重写Collections类的sort方法对指定类进行通过特定属性排序,输入异常处理等的学习
- 首先放上测试效果图

- 设计框架

- 具体的代码实现
- 创建玩家类
public class Player implements Comparable<Player>{
int id;
String name;
List<Card> cardList;
Integer maxCard;
public Player(int id, String name){
this.id = id;
this.name = name;
this.cardList = new ArrayList<Card>();
}
public int compareTo(Player o) {
return this.maxCard.compareTo(o.maxCard);
}
}
- 创建扑克牌类
public class Card implements Comparable<Card>{
Integer id;
String value;
public Card(Integer id, String value) {
this.id = id;
this.value = value;
}
public int compareTo(Card o) {
return this.id.compareTo(o.id);
}
}
- 创建进行游戏类
public class PlayCards {
Scanner console;
List<Card> cardlist;
Map<Integer, Player> playermap;
List<Card> shufflelist;
public PlayCards(){
console = new Scanner(System.in);
cardlist = new ArrayList<Card>();
playermap = new HashMap<Integer, Player>();
shufflelist = new ArrayList<Card>();
}
//创建扑克牌的方法
public void creatCard() {
System.out.println("------创建扑克牌------");
String[] head = {"方片","梅花","红桃","黑桃"};
String[] number = {"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
int id = 0;
for (int i = 0; i < 13; i++) {
for (int j = 0; j < 4; j++) {
String tempstr = head[j] + number[i];
Card card = new Card(id++, tempstr);
cardlist.add(card);
}
}
System.out.println("------扑克牌创建成功!------");
System.out.println("*********************************************");
for (int i = 0; i < 52; i++) {
if(i % 13 == 0) {
System.out.println();
}
System.out.print(cardlist.get(i).value);
}
System.out.println("\n**********************************************");
}
//进行洗牌的方法
public void shuffle() {
Random random = new Random();
System.out.println("------开始洗牌------");
for (int i = 52; i > 0; i--) {
int tempNum = random.nextInt(i);
Card tempcard = cardlist.get(tempNum);
cardlist.remove(tempNum);
shufflelist.add(tempcard);
}
System.out.println("------洗牌结束!------");
}
//创建玩家并录入相关id与姓名的方法
public void creatPlayer() {
System.out.println("------创建玩家------");
int i = 1;
while(i < 3) {
try {
System.out.println("请输入第" + i + "位玩家的ID和姓名");
System.out.println("请输入整数ID:");
Scanner input = new Scanner(System.in);
Integer integer = input.nextInt();
Player player = playermap.get(integer);
if(player == null) {
System.out.println("请输入姓名:");
String name = console.next();
Player newPlayer = new Player(integer, name);
playermap.put(integer, newPlayer);
i++;
}else {
System.out.println("玩家ID被已占用,请重新输入!");
continue;
}
}catch(InputMismatchException e) {
System.out.println("玩家ID输入有误,请输入规定的整数");
continue;
}
}
Set<Entry<Integer, Player>> entry = playermap.entrySet();
for (Entry<Integer, Player> ey: entry) {
System.out.println("----欢迎玩家:" + ey.getValue().name);
}
}
//进行发牌给玩家的方法
public void sendCardToPyer() {
System.out.println("规定两位玩家的手牌数小于27张");
try {
System.out.println("请输入每位玩家的手牌数:");
Scanner input = new Scanner(System.in);
int cardNum = input.nextInt();
if (cardNum > 26 || cardNum < 1) {
sendCardToPyer();
}else {
System.out.println("------开始发牌------");
int k = 0;
Set<Entry<Integer, Player>> entry = playermap.entrySet();
for (int i = 0; i < cardNum; i++) {
for (Entry<Integer, Player> ey: entry) {
ey.getValue().cardList.add(shufflelist.get(k++));
System.out.println("玩家:" + ey.getValue().name + "-拿牌");
}
}
System.out.println("------发牌结束------");
}
}catch(InputMismatchException e) {
sendCardToPyer();
}
}
//两位玩家取出最大的手牌比较并决定胜负以及亮手牌的方法
public void whoIsWinner() {
Set<Entry<Integer, Player>> entry = playermap.entrySet();
List<Player> playerlist = new ArrayList<Player>();
for (Entry<Integer, Player> ey: entry) {
Collections.sort(ey.getValue().cardList);
int listsize = ey.getValue().cardList.size();
ey.getValue().maxCard = ey.getValue().cardList.get(listsize -1).id ;
playerlist.add(ey.getValue());
System.out.println("玩家:" + ey.getValue().name + "最大的手牌为:"
+ ey.getValue().cardList.get(listsize - 1).value);
}
Collections.sort(playerlist);
System.out.println("------玩家:" + playerlist.get(playerlist.size() - 1).name + "获胜!------");
System.out.println("玩家各自的手牌为:");
for (Player player: playerlist){
System.out.print(player.name + ": ");
for (Card card: player.cardList) {
System.out.print(card.value + " ");
}
System.out.println();
}
}
}
- 创建初始类
public class Initial {
public static void main(String[] args) {
Scanner input = null;
int i = 0;
while(true) {
System.out.println("按 任意数字 开始游戏");
try {
input = new Scanner(System.in);
i = input.nextInt();
break;
}catch(InputMismatchException e) {
System.out.println("请按要求输入!!!");
}
}
PlayCards playcards = new PlayCards();
playcards.creatCard();
playcards.shuffle();
playcards.creatPlayer();
playcards.sendCardToPyer();
playcards.whoIsWinner();
System.out.println("欢迎下次游戏!!!");
System.exit(0);
if (input != null) {
input.close();
input = null;
}
}
}
Java学习之模拟纸牌游戏,List的ArrayList,Map的HashMap,重写Collections类的sort方法对指定类进行通过特定属性排序,输入异常处理等的学习的更多相关文章
- Java字符串的匹配问题,String类的matches方法与Matcher类的matches方法的使用比较,Matcher类的matches()、find()和lookingAt()方法的使用比较
参考网上相关blog,对Java字符串的匹配问题进行了简单的比较和总结,主要对String类的matches方法与Matcher类的matches方法进行了比较. 对Matcher类的matches( ...
- Java练习(模拟扫雷游戏)
要为扫雷游戏布置地雷,扫雷游戏的扫雷面板可以用二维int数组表示.如某位置为地雷,则该位置用数字-1表示, 如该位置不是地雷,则暂时用数字0表示. 编写程序完成在该二维数组中随机布雷的操作,程序读入3 ...
- 在包a中编写一个类Father,具有属性:年龄(私有)、姓名(公有); 具有功能:工作(公有)、开车(公有)。 在包a中编写一个子类Son,具有属性:年龄(受保护的)、姓名; 具有功能:玩(私有)、学习(公有)。 最后在包b中编写主类Test,在主类的main方法中测试类Father与类Son。
package a; public class Father { public String name; private int age; public Father(String name) { t ...
- 使用Java语言实现,自己主动生成10个整数(1~100,求出生成数列中的最大值和最小值,不同意使用Arrays类的sort方法
这是考察主要的java基础,没啥难点,直接上代码,近期在准备面试,所以做一些基础的面试题练练手 public class Demo1 { public static void main(String[ ...
- Java-杂项:Java数组Array和集合List、Set、Map
ylbtech-Java-杂项:Java数组Array和集合List.Set.Map 1.返回顶部 1. 之前一直分不清楚java中的array,list.同时对set,map,list的用法彻底迷糊 ...
- Java类成员之方法
方法含义: 1. 方法是类或对象行为特征的抽象,用来完成某个功能操作. 2.在某些语言中也称为函数或过程. 3.将功能封装为方法的目的是简化代码,可以实现代码重用. 4.在Java里的方法不能独立存在 ...
- 装饰者模式学习:模拟咖啡馆的点单系统来剖析装饰者模式的使用 + 装饰者模式在java I/O 中的应用
通过模拟咖啡馆的点单系统来剖析装饰者模式的使用 参考:https://blog.csdn.net/gududedabai/article/details/81989196 一).传统的点单系统构建,每 ...
- 编写Java程序,模拟教练员和运动员出国比赛场景,其中运动员包括乒乓球运动员和篮球运动员。教练员包括乒乓球教练和篮球教练。为了方便出国交流,根乒乓球相关的人员都需要学习英语。
需求说明: 模拟教练员和运动员出国比赛场景,其中运动员包括乒乓球运动员和篮球运动员.教练员包括乒乓球教练和篮球教练.为了方便出国交流,根乒乓球相关的人员都需要学习英语.具体分析如下: (1)共同的属性 ...
- HDU 2209 翻纸牌游戏
翻纸牌游戏 Time Limit : 9000/3000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submiss ...
随机推荐
- Linux掉电处理
在嵌入式设备中,掉电处理一直是一项比较麻烦的工作,在具有Linux系统的设备中,系统的种种数据的处理更是增加掉电处理的难度.现在做以下几点总结,再遇到类似问题可以做个参考. 1,系统启动的处理 在系统 ...
- c++桥接模式
可以简记为pointer to implement:”指向实现的指针”. [DP]书上定义:将抽象部分与它的实现部分分离,使它们都可以独立地变化.考虑装操作系统,有多种配置的计算机,同样也有多款操作系 ...
- 修改Visual Studio项目中程序集信息默认公司名称的两种方法
这个公司名就是安装系统时注册的单位名称.可以通过修改注册表修改 Windows 系统的注册信息,方法如下:1.在开始"运行"中输入regedit,打开注册表编辑器.2.依次展开:H ...
- 写一个Windows服务
做了两个和Windows服务有关的项目了,最开始的时候没做过,不懂,现在明白了许多.需要注意的是,如果不想登录什么的,最后在添加安装程序的那里选择那个字长的右键属性,把启动方式改为local syst ...
- Windows服务时间控件怎么调试
写了timer,调试的话在构造函数里面把Elapsed方法写成null,null就可以调试了 public PSJCService() { InitializeComponent(); Getuser ...
- 修改el-table滚动条样式
<include file="Trade:header" /> <style type="text/css" media="scre ...
- 数据结构(三)串---KMP模式匹配算法之获取next数组
(一)获取模式串T的next数组值 1.回顾 我们所知道的KMP算法next数组的作用 next[j]表示当前模式串T的j下标对目标串S的i值失配时,我们应该使用模式串的下标为next[j]接着去和目 ...
- Linux 命令详解(一)export 命令
一.Windows 环境变量 1.在Windows 系统下,很多软件安装都需要配置环境变量,比如 安装 jdk ,如果不配置环境变量,在非软件安装的目录下运行javac 命令,将会报告找不到文件,类似 ...
- Extending Markov to Hidden Markov
Extending Markov to Hidden Markov a tutorial on hidden markov models, Hidden Markov Models, hidden m ...
- JMS学习(二)之ActiveMQ
1,ActiveMQ是Apache实现的基于JMS的一个消息服务器.下面记录ActiveMQ的一些基本知识. 2,ActiveMQ connectors:ActiveMQ providesconnec ...