为了账号安全,请及时绑定邮箱和手机立即绑定

[提交作业]Java入门第三季7-1简易扑克牌游戏

标签:
Java

本篇实现的是imooc Java基础学习第三季7-1综合实战:简易扑克牌游戏(https://www.imooc.com/video/5475)

文章目录

  1. 踩坑分享

  2. 代码结构

  3. 代码

  4. 运行结果


  1. 踩坑分享

第一个坑:洗牌shuffle

第二个坑:比较手牌大小Comparator

待完善处:尚未完全掌握面向对象的程序设计思维

从早上9点开始写到晚上9点多才写完,第一次用Java写完整代码,很多不熟悉的地方暴露出来。

这个作业和老师前面讲的学生选课系统异曲同工,主要运用了List,Collections的Comparator自定义比较规则。

前面的代码参考老师的学生选课系统还能憋出来,包括洗牌shuffle都自己编出来了(然后发现Collections竟然自带shuffle方法)。但是到了比较手牌大小的时候就死也写不出来,数字JQK黑红梅方这都没法用compare比较大小。

忍不住去百度了一下,发现用indexOf()这个方法可以实现,于是重写了Comparator方法,搞定!结果AC

参考帖子链接如下https://blog.csdn.net/hr786250678/article/details/79210383?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

代码思维还是沿用之前C语言的习惯偏面相过程的,没有完全掌握类对象编程思想,比如刚开始规划代码功能的时候不知道需要几个类,也不知道把哪些方法放在哪些类里,过段时间再回来改进一下把


    2.代码结构

——Card类

——Player类

——CardDemo类(main函数在此)

——CardComparator类


    3.代码    

首先放Card.java

package com.imooc.carddemo;

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

public class Card implements Comparable{
    public String colorPoint;
    public String cardPoint;
    public Card(String colorPoint, String cardPoint){
        this.colorPoint = colorPoint;
        this.cardPoint = cardPoint;
    }
    public Card(){};

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Card card = (Card) o;
        return Objects.equals(colorPoint, card.colorPoint) &&
                Objects.equals(cardPoint, card.cardPoint);
    }

    @Override
    public int hashCode() {
        return Objects.hash(colorPoint, cardPoint);
    }

    @Override
    public int compareTo(Object o) {
        return 0;
    }
}

Player.java

package com.imooc.carddemo;

import java.util.*;

public class Player implements Comparator {
    public int id;
    public String name;
    public List<Card> cards;
    public Player(int id, String name){
        this.id = id;
        this.name = name;
        this.cards = new ArrayList<Card>();
    }

    @Override
    public int compare(Object o1, Object o2) {
        return 0;
    }
}

CardDemo.java

package com.imooc.carddemo;

import java.util.*;

public class CardDemo {
    public List<Card> cardList;
    public List<Card> shuffleCardList;
    public Player player;
    public List<Player> players;
    Scanner console;
    public CardDemo(){
        cardList = new ArrayList<Card>();
        shuffleCardList = new ArrayList<Card>();
        console = new Scanner(System.in);
        players = new ArrayList<Player>();
    }

    /**
     * 创建一副扑克牌
     * new newCard = {花色+点数}
     *list.add(newCard)
     */
    public void createCard(){
        System.out.println("------创建扑克牌-------");
        String[] colorPoint = {"方片","梅花","红桃","黑桃"};
        String[] cardPoint = {"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++){
                Card newCard = new Card(colorPoint[i],cardPoint[j]);
                cardList.add(newCard);
            }
        }
        System.out.println("------扑克牌创建成功-------");
    }
    public void cardForEach(){
        System.out.print("[");
        for (Card card:
                cardList) {
            System.out.print(card.colorPoint+card.cardPoint+" ");
        }
        System.out.println("]");
        System.out.println("扑克牌的数量为:"+cardList.size());
    }

    public void shuffleCard(){
        System.out.println("------开始洗牌-------");
        Random rnd = new Random();
        List<Integer> integerList = new ArrayList<Integer>();
        Integer k;
        shuffleCardList = (List<Card>) ((ArrayList)cardList).clone();
        for(int i=0; i<52; i++){
            do{
                k=rnd.nextInt(52);
            }while(integerList.contains(k));
            integerList.add(k);
//            System.out.print(k+" ");
            shuffleCardList.set(i,cardList.get(k));
        }
//        System.out.println();
//        for (Card card:
//                shuffleCardList) {
//            System.out.print(card.colorPoint+card.cardPoint+" ");
//        }
        System.out.println("------洗牌结束-------");
    }

    public void creatPlayer(){
        System.out.println("------创建玩家-------");
        int i = 0;
        int id;
        String name;
        while(i < 2){
            System.out.println("请输入第"+(i+1)+"位玩家的ID和姓名:");
            id = console.nextInt();
            System.out.println("请输入姓名:");
            name = console.next();
            player = new Player(id,name);
            players.add(player);
            i++;
        }
        System.out.println("----欢迎玩家"+players.get(0).name);
        System.out.println("----欢迎玩家"+players.get(1).name);
    }

    public void dealCard(){
        System.out.println("------开始发牌-------");
        int k=0;
        for(int j=0; j<2; j++){
            for(int i=0; i<players.size();i++){
                players.get(i).cards.add(shuffleCardList.get(k));
                System.out.println("----玩家:"+players.get(i).name+"-拿牌");
                k++;
            }
        }
        System.out.println("------发牌结束-------");
    }

    /**
     * 玩家i的cards排序,[1]位置牌最大
     */
    public void cardGame(){
        System.out.println("------开始游戏-------");
        for(int i=0; i<2; i++){
            Collections.sort(players.get(i).cards,new CardComparator());
            System.out.println("玩家:"+players.get(i).name+"最大的手牌为:"+
                    players.get(i).cards.get(1).colorPoint+players.get(i).cards.get(1).cardPoint);
        }
        List<Card> tmpCardList = new ArrayList<>();
        tmpCardList.add(players.get(0).cards.get(1));
        tmpCardList.add(players.get(1).cards.get(1));
        Collections.sort(tmpCardList,new CardComparator());
        for(int i=0; i<2; i++){
            if(players.get(i).cards.get(1).equals(tmpCardList.get(1)))
                System.out.println("------玩家:"+players.get(i).name+"获胜!-------");
        }
        System.out.println("玩家各自手牌为:");
        for (Player player:
             players) {
            System.out.println(player.name+":"+player.cards.get(0).colorPoint+player.cards.get(0).cardPoint+
                    player.cards.get(1).colorPoint+player.cards.get(1).cardPoint);
        }
    }

    public static void main(String[] args) {
        CardDemo cd = new CardDemo();

        cd.createCard();

        System.out.print("为");
        cd.cardForEach();

        cd.shuffleCard();
        cd.creatPlayer();
        cd.dealCard();
        cd.cardGame();
    }


}

CardComparator.java

package com.imooc.carddemo;

import java.util.Comparator;

public class CardComparator implements Comparator<Card> {

    @Override
    public int compare(Card o1, Card o2) {
        String colorPoint = "方片,梅花,红桃,黑桃";
        String cardPoint = "2,3,4,5,6,7,8,9,10,J,Q,K,A";
        int x = cardPoint.indexOf(o1.cardPoint);
        int y = cardPoint.indexOf(o2.cardPoint);
        if(x<y){
            return -1;
        }else if(x>y){
            return 1;
        }else{
            x = colorPoint.indexOf(o1.colorPoint);
            y = colorPoint.indexOf(o2.colorPoint);
            if(x<y){
                return -1;
            }else if(x>y){
                return 1;
            }else{
                return 0;
            }
        }

    }
}

4.运行结构

------创建扑克牌-------

------扑克牌创建成功-------

为[方片2 方片3 方片4 方片5 方片6 方片7 方片8 方片9 方片10 方片J 方片Q 方片K 方片A 梅花2 梅花3 梅花4 梅花5 梅花6 梅花7 梅花8 梅花9 梅花10 梅花J 梅花Q 梅花K 梅花A 红桃2 红桃3 红桃4 红桃5 红桃6 红桃7 红桃8 红桃9 红桃10 红桃J 红桃Q 红桃K 红桃A 黑桃2 黑桃3 黑桃4 黑桃5 黑桃6 黑桃7 黑桃8 黑桃9 黑桃10 黑桃J 黑桃Q 黑桃K 黑桃A ]

扑克牌的数量为:52

------开始洗牌-------

------洗牌结束-------

------创建玩家-------

请输入第1位玩家的ID和姓名:

1

请输入姓名:

tom

请输入第2位玩家的ID和姓名:

2

请输入姓名:

李四

----欢迎玩家tom

----欢迎玩家李四

------开始发牌-------

----玩家:tom-拿牌

----玩家:李四-拿牌

----玩家:tom-拿牌

----玩家:李四-拿牌

------发牌结束-------

------开始游戏-------

玩家:tom最大的手牌为:红桃Q

玩家:李四最大的手牌为:方片Q

------玩家:tom获胜!-------

玩家各自手牌为:

tom:梅花4红桃Q

李四:梅花9方片Q




点击查看更多内容
2人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消