首页 > 开发 > JAVA > 正文

Java入门第三季项目实战——扑克游戏

2016-05-18 18:53:05  来源:慕课网
  package com.imooc;
  /**
  创建扑克牌类 --Card
*/
public class Card implements Comparable<Card>
{
private int color;
private int number;
  /**
取得扑克牌颜色
*/
public int getColor()
{
return color;
}
/**设置扑克牌颜色
*/
public void setColor(int color)
{
this.color = color;
}
/**取得扑克牌数字
*/
public int getNumber()
{
return number;
}
/**设置扑克牌颜色
*/
public void setNumber(int number)
{
this.number = number;
}  /**
无参数构造函数
*/
public Card()
{
}  /**
有参数构造函数color :颜色number: 数字
*/
public Card(int color, int number)
{
this.color = color;
this.number = number;
}  /**
  打印输出时, 重写 toString() 方法
*/
@Override
public String toString()
{
String colorString = "";
String numberString = "";
  // 颜色字符
switch(color)
{
case 0:
colorString = "黑桃"; //"♠
break;
case 13:
colorString = "红桃"; // "♥"
break;
case 26:
colorString = "梅花"; // "♣"
break;
case 39:
colorString = "方片"; // "♦"
break;
}
  // 数字字符
switch (number)
{
case 11:
numberString = "J";
break;
case 12:
numberString = "Q";
break;
case 13:
numberString = "K";
break;
case 14:
numberString = "A";
break;
default:
numberString = number + "";
break;
}
  return colorString + numberString;
}
  /**
Override create hashCode
/
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime result + color;
result = prime * result + number;
return result;
}  /**
Override create equals
*/
@Override
public boolean equals(Object obj)
{
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof Card))
return false;
Card other = (Card) obj;
if (color != other.color)
return false;
if (number != other.number)
return false;
return true;
}  /**
Override create comparator
*/
@Override
public int compareTo(Card o)
{
if(this.number > o.number)
return 1;
else if(this.number < o.number)
return -1;
else if(this.color > o.color)
return 1;
else if(this.color < o.color)
return -1;
else
return 0;
}
}  package com.imooc;
  import java.util.ArrayList;
  /**
  创建玩家类---Player
*/
public class Player
{
private int id;
private String name;
public ArrayList<Card>handCards = new ArrayList<Card>();
  /**
取得玩家 ID
*/
public int getId()
{
return id;
}
/**设置玩家 ID
*/
public void setId(int id)
{
this.id = id;
}
/**取得玩家姓名
*/
public String getName()
{
return name;
}
/**设置玩家姓名
*/
public void setName(String name)
{
this.name = name;
}  /**
有参构造函数@param id : 玩家ID编号@param name :玩家姓名
*/
public Player(int id, String name)
{
this.id = id;
this.name = name;
}  /**
Override hashCode()
/
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime result + id;
return result;
}  /**
Override equals()
*/
@Override
public boolean equals(Object obj)
{
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof Player))
return false;
Player other = (Player) obj;
if (id != other.id)
return false;
return true;
}  /**
Override toString()
*/
@Override
public String toString()
{
return "ID:" + id + ", name:" + name;
}
}  package com.imooc;
  import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
  /**
  实现一个简单的扑克牌游戏点数玩法
*/
public class CardsPlay
{
private static Scanner sn = new Scanner(System.in); //创建一个静态用户输入Scanner对象
private static ArrayList<Card> cards = new ArrayList<Card>(); //创建一个静态扑克牌泛型集合列表
private static ArrayList<Player> players = new ArrayList<Player>(); //创建一个静态玩家泛型集合列表
  /**
  创建至少 1 副扑克牌
*/
private void createCards()
{
System.out.println("-------------------------创建扑克牌-------------------------");
  int count;
do
{
System.out.print("请输入需要扑克牌的副数(至少一副): ");
count = sn.nextInt();
}
while (count <=0);
  // 根据用户输入的扑克牌多少副数量来创建扑克牌集合
for(int i=0; i< count; i++)
{
// 一副牌有52张
for(int j=0; j<52; j++)
{
//0/3 =0, 1 / 3=0, 2 / 3=0, 3 / 3=1
//0%3 =0, 1 % 3=1, 2 % 3=2, 3 % 3=0
cards.add(new Card(j / 13 * 13, j % 13 + 2));
}
}
  System.out.println(cards); //打印输出时用到 Card 类中的 toString() 重写方法
System.out.println("-------------------------扑克牌创建成功-------------------------");
}
  /**
  创建至少两名玩家,包含 id 和 名称
*/
private void createPayers()
{
System.out.println("-------------------------创建玩家-------------------------");
// 取得用户设定的玩家数量
int count ;
do
{
System.out.print("输入玩家数量(至少2个玩家):");
count = sn.nextInt();
}
while(count < 1);
  for(int i= 0; i< count; i++)
{
System.out.println("请输入第" + (i + 1) + "玩家的ID和姓名:");// 玩家IDint id;do{ System.out.print("输入ID(1~" + count + "):"); id= sn.nextInt();}while(id<1 || id>count || players.contains(new Player (id,"")));// 玩家姓名System.out.print("输入姓名:");String playerName = sn.next();players.add(new Player(id, playerName));  }
  for(Player player : players)
{
System.out.println("-------欢迎玩家:" + player.getName());
}
}
  /**
洗牌,将扑克牌打乱顺序
*/
private void shuffleCards()
{
System.out.println("-------------------------开始洗牌-------------------------");
Collections.shuffle(cards);
System.out.println("-------------------------洗牌完成-------------------------");
}  /**
  发牌,一人一张的方式发牌
*/
private void getHandCards()
{
System.out.println("-------------------------开始发牌-------------------------");
int countMax;
do
{
System.out.print("输入每个玩家最多抓取几张牌(至少一张):");
countMax = sn.nextInt();
}
while(countMax < 1);
  for(int i =0;i < cards.size(); i++)
{
//0%3 =0, 1 % 3=1, 2 % 3=2, 3 % 3=0
Player player = players.get((i % players.size()));
if(player.handCards.size() >= countMax)
{
break;
}
player.handCards.add(cards.get(i));
System.out.println("玩家:" + player.getName() + "-拿牌");
}
System.out.println("-------------------------发牌结束-------------------------");
}
  /**
  游戏开始,取各自手中最大点数,谁大谁赢
*/
private void playGame()
{
System.out.println("-------------------------开始游戏-------------------------");
  // 将玩家各自手中的牌按从大到小排序
ArrayList<Card> maxHandList = new ArrayList<Card>();
for(Player player : players)
{
Collections.sort(player.handCards, Collections.reverseOrder());//从大->小排序
maxHandList.add(player.handCards.get(0));
System.out.println("玩家:" + player.getName() + "最大手牌为:" + player.handCards.get(0));
}
// 收集所有玩家手中最大点数比较确认谁获胜
ArrayList<Player> maxPlayer = new ArrayList<Player>();
Collections.sort(maxHandList, Collections.reverseOrder());//从大->小排序
for(Player player : players)
{
if(player.handCards.get(0).equals(maxHandList.get(0)))
{
maxPlayer.add(player);
}
}
  // 输出获胜玩家
if(maxPlayer.size() ==1)
{
System.out.println("-------------------------玩家:" + maxPlayer.get(0).getName() + "获胜-------------------------");
}
else if(maxPlayer.size() > 1)
{
String strPlayer ="";
for(int i =0 ; i< maxPlayer.size(); i++)
{
strPlayer = strPlayer + maxPlayer.get(i).getName() + " ";
}
System.out.println("-------------------------玩家:" + strPlayer + "获胜-------------------------");
}
  // 输出各玩家手中的牌
System.out.println("玩家各自的手牌为:");
for(Player player : players)
{
System.out.println(player.getName() + ":" + player.handCards);
}
}
  /**
主要有以下几种方法完成游戏1.创建至少 1 副扑克牌2.创建至少两名玩家,包含 id 和 名称3.洗牌,将扑克牌打乱顺序,用到 Collections.shuffle(List) 方法 4.发牌,一人一张的方式发牌  5.游戏开始,取各自手中最大点数,谁大谁赢
*/
public static void main(String[] args)
{
CardsPlay cplay = new CardsPlay();
  // 创建至少 1 副扑克牌, 一副牌52
cplay.createCards();
// 创建至少两名玩家,包含 id 和 名称
cplay.createPayers();
  if(cards.isEmpty())
{
System.out.println("扑克牌数量为空, 无法完成发牌, 请检查程序!");
return;
}
  if(players.isEmpty())
{
System.out.println("玩家人数为空, 无法完成发牌, 请检查程序!");
return;
}
  // 洗牌,将扑克牌打乱顺序
cplay.shuffleCards();
// 发牌,一人一张的方式发牌
cplay.getHandCards();
// 游戏开始,取各自手中最大点数,谁大谁赢
cplay.playGame();
}
}