辞掉工作在家认真学习Java的我,查阅了很多资料后去imooc把Java入门一二三季全部刷了一遍,今天做完了最后一个demo,做一个小的分享:
题目:*
做一个简单的扑克牌比较小游戏,创建一副有序的扑克牌,打乱顺序后分发给两个玩家,然后去比较两个玩家的牌面大小,大的获胜并输出。
解题思路:
1、由题目咱们知道要创建2个不同的对象,分别是扑克牌、玩家;
2、要进行的操作,生成一副扑克牌>打乱顺序(洗牌)>创建玩家>发牌>比较;
3、因为目前来说个人才学习到集合也就是ArrayList,Set,Map所以考虑用集合框架来实现;(个人是初学所以一些命名和代码写的不是很规范,还请各位看官见谅,后期我会慢慢优化)
开始编写代码:
**
1、创建扑克牌类
**
public class PuKe implements Comparable<PuKe>{
private String cardName;//牌的名字
private String color;//花色
private String cardNum;//牌面
public String getCardNum() {
return cardNum;
}
public void setCardNum(String cardNum) {
this.cardNum = cardNum;
}
public String getCardName() {
return cardName;
}
public void setCardName(String cardName) {
this.cardName = cardName;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public PuKe() {
this.cardName = cardName;
this.color = color;
this.cardNum = cardNum;
}
public PuKe(String color,String cardNum) {
this.cardName = color + cardNum;
this.color = color;
this.cardNum = cardNum;
}
}
这边我的想法是每张牌都会有花色跟牌面两个比较重要的组成,而牌的名字就是由两者结合所以设定了3个属性;
2、创建玩家类
package com.moro;
import java.util.Collection;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
/**
* @outhor moro
* @create 2020/3/23 -14:39
*/
public class Player {
private int playerId;//玩家ID
private String playerName;//玩家姓名
private Set<PuKe> playerCards;//玩家手牌
public Player(){
this.playerCards = new HashSet<PuKe>();
}
public Player(int playerId, String playerName, PuKe newPlayerCards) {
this.playerId = playerId;
this.playerName = playerName;
this.playerCards = new HashSet<PuKe>();
this.playerCards.add(newPlayerCards);
}
public Player(PuKe newPlayerCards) {
this.playerCards = new HashSet<PuKe>();
this.playerCards.add(newPlayerCards);
}
public Player(int playerId, String playerName) {
this.playerId = playerId;
this.playerName = playerName;
this.playerCards = new HashSet<PuKe>();
}
public int getPlayerId() {
return playerId;
}
public void setPlayerId(int playerId) {
this.playerId = playerId;
}
public String getPlayerName() {
return playerName;
}
public void setPlayerName(String playerName) {
this.playerName = playerName;
}
public Set<PuKe> getPlayerCards() {
return playerCards;
}
public void setPlayerCards(PuKe newPlayerCards) {
this.playerCards.add(newPlayerCards);
}
@Override
public boolean equals(Object o) {
if (this == o) {return true;}
if (!(o instanceof Player)) {return false;}
Player player = (Player) o;
return getPlayerId() == player.getPlayerId() &&
Objects.equals(getPlayerName(), player.getPlayerName()) &&
Objects.equals(getPlayerCards(), player.getPlayerCards());
}
@Override
public int hashCode() {
return Objects.hash(getPlayerId(), getPlayerName(), getPlayerCards());
}
}
这里有一个点要注意,就是Set的初始化,一定要初始化,不然会报空指针异常,这个问题我在后面写给玩家发牌的时候因为没有初始化所以一直报错
3、首先我们创建扑克牌
package com.moro;
import java.util.ArrayList;
/**
* @outhor moro
* @create 2020/3/23 -11:38
*/
public class CreatPuke {
private ArrayList<PuKe> puKes;
public ArrayList<PuKe> getPuKes() {
return puKes;
}
public void setPuKes(ArrayList<PuKe> puKes) {
this.puKes = puKes;
}
public CreatPuke() {
this.puKes = new ArrayList<PuKe>();
}
private String[] colors = {"黑桃","红桃","方块","梅花"};
private String[] nums = new String[14];
public ArrayList<PuKe> creat(){
for (int i = 0; i < 4; i++) {
for (int j = 1; j < 14; j++) {
if (j <= 9){
nums[j] = String.valueOf(j+1);//生成数字牌面
puKes.add(new PuKe(colors[i],nums[j]));
}
if (j > 9){
switch (j){
case 10 :nums[j] = "J";break;//生成字母牌面
case 11 :nums[j] = "Q";break;
case 12 :nums[j] = "K";break;
case 13 :nums[j] = "A";break;
default:break;
}
puKes.add(new PuKe(colors[i],nums[j]));
}
}
}
System.out.println("创建成功");
pukeList();
return puKes;
}
//遍历牌
private void pukeList(){
System.out.print("生成的牌为:[");
for (PuKe pk: puKes
) {
System.out.print(pk.getCardName()+",");
}
System.out.println("]");
}
}
我是用了循环的方式,可能各位有更加简便的方法,以我目前的功底就只能这样了,然后我们随机打乱扑克牌
4、洗牌
package com.moro;
import java.util.*;
/**
* @outhor moro
* @create 2020/3/23 -14:18
*/
public class ShuffleCards {
public ArrayList<PuKe> shuffle(ArrayList<PuKe> pukes){
System.out.println("--------------开始洗牌-------------");
//随机打乱牌
Collections.shuffle(pukes);
System.out.println("--------------洗牌后-------------");
return pukes;
}
}
使用了Collections.shuffle方法,随机打乱,我看到有很多人自己写过很多随机打乱list的方法,也研究了一下,主要的流派还是通过随机数去弄的,我为了方便就没有去琢磨;
5、创建玩家
package com.moro;
import java.util.*;
/**
* @outhor moro
* @create 2020/3/23 -14:59
*/
public class CreatPlayers {
private Map<Integer,Player> playerMap;
private Scanner sc = new Scanner(System.in);
private int count = 1;//玩家数量控制及循环控制变量
public CreatPlayers(){
this.playerMap = new HashMap<Integer,Player>();
}
public Map<Integer, Player> getPlayerMap() {
return playerMap;
}
//添加玩家
public Map<Integer,Player> addPlayer(){
//保存输入的玩家编号
int playerId;
//保存输入的玩家姓名
String name;
//添加玩家
do{
System.out.println("请输入"+ count +"号玩家ID");
playerId = sc.nextInt();
//保证玩家的唯一编号
if (playerMap.get(playerId) == null){
System.out.println("请输入"+ count +"姓名");
name = sc.next();
Player player = new Player(playerId,name);
playerMap.put(playerId,player);
count ++;
}else {
System.out.println("玩家已存在");
continue;
}
}while (count <= 2);
return playerMap;
}
}
添加玩家时要注意,因为用的Map集合里面包含的是有playerCards(用户的手牌),但是在创建玩家的时候没有添加用户手牌,所以在Player内需要为这边设计一个只添加玩家编号和玩家姓名的方法;
6、发牌
发牌,就是把洗好的牌依次发给玩家
package com.moro;
import java.util.ArrayList;
import java.util.Map;
import java.util.Set;
/**
* @outhor moro
* @create 2020/3/23 -14:44
*/
public class DealCards {
private ArrayList<PuKe> puKes;
private int cardNum = 0;//统计牌的数量
public Map<Integer, Player> dealCards(ArrayList<PuKe> cards, int count, Map<Integer, Player> player){
//count控制发牌的轮次
do{
//控制发牌的人数
for (int i = 1; i <= player.size() ; i++) {
System.out.println("玩家"+ player.get(i).getPlayerName() +"摸牌:");
//把打乱的牌转为list进行摸牌
puKes = new ArrayList<PuKe>(cards);
//依次取出牌
PuKe playerCard = (puKes.get(cardNum));
//把牌给玩家
player.get(i).setPlayerCards(playerCard);
//计数
cardNum++;
//发几轮
count--;
System.out.println(playerCard.getCardName());
}
}while (count >= 0 && cardNum <= puKes.size());
System.out.println("------------摸完了----------");
return player;
}
}
7、比较
直接使用Comparable,因为需要比较的是Puke,所以让PuKe实现Comparable,然后重写compareTo方法
@Override
public int compareTo(PuKe o) {
return this.cardNum.charAt(0) - o.getCardNum().charAt(0) ;
}
然后是比较牌面的实现
package com.moro;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Map;
import java.util.Set;
/**
* @outhor moro
* @create 2020/3/24 -15:59
*/
public class CardComparatorTest {
public void cardComparaTO(Map<Integer, Player> player) {
for (int i = 1;i <= player.size();i++){
Collections.sort(new ArrayList<PuKe>(player.get(i).getPlayerCards()));
System.out.println(player.get(i).getPlayerName()+"最大的手牌为"
+new ArrayList<PuKe>(player.get(i).getPlayerCards())
.get(new ArrayList<PuKe>(player.get(i).getPlayerCards()).size()-1).getCardName());
}
comparaTo(player);
}
public void comparaTo(Map<Integer, Player> player){
if(new ArrayList<PuKe>(player.get(1).getPlayerCards()).get(1)
.compareTo(new ArrayList<PuKe>(player.get(2).getPlayerCards()).get(1)) > 0){
System.out.println(player.get(1).getPlayerName()+"获胜,最大手牌为:"
+new ArrayList<PuKe>(player.get(1).getPlayerCards()).get(1).getCardName());
}else if(new ArrayList<PuKe>(player.get(1).getPlayerCards()).get(1)
.compareTo(new ArrayList<PuKe>(player.get(2).getPlayerCards()).get(1)) < 0){
System.out.println(player.get(2).getPlayerName()+"获胜,最大手牌为:"
+new ArrayList<PuKe>(player.get(2).getPlayerCards()).get(1).getCardName());
}else {
System.out.println("平局");
}
System.out.println("对局详情--------------------");
for (int i = 1;i <= player.size();i++){
System.out.println(player.get(i).getPlayerName()+"玩家全部手牌为:");
for (PuKe pk:new ArrayList<PuKe>(player.get(i).getPlayerCards())
) {
System.out.println(pk.getCardName());
}
}
}
}
这个我为了理解集合的各种方法,所以就少写了些中间变量,看这比较复杂,但是都是一些存和取的操作
8、测试类
package com.moro;
import java.util.ArrayList;
import java.util.Map;
/**
* @outhor moro
* @create 2020/3/23 -11:37
*/
public class Initail {
public static void main(String[] args) {
CreatPuke ck = new CreatPuke();
ShuffleCards sc = new ShuffleCards();
DealCards dl = new DealCards();
CreatPlayers ap = new CreatPlayers();
CardComparatorTest cc = new CardComparatorTest();
ArrayList<PuKe> puKes;
Map<Integer , Player> player;
System.out.println("-------生成一副扑克牌--------");
puKes = ck.creat();//创建好的牌
puKes = sc.shuffle(puKes);//洗好的牌
System.out.println("-------生成玩家--------");
player = ap.addPlayer();
System.out.println("-------------摸牌--------");
player = dl.dealCards(puKes,2,player);
System.out.println("-------------比较---------");
cc.cardComparaTO(player);
}
}
好了,做完这个demo,我要开始进入下一阶段的学习了