语法实训之比牌demo——Java,Ktolin

想要学好Java,Ktolin等编程语言,必不可少的就是培养良好的程序思维,以及对代码的灵活运用。这些都离不开各种demo的铺垫,多写多练才能熟能生巧,接下来就与小编一同来完成一个比牌demo吧~


培养程序思维,程序搭建少不了~着手写一个程序,首先要明确的就是程序要实现的具体功能,即程序分析;第二步也是最重要的一步就是画类图,类图体现的不仅是一个程序该如何实现的具体方法,也体现了一个程序的内部逻辑的框架,是一个程序的灵魂所在。最后一步就是根据类图写代码啦,具体过程如下:

一 . 程序分析

1.明确程序要实现的功能:
由系统给出两张牌,再进行两张牌大小的比较

2.实现方法:
两张牌需要从“一副牌”中随机获取,即要实现对一副牌的管理。每张牌由两个部分组成:点数和花色。一副牌中的点数包含:2 3 4 5 6 7 8 9 10 J Q K A,花色包含:♠ ❤ ♣ ♦,通过先比点数再比花色来实现牌面的大小比较。


二 . 画类图

画类图,小编这里用的是Processon,其特点画面清晰,内容丰富也很好上手,很适合初学者小白(比如我hhhh)链接献上☑(https://www.processon.com/)

类图是一个程序的灵魂所在,在此步我们要着手分析并整理好各个类要实现的功能,以及类与类之间的关系。下面就是一个分析的过程(保姆级解说):

1️⃣首先我们要获取两张牌,就需要对一副牌进行管理。先把每张牌的点数和花色组合在一起,再放到一个ArraryLiat数组里生成我们的一副牌,并从这个数组里得到我们想要的‘两张牌’。这里我们可以通过一个PokerManger类来实现以上两个功能;
2️⃣得到牌之后我们就要对两张牌进行比较。不难发现,对于一副牌的点数与花色都不是我们所能直接用的正常大小关系,因此就需要我们自己编译一个排序来比较大小,小编这里解决这个的方法是:分别将牌的点数和花色按从小到大的顺序放到两个数组里,再根据数组元素的位置即‘索引值’进行大小的比较。因此点数和花色需要重新分配到两个类中,分别为PokerNumber类和PokerSuit类,两个类都包含两个参数,一个属性本身(String类型)和一个索引值(Int类型);3️⃣最后再设定一个Poker主类,对于我们得到的两张牌,给出对比较大小的方法!这样就实现了我们的最终目的✅
构思完就可以开始着手画类图啦~类图如下:

uml类图

图中的1v1以及1v may表示类与类之间的对应关系~


三 . 根据类图写代码

1.我们先用Java来实现程序

首先是PokerNumber类和PokerSuit类,都有两个变量,一个代表点数和花色,一个用来比较大小

public class PokerNumber {
    String number;
    int tag;

    public PokerNumber(String number, int tag) {
        this.number = number;
        this.tag = tag;
    }
}

public class PokerSuti {
    String suit;
    int tag;

    public PokerSuti(String suit, int tag) {
        this.suit = suit;
        this.tag = tag;
    }
}

Poker类:实现两张牌的比较,用compareTo方法实现,先比点数,后比花色

public class Poker {
    PokerSuti suitObj;
    PokerNumber numberObj;

    public Poker(PokerSuti suitObj, PokerNumber numberObj) {
        this.suitObj = suitObj;
        this.numberObj = numberObj;
    }

    public PokerSuti getSuitObj() {
        return suitObj;
    }

    public PokerNumber getNumberObj() {

        return numberObj;
    }
    public boolean compareTo(Poker other){
        if (this.numberObj.tag==other.numberObj.tag) {
            if (this.suitObj.tag>other.suitObj.tag){
                return true;
            }else {
                return false;
            }
        }else {
            if (this.numberObj.tag > other.numberObj.tag) {
                return true;
            } else {
                return false;
            }
        }
    }
}

PokerManger类:实现一副牌的管理,编译一个数组存放一副牌,并实现单张牌的获取

public class PokerManger {
    ArrayList<Poker> pokers=new ArrayList<>();
    String[] numbers={"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
    String[] sutis={"♦","♣","❤","♠"};
    public PokerManger() {
        for (int i = 0; i < numbers.length; i++) {
            for (int j = 0; j < sutis.length; j++) {
                PokerNumber numberObj=new PokerNumber(numbers[i],i);
                PokerSuti sutiObj=new PokerSuti(sutis[j],j);
                Poker poker=new Poker(sutiObj, numberObj);
                pokers.add(poker);
            }
        }
        Collections.shuffle(pokers);
//        打乱
    }
    public Poker getPoker(){
        Random random=new Random();
        int index=random.nextInt(pokers.size());
        Poker poker=pokers.get(index);
        pokers.remove(index);
        return poker;
    }
}

Myclass:测试程序

public class Myclass {
    public static void main(String[] args) {
        PokerManger manger=new PokerManger();
        Poker poker1=manger.getPoker();
        Poker poker2=manger.getPoker();
        boolean result=poker1.compareTo(poker2);
        if (result){
            System.out.println(poker1.numberObj.number+poker1.suitObj.suit+">"+
                    poker2.numberObj.number+poker2.suitObj.suit);
        }else {
            System.out.println(poker1.numberObj.number+poker1.suitObj.suit+"<"+
                    poker2.numberObj.number+poker2.suitObj.suit);
        }
    }
}

程序运营截图如下:


Java程序运行截图

2.用Kotlin实现程序

与Java同理有5个类,分别如下
PokerNumber类和PokerSuit类

class PokerNumber (
    val number:String,
    val tag:Int
)
class Pokersuit(
    val suit:String,
    val tag:Int
)

Poker类

class Poker(
    val numberObj:PokerNumber,
    val suitObj:Pokersuit
) {
   fun compareTo(other: Poker):Boolean{
        return if (this.numberObj.tag == other.numberObj.tag){
            //点数相同 比较花色
            this.suitObj.tag > other.suitObj.tag
        }else{
            this.numberObj.tag > other.numberObj.tag
        }
    }
}

PokerManger类

import kotlin.random.Random

class Pokermanager {
    val pokers:ArrayList<Poker> = arrayListOf()
    val numbers= arrayOf("2","3","4","5","6","7","8","9","10","J","Q","K","A")
    val suit= arrayOf("♦","♣","❤","♠")
    init {
        for ((i,number) in numbers.withIndex()){
            for ((j,suit) in suit.withIndex()){
                pokers.add(Poker(PokerNumber(number,i), Pokersuit(suit,j)))
            }
        }

    }
    fun getPoker():Poker{
               Random.nextInt(pokers.size).also {
            pokers[it].apply {
                pokers.remove(this)
                return this
            }
        }
}

Main类

fun main() {
    Pokermanager().apply {
        val poker1 = getPoker()
        val poker2 = getPoker()
        poker1.compareTo(poker2).also {
            if (it){
                println("${poker1.numberObj.number}${poker1.suitObj.suit} > " +
                        "${poker2.numberObj.number}${poker2.suitObj.suit}")
            }else{
                println("${poker1.numberObj.number}${poker1.suitObj.suit} < " +
                        "${poker2.numberObj.number}${poker2.suitObj.suit}")
            }
        }
    }
}

同样献上Ktolin程序运营截图


Ktolin 程序运行截图

四 . 总结

1.想写好一个程序,首先就得明确目标与功能,以及属性的分析,同时要考虑到各种牵扯进来的内容;其次就是要找准实现解决问题所要用到的各种方法,方法找得好,程序简明了;而最最最重要的一步就是要理清整个程序的内部逻辑,明确各个类实现的功能,通过类图来展现其中对应的关系;最后就是写代码啦,把基础的语法语句加以组织串联,赋予代码生命来实现我们想要实现的具体功能~

2.Java与Ktolin相比起来,Ktolin的代码会更加简洁,看起来也会舒服些,写法上也比Java少了些符号,在方法的实现上也省去了一些冗杂变量的使用。同样的Ktolin也需要记忆更多的语法知识。

今天的demo就写到这里啦,路漫漫其修远兮,我们一同加油!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342