手记

Java第三季,扑克牌游戏

写了一天,中途遇到种种问题,其中数组越界困扰了半天,总的来说算是对第三季的一个总结了,接下来要开始看I/O流还有MySQL了。

主函数类
package cardsgame;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

/**游戏功能:
 *           1、创建一副牌 addCard
 *           2、洗牌 shuffleCard
 *           3、创建玩家 createPlayer
 *           4、比较手牌大小 compareCard
 */

public class PlayGame {
    //用来存放创建好的牌的List
    public List<Cards> cardsList;
    //用来存放创建好的玩家的Map
    public Map<Integer, Player> playerMap; 
    //定义全局变量
    public static int player1;
    public static int player2; 
    private Scanner console; 

    public PlayGame() {
        this.cardsList = new ArrayList<Cards>();
        this.playerMap = new HashMap<Integer, Player>();
        console = new Scanner(System.in);   
    }

    /**
     * 创建一副扑克牌addCard,除去大小王,共计52张。
     * 先创建一个花色数组,然后创建一个点数数组。
     * 通过for双重循环生成带有花色和点数的Poker对象
     * 将Poker添加到pokerList中去,创建完成。
     * 然后进行验牌,将创建好的牌进行打印输出,防止出老千^_^
     */
    public void addCard() {
        String[] type = {"", "", "", ""};
        String[] nums = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"};
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j <13; j++) {
                Cards card = new Cards(type[i], nums[j]);
                cardsList.add(card);
            }
        }
        System.out.println("█████████████████开始创建扑克牌█████████████████");
        //遍历一下创建好的扑克牌
        for (Cards card : cardsList) {
            System.out.print("[" + card.type + card.num + "]");
        }
        System.out.println();
        System.out.println("█████████████████扑克牌创建完毕█████████████████");
        System.out.println();
        System.out.println();
    }

    /**
     * 洗牌shuffleCard
     * 首先打印一句话,开始洗牌。
     * 通过调用Collections.shuffle()方法,对pokerList进行打乱顺序。
     * 然后将洗完的牌再次进行打印输出。
     */
    public void shuffleCard() {
        System.out.println("█████████████████开始洗牌█████████████████");
        Collections.shuffle(cardsList);
        //遍历一下洗完牌之后的扑克牌
        for (Cards card : cardsList) {
            System.out.print("[" + card.type + card.num + "]");
        }
        System.out.println();
        System.out.println("█████████████████洗牌完毕█████████████████");
        System.out.println();
        System.out.println();
    }

    /**
     * 创建玩家
     * 先打印输出,开始创建玩家。然后依次提示用户输入玩家ID和姓名
     * 如果ID相同或者ID不为整数则抛出异常并提示玩家重新输入
     */
    public void addPlayer() { 
        System.out.println("█████████████████开始创建玩家█████████████████"); 
        for(int i = 0 ;i < 2;){ 
            System.out.println("请输入第" + (i+1) + "位玩家的ID:"); 
            int id = 0; 
            try{ 
                id = scanInt(); 
                } catch (Exception e) { 
                    System.out.println(e.getMessage());
                continue; 
                } 
            Player p = playerMap.get(id); 
            if(p == null) { 
                System.out.println("请输入玩家的姓名:"); 
                String name = console.next(); 
                playerMap.put(id, new Player(id , name));
                //用switch case来对全局变量player1和player2进行赋值
                switch(i) { 
                case 0: 
                    player1 = id; 
                case 1: 
                    player2 = id; 
                    } 
                System.out.println("玩家创建成功!"); 
                i++; 
                } else { 
                    System.out.println("该ID已存在,请重新输入一次!"); 
                    continue;//跳出当前,直接回到循环开始
                    } 
            }
        } 

    /** 
     *  防止输入 非整数型的ID
     */ 
    public int scanInt() throws Exception { 
        try { 
            int id = console.nextInt(); 
            return id;
            } catch (Exception e) {
                console = new Scanner(System.in);
                throw new Exception("请输入整数类型的ID!"); 
                }
        } 
        /** 运行游戏
         *   首先要发牌,然后比较大小
         */     
        public void playGame() {
            System.out.println("█████████████████开始发牌█████████████████");
            //发牌有多种方法,可以从上往下开始发,也可以随机发。
            //随机发牌可以生成随机数和for循环来实现
            //这里按照从上往下顺序发牌,一人一张交替发牌。
            playerMap.get(player1).listCards.add(cardsList.get(0));
            System.out.println("玩家:" + playerMap.get(player1).name + "拿牌" );
            playerMap.get(player2).listCards.add(cardsList.get(1));
            System.out.println("玩家:" + playerMap.get(player2).name + "拿牌");
            playerMap.get(player1).listCards.add(cardsList.get(2));
            System.out.println("玩家:" + playerMap.get(player1).name + "拿牌");
            playerMap.get(player2).listCards.add(cardsList.get(3));
            System.out.println("玩家:" + playerMap.get(player2).name + "拿牌");
            System.out.println("█████████████████发牌完毕█████████████████");
            //用Map的get()方法
            //通过getKey(ID)找到玩家Player的Value
            //然后将Value中的手牌集合的牌(花色和点数)赋值给手牌对象
            Cards c1 = playerMap.get(player1).listCards.get(0);
            Cards c11 = playerMap.get(player1).listCards.get(1);
            Cards c2 = playerMap.get(player2).listCards.get(0);
            Cards c22 = playerMap.get(player2).listCards.get(1);
            //打印输出一号玩家的手牌
            System.out.println("玩家:" + playerMap.get(player1).name + "的手牌为" 
                    + "[" + c1.type + c1.num + "]"+"[" + c11.type + c11.num + "]");
            //打印输出二号玩家的手牌
            System.out.println("玩家:" + playerMap.get(player2).name + "的手牌为" 
                    + "[" + c2.type + c2.num + "]"+ "[" + c22.type + c22.num + "]");
            //创建一个比较手牌大小类的对象,来调用Compare方法
            CompareToCards ctc = new CompareToCards();
            //比较手牌类返回的是一个int类型的值,这个值需要在maxFigure方法中使用
            int p1 = ctc.compare(c1, c11);
            int p2 = ctc.compare(c2, c22);
            //首先比较玩家自己手中的两张牌,得到最大的那张。
            //调用maxFigure方法,将玩家1最大的手牌给新创建的Cards对象player1MaxCards
            Cards player1MaxCards = ctc.maxFigure(c1, c11, p1);
            //调用maxFigure方法,将玩家2最大的手牌给新创建的Cards对象player2MaxCards
            Cards player2MaxCards = ctc.maxFigure(c2, c22, p2);
            //打印输出玩家1的最大手牌
            System.out.println("玩家:" + playerMap.get(player1).name + "最大的手牌为:"
                    + "[" + player1MaxCards.type + player1MaxCards.num + "]");
            //打印输出玩家2的最大手牌
            System.out.println("玩家:" + playerMap.get(player2).name + "最大的手牌为:"
                    + "[" +player2MaxCards.type + player2MaxCards.num + "]");
            //比较两个玩家的对大手牌,然后输出获胜者及最大的牌
            //用过if判断语句实现
            if (ctc.compare(player1MaxCards, player2MaxCards) > 0) {
                System.out.println("█████████████████获胜者为:"
            + playerMap.get(player1).name + "█████████████████");
            } else {
                System.out.println("█████████████████获胜者为:"
            + playerMap.get(player2).name + "█████████████████");
            }
        }

        //主函数
        public static void main (String[] args) {
            //创建PlayGame对象,然后调用方法
            PlayGame pl = new PlayGame();
            pl.addCard();
            pl.shuffleCard();
            pl.addPlayer();
            pl.playGame();
        }
    }
扑克牌类
package cardsgame;
    //为了简单书写所有变量没有使用private
public class Cards {
    //扑克牌花色
    public String type;
    //扑克牌点数
    public String num;

    @Override public String toString() { 
        return type + num ; 
        } 

    @Override 
    public int hashCode() { 
        final int prime = 31; 
        int result = 1; 
        result = prime * result + ((type == null) ? 0 : type.hashCode()); 
        result = prime * result + ((num == null) ? 0 : num.hashCode()); return result; } 

    @Override public boolean equals(Object obj) { 
        if (this == obj) 
            return true; 
        if (obj == null) 
            return false; 
        if (!(obj instanceof Cards)) 
            return false;
        Cards other = (Cards) obj; 
        if (type == null) { 
            if (other.type != null) 
                return false; 
            } else if (!type.equals(other.type)) 
                return false; 
        if (num == null) { 
            if (other.num != null) 
                return false; 
            } else if (!num.equals(other.num)) 
                return false; 
        return true; }

    public Cards(String type, String num) {
        this.type = type;
        this.num = num;
    }
}
``
玩家类
package cardsgame;

import java.util.ArrayList;
import java.util.List;

public class Player {
    //玩家ID
    public Integer id;
    //玩家姓名
    public String name;
    //玩家手牌List
    List<Cards> listCards = new ArrayList<Cards>();

    public Player(){

    }
    public Player(Integer id, String name) {
        this.id = id;
        this.name = name;
        this.listCards = new ArrayList<Cards>();
    }
}

手牌比较类
package cardsgame;

import java.util.Comparator;

public class CompareToCards implements Comparator<Cards> {

@Override
    //返回值是一个int型数字,返回1即o1比o2大,返回-1即o2比o1大。
    //因为只有一副牌,除去大小王,花色按照黑红梅芳从大到小的顺序比较,
    //所以不可能出现平局。
public int compare(Cards o1, Cards o2) {
    // 创建四种花色,从小到大排序
    String pattern = "";
    // 创建点数2-A,从小到大排序
    String figure = "2345678910JQKA";
    // 索引第一张牌的花色
    int p1 = pattern.indexOf(o1.type);
    // 索引第一张牌的点数
    int f1 = figure.indexOf(o1.num);
    // 索引第二张牌的花色
    int p2 = pattern.indexOf(o2.type);
    // 索引第二张牌的点数
    int f2 = figure.indexOf(o2.num);
    // 开始进行比较,先比较两张牌的大小,再比较花色
    if (f1 > f2) {
        return 1;
    } else if (f1 == f2) {
        if (p1 > p2) {
            return 1;
        } else {
            return -1;
        }
    } else {
        return -1;
    }
}
//定义k是为了把compare比较出的值传递给maxPoker方法,从而返回最大者
public Cards maxFigure(Cards o1, Cards o2, int k) {
    if (k > 0) {
        return o1;
    } else {
        return o2;
    }
}

}

0人推荐
随时随地看视频
慕课网APP