在原来题目要求的基础上,增加了人数、游戏局数的输入。写得不好,请多提意见,谢谢。
- Player类:
- Poker类
- Game类(main方法开始进行游戏)
运行效果:
提示错误并重新输入:
1.Player类
- 定义实例变量:玩家id、玩家姓名、玩家列表、玩家手牌
- 定义了两个构造方法(带参和不带参)用于初始化对象;主要方法有:设置和获取玩家Id与姓名、创建玩家、获取玩家手牌、重写的equals(供contains方法调用)、重写toString方法输出打印id和姓名。
package com.imooc.game;
import java.util.*;
public class Player{
private int playerId;//玩家id
private String playerName;//玩家姓名
private List<Player> playerList;//玩家列表
private Set<Poker> playerCard;//玩家手牌
public Player(int playerId, String playerName){//构造方法初始化变量
playerList=new ArrayList<Player>();
this.playerCard=new HashSet<Poker>();
}
public Player(){//构造方法初始化变量
playerList=new ArrayList<Player>();
this.playerCard=new HashSet<Poker>();
}
//设置玩家的ID
public void setPlayerId(int playerId){this.playerId=playerId;}
//设置玩家的姓名
public void setPlayerName(String playerName){this.playerName=playerName;}
//获取玩家姓名的方法
public String getPlayerName(){
return playerName;
}
public int getPlayerId(){//获取玩家ID的方法
return playerId;
}
public List<Player> getPlayerList() {//获取玩家列表的方法
return playerList;
}
//创建玩家的方法(传入玩家数量)
public void creatNewPlayer(int NumberOfPlayer) throws Exception {
Scanner console = new Scanner(System.in);
Player []player=new Player[NumberOfPlayer];
//定义一个Player数组存放对象的引用
int id;//定义一个成员变量id
String name;//定义一个成员变量name
for (int i = 1; i <= NumberOfPlayer; i++) {
boolean judge = true;
while (judge) {
try {
player[i-1] = new Player();
System.out.println("请输入第" + i + "个玩家的ID");
id = console.nextInt();
player[i-1].setPlayerId(id);
if (id > 0) {
if(!playerList.contains(player[i-1])){
boolean judge2 = true;
while (judge2) {
System.out.println("请输入第" + i + "个玩家的姓名");
name = console.next();
player[i - 1].setPlayerName(name);
if (!playerList.contains(player[i - 1])) {
playerList.add(player[i - 1]);
judge = false;
judge2 = false;
} else {
System.out.println("此姓名已存在!!");
continue;
}}}else{System.out.println("此ID已存在!!");}
}else{
System.out.println("请输入大于0的整数作为ID");
continue;
}} catch (Exception m) {
//m.printStackTrace();
System.out.println("请输入正确的ID(数字)");
console.nextLine();
continue;
}}}
for(Player pr:player) {
System.out.println("欢迎玩家:" + pr);
}
//System.out.println(playerList);//用于显示玩家列表
}
public Set<Poker> getPlayerCard() {//获取玩家手牌
return playerCard;
}
@Override
public boolean equals(Object obj) {//根据需要重写equals
if (this == obj)
return true;
if (this == null)
return false;
if (!(obj instanceof Player))
return false;
Player player = (Player) obj;
if(this.getPlayerId()==player.getPlayerId())
return true;
if(player.getPlayerName()!=null){
if (this.getPlayerName()!=null){
if(this.getPlayerName().equals(player.getPlayerName()))
return true;}}
else
return false;
return false;
}
@Override
public String toString() {//重写输出方法
return "ID: "+playerId+" 姓名:"+playerName;
}}
2. Poker类
- 定义实例变量:扑克牌花色、扑克牌点数、扑克牌点数数组、扑克牌花色数组、一副扑克牌List(除大小王)
- 定义了两个构造方法(带参和不带参)用于初始化对象;主要方法有:获取当前扑克牌列表、获取当前点数、获取当前花色、创建一副扑克牌、打印当前扑克牌列表、重写compare()方法和toString()方法。
package com.imooc.game;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Poker implements Comparator<Poker> {
private String cardKind;//扑克牌的花色
private String cardNumber;//扑克牌的点数
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 List<Poker> cardList;//一整个扑克牌的List(除了大小王)
public Poker(String cardKind,String cardNumber){//有参的构造方法
this.cardList=new ArrayList<Poker>();
this.cardNumber=cardNumber;
this.cardKind=cardKind;
}
public Poker(){//无参的构造方法
this.cardList=new ArrayList<Poker>();
}
public List<Poker> getCardlist() {//获取当前扑克牌列表
return cardList;
}
public String getCardNumber() {//获取当前扑克牌点数
return cardNumber;
}
public String getCardKind() {//获取当前扑克牌花色
return cardKind;
}
public void creatCardlist() {//创建一副扑克牌
System.out.println("----------创建扑克牌----------");
/*for(int i=0;cardKindList.length>i;i++){//for循环添加所有扑克牌
for(int j=0;cardNumberList.length>j;j++){
cardList.add(new Poker(cardKindList[i],cardNumberList[j]));
}}*/
for(String kind:cardKindList){//使用for each遍历花色和点数创建扑克牌
for(String num:cardNumberList){
this.cardList.add(new Poker(kind,num));
}}
System.out.println("----------创建扑克牌成功----------");
}
public void showCardList(){//打印当前扑克牌列表
int i=0;
for(Poker p:cardList) {
i++;
if(cardList.size()==i) {
System.out.println(p);
}else{
System.out.print(p + ",");
}
if(i%10==0){//每10张牌换行一次
System.out.println();
} } }
@Override
public int compare(Poker o2,Poker o1) {//按照点数和花色要求重写compare方法
String i=o1.getCardNumber();String j=o2.getCardNumber();
String k=o1.getCardKind();String p=o2.getCardKind();
if(baseNumber.indexOf(i)!=baseNumber.indexOf(j)){
return baseNumber.indexOf(i)-baseNumber.indexOf(j);
}else {
return baseKind.indexOf(k) - baseKind.indexOf(p);
}}
@Override
public String toString() {//重写,打印输出花色和点数
return cardKind+cardNumber;
}
public void shuffleCards(){//定义洗牌方法
System.out.println("-----------开始洗牌-----------");
Collections.shuffle(cardList);
System.out.println("-----------完成洗牌-----------");
}}
3. Game类(main方法开始进行游戏)
package com.imooc.game;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class Game {
private static boolean jud;//定义类变量jud
public static void main(String[]args) throws Exception {
//通过throws方法抛出异常
Player player=new Player();//创建Player对象
Poker poker=new Poker();//创建Poker对象
List<Poker>maxCard=new ArrayList<Poker>();//创建最大点数得扑克牌集合
String winner=null;//用于存储胜者
poker.creatCardlist();//通过poker对象调用其创建扑克牌方法
poker.showCardList();//打印扑克牌列表
System.out.println("-------开始游戏-------");
Scanner input=new Scanner(System.in);
int numberOfPlayer=0;//存储玩家人数
jud=true;
while (jud) {
System.out.println("请输入进行扑克游戏的人数(最多5人参加):");
try {numberOfPlayer= input.nextInt();
if(numberOfPlayer>5){//限制玩家人数在5人内
System.out.println("请输入5以内的玩家人数!!");
continue;
}else if(numberOfPlayer>1) {//限制玩家人数必须大于1
player.creatNewPlayer(numberOfPlayer);
jud = false;
}else
System.out.println("请输入大于1的整数!!");
continue;
} catch (Exception e) {//在try语句块中捕捉类型错误异常
System.out.println("请输入整数!!");
input.nextLine();//用于清除上次输入剩下的输入
}}
poker.shuffleCards();//调用Poker类的洗牌方法
int count=0;//储存游戏局数
jud=true;
while(jud){
try{
System.out.println("请输入即将进行几轮游戏(最多可进行5轮):");
count=input.nextInt();
if(count<=0){
System.out.println("请输入大于0的整数!!");
continue;
}else if(count>5){
System.out.println("请输入5以内的整数!!");
continue;}
jud=false;
}catch(Exception e){//获取异常
System.out.println("请输入正确的游戏次数(整数)!!");
input.nextLine();
}}
System.out.println("---------开始发牌---------");
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
for(int z=1;count>0; count--,z++) {
if(z>1){
System.out.println("请按下回车键开始下一轮游戏");
br.readLine();}
System.out.println("----------第"+z+"轮-----------");
for (int i = 1; i <= 2; i++) {//每个用户抽两张扑克牌
for (int j = 1; j <= numberOfPlayer; j++) {
//每个玩家按顺序逐个抽取一张扑克牌
if(player.getPlayerList().get(j - 1).getPlayerCard().size()>=2)
player.getPlayerList().get(j - 1).getPlayerCard().clear();
player.getPlayerList().get(j- 1).getPlayerCard().add(poker.getCardlist().get(0));
poker.getCardlist().remove(poker.getCardlist().get(0));
}
if ( i== 2 ) {//当i=2时,即每个玩家都抽取了两张扑克牌
for (Player pr : player.getPlayerList()) {
//for each遍历并排序玩家的牌
List <Poker>pokerList=new ArrayList<Poker>(pr.getPlayerCard());
Collections.sort(pokerList, new Poker());//为每个玩家的手牌排序
System.out.println(pr.getPlayerName() + "的手牌为:" +
pr.getPlayerCard()+",其中最大的是"+pokerList.get(0));
maxCard.add(pokerList.get(0));//把每个玩家最大的牌添加到maxCard集合中
Collections.sort(maxCard,new Poker());//每个玩家最大手牌的集合maxCard排序
if(pr.getPlayerCard().contains(maxCard.get(0)))
//遍历玩家看看最大的手牌是哪位玩家的
winner =pr.getPlayerName();
}
System.out.println("----------完成发牌----------");
System.out.println("-----------开始游戏----------");
System.out.println("请按回车键开始进行大小对比");
br.readLine();
System.out.println("最大的牌是:"+maxCard.get(0)+"获胜者为:"+winner);
maxCard.clear();
System.out.println("-----------本轮结束----------");
} else {
continue;
}}}
input.close();//关闭输入
System.out.println("-----------游戏结束----------");
}}
点击查看更多内容
27人点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦