===============共四个类=======================
package cardGame;
/**
* --------------------游戏需求说明----------------------
* 1.创建一副扑克牌,包括四种花色: 黑桃,红桃,梅花,方片, 十三种点数:2-10,J,Q,K,A,不考虑大小王.
* 2.创建玩家,玩家至少有ID,姓名,手牌等属性,手牌为扑克牌的集合.
* 3.洗牌,将之前创建的"一副扑克牌"打乱顺序.
* 4.发牌, 将洗牌之后的扑克牌集合,从第一张开始,发给两名玩家,按照一人一张的方式,每人发两张.
* 5.比较玩家手里的卡牌
* 规则为:取两人各自手中点数最大的牌进行比较,点数大的赢.
* 若两人各自的点数最大的牌相等,则再按花色比较. (黑桃>红桃>梅花>方块)
* */
public class Start {
public static void main(String[] args) {
ShuffleAllCards Shuffle = new ShuffleAllCards();
Shuffle.CardsCreate();
Shuffle.ShuffleCards();
LetUsPlay began = new LetUsPlay();
began.CreatePlayers();
began.GiveCards();
began.CompareCards();
}
}
package cardGame;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ShuffleAllCards {
//cards应该是不变的, 所以要static,要不然调用的时候创建的是新的.size为0的.
public static List<String> cards;
public static List<String> oldCards;
public String[] number = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
public String[] color = {"方块","梅花","红桃","黑桃"};
public ShuffleAllCards(){
ShuffleAllCards.cards = new ArrayList<String>();
ShuffleAllCards.oldCards = new ArrayList<String>();
}
/**
* 生成所有52张牌
* */
public void CardsCreate(){
System.out.println("-----------游戏开始!-----------");
//通过遍历得到所有52张牌.
//按照特定的顺序排序,方块A, 梅花A, 红桃A, 黑桃A, 方块2, 梅花2, 红桃2, 黑桃2, .....
//保证0-51的牌是从小到大排序的.
for(int i=0;i<number.length;i++){
for (int j = 0; j < color.length; j++) {
//第一个是方块A, 然后 梅花A,
String OneCard = color[j]+number[i];
//每一次都加到List里,list是有序的.
cards.add(OneCard);
oldCards.add(OneCard);
}
}
if(cards.size() == 52){
System.out.println(cards);
System.out.println("-----------生成扑克牌成功-------");
}
}
/**
* 打乱所有52张牌的顺序
* */
public void ShuffleCards(){
System.out.println("-----------开始洗牌-----------");
Collections.shuffle(cards);
System.out.println();
System.out.println("-----------洗牌结束-----------");
}
}
package cardGame;
import java.util.ArrayList;
import java.util.List;
/**
* 玩家类,有ID/name/手牌
* 其中手牌来着ShuffleAllCards类.
* */
public class Players {
public int ID;
public String name;
public List<String> HandCards;
public Players() {
}
//实例化属性
public Players(int ID,String name) {
this.ID = ID;
this.name = name;
//不能直接实例化List,因为set是一个接口.
this.HandCards = new ArrayList<String>();
}
public Players(int ID,String name,List<String> HandCard){
this.ID = ID;
this.name = name;
//不能直接实例化List,因为set是一个接口.
this.HandCards = new ArrayList<String>();
}
}
package cardGame;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
public class LetUsPlay {
Scanner console = new Scanner(System.in);
//定义一个玩家List
public List<Players> players;
public LetUsPlay() {
//初始化玩家List
players = new ArrayList<Players>();
}
/**
* 创建玩家方法
* */
public void CreatePlayers(){
System.out.println("-----------登记玩家信息-----------");
System.out.println("一共有几位玩家呢?");
int playerCounter = console.nextInt();
for(int i=0;i<playerCounter;i++){
try{
//确定一共有几个玩家
System.out.println("请输入第"+(i+1)+"位玩家ID: ");
int playerId = console.nextInt();
System.out.println("请输入第"+(i+1)+"位玩家姓名: ");
String playerName = console.next();
Players player = new Players(playerId,playerName);
players.add(player);
}catch(InputMismatchException ex){
System.out.println("---请输入整数类型的ID!---");
console.next();
i--;
continue;
}
}
}
/**
* 为玩家发牌,之前扑克牌已经打乱顺序了
* */
public void GiveCards(){
//共有多少个玩家,就循环多少次.比方5个玩家
for(int i=0;i<players.size();i++){
//先给每个玩家发第一张牌, 发的是1-5张牌
players.get(i).HandCards.add(ShuffleAllCards.cards.get(i));
//再发第二张牌,发的是6-10张牌,第6张牌给第1个玩家.
players.get(i).HandCards.add(ShuffleAllCards.cards.get(i+players.size()));
}
}
/**
* 比较玩家手里的卡牌
* 规则为:取两人各自手中点数最大的牌进行比较,点数大的赢.
* 若两人各自的点数最大的牌相等,则再按花色比较.
* (黑桃>红桃>梅花>方块) 方块A, 黑桃Q, 黑桃6, 梅花3,
* */
public void CompareCards(){
//先创建一个Map用来存放每个玩家手牌里较大的那一张在oldCards中的下标和对应的玩家信息.
Map<Integer,Players> theBiggerOne = new HashMap<Integer, Players>();
//把玩家自己手中的两张牌中大的那张放到theBiggerOne集合中
for(int i=0;i<players.size();i++){
//每个玩家的手里的第一张和第二张牌
String firstCard = players.get(i).HandCards.get(0);
String secondCard = players.get(i).HandCards.get(1);
//集合oldCards是按大小排序的,cards是打乱顺序的,
//玩家分配到了打乱顺序后的牌(firstCard,secondCard),如方块5,接着找到方块5在oldCards中的位置,
int first = ShuffleAllCards.oldCards.indexOf(firstCard);
int second = ShuffleAllCards.oldCards.indexOf(secondCard);
//位置即代表大小, 比较位置下标即可.
//先比较每个玩家自己手里的两张牌,把大的那张放到theBiggerOne集合中.
if(first < second){
theBiggerOne.put(second, players.get(i));
}else if(first > second){
theBiggerOne.put(first,players.get(i));
}else if(first == second){
System.out.println("不可能, 玩家 "+players.get(i).ID +" 的两张手牌的下标一样");
}
}
//通过KeySet方法,返回Map中的所有"键"的Set集合.即所有较大卡牌的下标集合.
Set<Integer> set = theBiggerOne.keySet();
//为了比较出最大的那个下标(key值),先变成Array,
Object[] obj = set.toArray();
//再排序, 从大到小
Arrays.sort(obj);
//所有手牌中最大的那一张在oldCards中的下标
Integer biggestCardNumber = (Integer) obj[obj.length - 1];
//取得了某个键所对应的value值,即取得拥有最大手牌的对应的玩家对象.
Players winner = theBiggerOne.get(biggestCardNumber);
//根据oldCards下标取得最大的卡牌名称,如"红桃5"
String biggestCardName = ShuffleAllCards.oldCards.get(biggestCardNumber);
//输出游戏结果
System.out.println("-----------结果公布!-----------");
System.out.println(winner.ID+"号玩家 "+winner.name+" 赢得游戏,最大手牌为 "+biggestCardName);
System.out.println("是否查看所有玩家的所有卡牌? (Y/N)");
String YorN = console.next();
System.out.println(YorN);
//equals是值,==是地址.
if(YorN.equals("Y") ){
//遍历出所有玩家,及其所拥有的所有两张手牌
//有多少玩家,循环多少次.
System.out.println("所有玩家手牌如下: ");
//getKey(theBiggerOne,players.get(i))是调用getkey方法,返回的较大手牌的下标.
//ShuffleAllCards.oldCards.get(getKey(theBiggerOne,players.get(i))),取得下标对应的名称.
for(int i=0;i<players.size();i++){
System.out.println(players.get(i).ID +"号玩家 "+ players.get(i).name+"的手牌为: "+
players.get(i).HandCards.get(0)+" 和 "+players.get(i).HandCards.get(1)+
" 其中较大的手牌为:"+
ShuffleAllCards.oldCards.get(getKey(theBiggerOne,players.get(i))));
}
}else if(YorN.equals("N") ){
System.out.println("-----------游戏结束~~-----------");
}else{
System.out.println("请输入Y或N");
}
}
/**
* 根据map的value获取map的key,
* 传入整个map集合(theBiggerOne)和value值(players对象), 返回value对应的key值(较大手牌的下标)
* (下面的方法只返回一个,返回多个的见博客:map集合根据value找key(一个key或多个key))
* ===================================================
* hashmap中key值是唯一的,但value是不唯一的
* 所以是没有办法通过像get(key)取value值一样直接取key的
* 一定要这么做的话也可以,但是要注意同一个value可能返回多个key.(这里肯定是一个)
* */
public static Integer getKey(Map<Integer,Players> map,Players players2){
Integer key = 0;
//Map,HashMap并没有实现Iteratable接口.不能用于增强for循环.
for(Integer getKey: map.keySet()){
if(map.get(getKey).equals(players2)){
key = getKey;
}
}
return key;
}
}
=================以下是错误的思路===============================
package cardGame;
/**
* 脑洞的错误思路
* */
public class Temp {
// //先创建一个list用来存放每个玩家手牌里较大的那一张.
// List<String> theBigOne = new ArrayList<String>();
// //先比较每个玩家自己手中的两张卡牌,找出一张较大的.
// for(int i=0;i<players.size();i++){
// //每个玩家的手里的第一张和第二张牌
// String firstCard = players.get(i).HandCards.get(0);
// String SecondCard = players.get(i).HandCards.get(1);
// //取得每个玩家两张手牌的点数
// String FirstCardPoint = firstCard.substring(2, firstCard.length());
// String SecondCardPoint = SecondCard.substring(2, SecondCard.length());
// //取得每个玩家两张手牌的花色
// String FirstCardColor = firstCard.substring(0,2);
// String SecondCardColor = SecondCard.substring(0,2);
// //equals比较的是值,==比较的是地址,switch方法在jdk1.6中不能传入String类型
// //start 把点数中的A,j,Q,K转成1,11,12,13,然后才能比较大小.
// int FirstCardPoint1 = 0,SecondCardPoint1 = 0;
// if(FirstCardPoint=="A" || SecondCardPoint=="A"){
// FirstCardPoint1= 1; SecondCardPoint1 = 1;
// }
// if(FirstCardPoint=="J" || SecondCardPoint=="J"){
// FirstCardPoint1= 11; SecondCardPoint1 = 11;
// }
// if(FirstCardPoint=="Q" || SecondCardPoint=="Q"){
// FirstCardPoint1= 12; SecondCardPoint1 = 12;
// }
// if(FirstCardPoint=="K" || SecondCardPoint=="K"){
// FirstCardPoint1= 13; SecondCardPoint1 = 13;
// }
// //end 把点数中的A,j,Q,K转成1,11,12,13,然后才能比较大小.
// //start 把花色中的黑桃>红桃>梅花>方块 转成14,15,16,17,然后才能比较大小.
// int FirstCardColor1 =0 ,SecondCardColor1 = 0;
// if(FirstCardColor=="黑桃" || SecondCardColor=="黑桃"){
// FirstCardColor1= 17; SecondCardColor1 = 17;
// }
// if(FirstCardColor=="红桃" || SecondCardColor=="红桃"){
// FirstCardColor1= 16; SecondCardColor1 = 16;
// }
// if(FirstCardColor=="梅花" || SecondCardColor=="梅花"){
// FirstCardColor1= 15; SecondCardColor1 = 15;
// }
// if(FirstCardColor=="方块" || SecondCardColor=="方块"){
// FirstCardColor1= 14; SecondCardColor1 = 14;
// }
// //end 把花色中的黑桃>红桃>梅花>方块转成14,15,16,17,然后才能比较大小.
// //start 比较每个玩家两张手牌的点数的大小,较大的放到新的theBigOne的list里.
// if(FirstCardPoint1 > SecondCardPoint1 || Integer.parseInt(FirstCardPoint) > Integer.parseInt(SecondCardPoint)){
// theBigOne.add(firstCard);
// }
// else if(FirstCardPoint1 < SecondCardPoint1 || Integer.parseInt(FirstCardPoint) < Integer.parseInt(SecondCardPoint)){
// theBigOne.add(SecondCard);
// }
// else if(FirstCardPoint1 == SecondCardPoint1 || Integer.parseInt(FirstCardPoint) == Integer.parseInt(SecondCardPoint)){
// //点数相同,比较花色
// if(FirstCardColor1 > SecondCardColor1){
// theBigOne.add(firstCard);
// }
// else if(FirstCardColor1 < SecondCardColor1){
// theBigOne.add(SecondCard);
// }
// else if(FirstCardColor1 == SecondCardColor1){
// System.out.println("不可能!两个人抽到相同的牌了");
// }
// }
// //end 比较每个玩家两张手牌的点数的大小,较大的放到新的theBigOne的list里.
//
// }
// for (String string : theBigOne) {
// System.out.println(string);
// }
}