天天看點

一個老王開槍案例帶你一步一步領略程式開發的魅力

一、前言

  我身邊的很多同學都認為學計算機專業的人,代碼寫的好很正常,認為自己不是學計算機專業的,不會寫代碼很正常,或者這麼說,覺得會寫代碼是一種天賦。其實不然,我們現在必須要清楚當代社會的局勢,當代社會朝着資訊化的方向快速的發展,AI的時代即将到來,不會寫代碼的大學生是不是很low了?何況新加坡總統李顯龍寫代碼都溜得飛起來,作為一個總統都會寫代碼,我們又何嘗不要去學呢?幾乎所有專業都有開設程式設計課程,這是一種思維的體操,把寫代碼當作一種娛樂也未嘗不可?

  不要認為寫代碼是件很難的事情,沒有人一出生就什麼都會,天才也是要靠勤奮的吖!

  有些同學說,代碼很長很難了解,看不懂。其實不管做什麼事,你隻要有耐心,肯鑽研,多學多做多問,一切問題都能迎刃而解。

  下面我将從實際案例出發,帶你體驗程式開發獨有的魅力,讓你愛上程式設計!!!

二、案例及剖析

  老王和隔壁的老宋是對老冤家,有一天老王回家,發現隔壁老宋和他妻子在家,多年的恩怨爆發了,老王跑到櫃子裡拿着一把槍直奔房間,老王開槍把隔壁老宋打死了,第二天老王就去警察局自首了。。。。

一個老王開槍案例帶你一步一步領略程式開發的魅力

  可能有些同學會覺得這個故事很奇葩,很扯淡,emmmmm,反正都是編的故事,就不要在意這麼多細節了hhhh,我們需要做的就是用程式來描述下老王開槍打死隔壁老宋這一過程

  有同學就會有疑問,不就是老婆跟别人跑了然後拿槍打死那個第三者嘛,這有什麼好稀奇的?诶诶诶,計算機應該怎麼去了解呢,我們應該怎麼去設計這一過程呢?

  我們把這一過程概括為以下階段:

   #1. 建立老王對象

   #2. 建立一個槍對象

   #3. 建立一個彈夾對象

   #4. 建立一些子彈

   #5. 建立一個隔壁老宋

   #6. 老王把子彈安裝到彈夾中

   #7. 老王把彈夾安裝到槍中

   #8. 老王拿槍

   #9. 老王開槍打隔壁老宋

這就是程式化的設計思想,到這裡,大家是不是對這種程式化的思想多少了解了些呢?

我們可以繼續來看,要實作這一過程,我們将用到目前的主流語言Python來實作,具體過程如下:

首先,我們先寫出基本的架構:

def main():
    """用來控制整個程式的流程"""
    pass

    #1. 建立老王對象

    #2. 建立一個槍對象

    #3. 建立一個彈夾對象

    #4. 建立一些子彈

    #5. 建立一個敵人

    #6. 老王把子彈安裝到彈夾中

    #7. 老王把彈夾安裝到槍中

    #8. 老王拿槍

    #9. 老王開槍打敵人

if __name__ == '__main__':
    main()      

定義一個main函數,用來控制整個程式的流程

__name__ 是目前子產品名,當子產品被直接運作時子產品名為 __main__ 。這句話的意思就是,當子產品被直接運作時,以下代碼塊将被運作,當子產品是被導入時,代碼塊不被運作。

第一步,我們需要建立一個老王對象,我們可以這麼去寫:

laowang = Person("老王")      

此時需要調用到一個Person類,于是我們就需要去建立一個Person類:

class Person(object):
    """人的類"""
    def __init__(self, name):
        super(Person, self).__init__()
        self.name = name      

我們傳入了一個參數為老王,于是我們需要定義一個name的形參

接着第二步,我們需要建立一個槍對象

ak47 = Gun("AK47")      

此時我們用到了一個Gun的類,并且傳入了一個實參AK47,于是我們需要去建立一個這樣的類:

class Gun(object):
    """槍類"""
    def __init__(self, name):
        super(Gun, self).__init__()
        self.name = name#用來記錄槍的類型      

第三步,我們需要建立一個彈夾對象

dan_jia = Danjia(20)      

這裡我們設定彈夾裝的子彈數為20

此時我們調用到了一個Danjia的類,我們繼續去建立這個類

class Danjia(object):
    """彈夾類"""
    def __init__(self, max_num):
        super(Danjia, self).__init__()
        self.max_num = max_num#用來記錄彈夾的最大容量      

傳入的參數max_num用來記錄彈夾的最大容量

第四步,我們需要去建立一些子彈

zi_dan = Zidan(10)      

在這裡,我們設定子彈數為10

并且我們還需要建立一個Zidan的類

class Zidan(object):
    """子彈類"""
    def __init__(self, sha_shang_li):
        super(Zidan, self).__init__()
        self.sha_shang_li = sha_shang_li#這顆子彈的威力      

我們設定了子彈的威力參數,用sha_shang_li參數表示

到現在為止,我們把所有對象都建立完了

接下來我們需要對行為進行模拟

我們來到第五步,我們需要設計出老王把子彈安裝到彈夾中這一過程

我們用中文進行模拟:

老王.安裝子彈到彈夾中(彈夾,子彈)

#老王.安裝子彈到彈夾中(彈夾,子彈)
    laowang.anzhuang_zidan(dan_jia, zi_dan)      

我們定義了一個anzhuang_zidan這一方法,結合實際生活,安裝子彈這一過程是人來完成的,是以我們在Person類中定義此方法:

def anzhuang_zidan(self, dan_jia_temp, zi_dan_temp):
        """把子彈裝到彈夾中"""
        
        #彈夾.儲存子彈(子彈)
        dan_jia_temp.baocun_zidan(zi_dan_temp)      

此時我們需要彈夾去儲存子彈,此時我們需要在彈夾中定義baocun_zidan這一方法,這一方法當然是在Danjia類中進行定義:

def baocun_zidan(self, zi_dan_temp):
        """将這顆子彈儲存"""
        self.zidan_list.append(zi_dan_temp)      

我們為了能夠儲存子彈,我們定義了一個清單zidan_list用來記錄所有的子彈的引用,是以我們在Danjia類中進行初始化操作:

def __init__(self, max_num):
        super(Danjia, self).__init__()
        self.max_num = max_num#用來記錄彈夾的最大容量
        self.zidan_list = []#用來記錄所有的子彈的引用      

 第五步到這裡就實作完成了

接着第六步老王把彈夾安裝到槍中

我們用更形象的語言來進行描述:

老王.安裝彈夾到槍中(槍,彈夾)

#老王.安裝彈夾到槍中(槍,彈夾)
    laowang.anzhuang_danjia(ak47, dan_jia)      

我們定義了一個anzhuang_danjia這一方法,結合實際生活,安裝彈夾這一過程也是由人來完成的,是以我們在Person類中定義此方法:

def anzhuang_danjia(self, gun_temp, dan_jia_temp):
        """把彈夾安裝到槍中"""

        #槍.儲存彈夾(彈夾)
        gun_temp.baocun_danjia(dan_jia_temp)      

此時我們傳入了兩個參數gun_temp和dan_jia_temp,我們建立了一個gun_temp.baocun_danjia方法,用來儲存彈夾,是以在Gun中,我們需要定義此方法:

def baocun_danjia(self, dan_jia_temp):
        """用一個屬性來儲存這個彈夾對象的引用"""
        self.danjia = dan_jia_temp      

而對Gun類,我們需要進行初始化操作

def __init__(self, name):
        super(Gun, self).__init__()
        self.name = name#用來記錄槍的類型
        self.danjia = None#用來記錄彈夾對象的引用      

此時我們需要測試彈夾資訊和槍的資訊

我們需要在彈夾中定義如下語句:

def __str__(self):
        return "彈夾的資訊為:%d/%d"%(len(self.zidan_list), self.max_num)      

記錄子彈的剩餘數/子彈的最大容量

而測試槍資訊,我們在槍這一類中定義了如下語句:

def __str__(self):
        if self.danjia:
            return "槍的資訊為:%s, %s"%(self.name, self.danjia)
        else:
            return "槍的資訊為:%s,這把槍中沒有彈夾"%(self.name)      

至此我們測試完成了如上所有操作

第七步老王拿槍,我們可以寫出如下語句:

老王.拿槍(槍)

#老王.拿槍(槍)
    laowang.naqiang(ak47)      

我們定義了naqiang這一方法,我們知道,隻有人才會拿槍啊,是以我們需要在Person類中定義一個naqiang的方法:

def naqiang(self, gun_temp):
        """拿起一把槍"""
        self.gun = gun_temp      

然後我們需要去測試一下測試老王對象

print(laowang)      

要測試一對象,我們需要定義些人的屬性,比如hp,是以我們在Person類中進行初始化的添加

def __init__(self, name):
        super(Person, self).__init__()
        self.name = name
        self.gun = None#用來儲存槍對象的引用
        self.hp = 100      

開始進行一個測試:

def __str__(self):
        if self.gun:
            return "%s的血量為:%d, 他有槍 %s"%(self.name, self.hp, self.gun)
        else:
            return "%s的血量為%d, 他沒有槍"%(self.name, self.hp)      

到此我們完成了測試階段

第八步,我們去建立一個敵人

#8. 建立一個敵人
    gebi_laosong = Person("隔壁老宋")
    print(gebi_laosong)      

再通過第九步,老王開槍打敵人

我們可以寫出如下語句:

老王.扣扳機(隔壁老宋)

#老王.扣扳機(隔壁老宋)
    laowang.kou_ban_ji(gebi_laosong)
    print(gebi_laosong)
    print(laowang)      

此時我們定義了一個kou_ban_ji的方法,通過調用這個方法,達到敵人hp減少的目的

是以我們需要在Person類中定義此方法:

def kou_ban_ji(self, diren):
        """讓槍發射子彈去打敵人"""
        #槍.開火(敵人)

        self.gun.fire(diren)      

并且在此方法中又加定義了一個開槍的方法,而通過槍才能打出子彈,是以在Gun中定義了此方法

def fire(self, diren):
        """槍從彈夾中擷取一發子彈,然後讓這發子彈去擊中敵人"""

        #先從彈夾中取子彈
        #彈夾.彈出一發子彈()
        zidan_temp = self.danjia.tanchu_zidan()

        #讓這個子彈去傷害敵人
        if zidan_temp:
            #子彈.打中敵人(敵人)
            zidan_temp.dazhong(diren)
        else:
            print("彈夾中沒有子彈了。。。。")      

并且我們進行了子彈數測試

子彈要從彈夾中彈出去,我們繼續在Danjia中定義tanchu_zidan方法:

def tanchu_zidan(self):
        """彈出最上面的那顆子彈"""
        if self.zidan_list:
            return self.zidan_list.pop()
        else:
            return None      

并且子彈打中人會讓人掉hp,是以我們需要在子彈中定義一個dazhong方法:

def dazhong(self, diren):
        """讓敵人掉血"""

        #敵人.掉血(一顆子彈的威力)
        diren.xiao_xue(self.sha_shang_li)
              

人會掉hp,繼續在Person類中定義xiao_xue方法:

def xiao_xue(self, sha_shang_li):
        """根據殺傷力,掉相應的血量"""
        self.hp -= sha_shang_li      

至此,通過測試,我們已經完成了整個流程的設計和開發,雖然很簡單的一個問題,但是在程式設計階段,每一步驟都是緊密相連的,這就是作為一個程式狗每天需要面對的問題,看起來很冗長,其實思路并不複雜,一個不懂程式的人都能看懂的執行步驟,我希望越來越多的人能夠喜歡程式設計,我們國家缺的就是這種人才,隻要每個人多貢獻出自己的一份力量,AI的到來将離我們更近一步!!!

附上以上所提到的源碼,我進行了彙總,源碼如下:

class Person(object):
    """人的類"""
    def __init__(self, name):
        super(Person, self).__init__()
        self.name = name
        self.gun = None#用來儲存槍對象的引用
        self.hp = 100

    def anzhuang_zidan(self, dan_jia_temp, zi_dan_temp):
        """把子彈裝到彈夾中"""
        
        #彈夾.儲存子彈(子彈)
        dan_jia_temp.baocun_zidan(zi_dan_temp)

    def anzhuang_danjia(self, gun_temp, dan_jia_temp):
        """把彈夾安裝到槍中"""

        #槍.儲存彈夾(彈夾)
        gun_temp.baocun_danjia(dan_jia_temp)

    def naqiang(self, gun_temp):
        """拿起一把槍"""
        self.gun = gun_temp

    def __str__(self):
        if self.gun:
            return "%s的血量為:%d, 他有槍 %s"%(self.name, self.hp, self.gun)
        else:
            if self.hp>0:
                return "%s的血量為%d, 他沒有槍"%(self.name, self.hp)
            else:
                return "%s 已挂...."%self.name

    def kou_ban_ji(self, diren):
        """讓槍發射子彈去打敵人"""
        #槍.開火(敵人)

        self.gun.fire(diren)

    def xiao_xue(self, sha_shang_li):
        """根據殺傷力,掉相應的血量"""
        self.hp -= sha_shang_li

class Gun(object):
    """槍類"""
    def __init__(self, name):
        super(Gun, self).__init__()
        self.name = name#用來記錄槍的類型
        self.danjia = None#用來記錄彈夾對象的引用

    def baocun_danjia(self, dan_jia_temp):
        """用一個屬性來儲存這個彈夾對象的引用"""
        self.danjia = dan_jia_temp

    def __str__(self):
        if self.danjia:
            return "槍的資訊為:%s, %s"%(self.name, self.danjia)
        else:
            return "槍的資訊為:%s,這把槍中沒有彈夾"%(self.name)

    def fire(self, diren):
        """槍從彈夾中擷取一發子彈,然後讓這發子彈去擊中敵人"""

        #先從彈夾中取子彈
        #彈夾.彈出一發子彈()
        zidan_temp = self.danjia.tanchu_zidan()

        #讓這個子彈去傷害敵人
        if zidan_temp:
            #子彈.打中敵人(敵人)
            zidan_temp.dazhong(diren)
        else:
            print("彈夾中沒有子彈了。。。。")



class Danjia(object):
    """彈夾類"""
    def __init__(self, max_num):
        super(Danjia, self).__init__()
        self.max_num = max_num#用來記錄彈夾的最大容量
        self.zidan_list = []#用來記錄所有的子彈的引用

    def baocun_zidan(self, zi_dan_temp):
        """将這顆子彈儲存"""
        self.zidan_list.append(zi_dan_temp)

    def __str__(self):
        return "彈夾的資訊為:%d/%d"%(len(self.zidan_list), self.max_num)

    def tanchu_zidan(self):
        """彈出最上面的那顆子彈"""
        if self.zidan_list:
            return self.zidan_list.pop()
        else:
            return None

class Zidan(object):
    """子彈類"""
    def __init__(self, sha_shang_li):
        super(Zidan, self).__init__()
        self.sha_shang_li = sha_shang_li#這顆子彈的威力

    def dazhong(self, diren):
        """讓敵人掉血"""

        #敵人.掉血(一顆子彈的威力)
        diren.xiao_xue(self.sha_shang_li)
        

def main():
    """用來控制整個程式的流程"""

    #1. 建立老王對象
    laowang = Person("老王")

    #2. 建立一個槍對象
    ak47 = Gun("AK47")

    #3. 建立一個彈夾對象
    dan_jia = Danjia(20)

    #4. 建立一些子彈
    for i in range(15):
        zi_dan = Zidan(10)

        #5. 老王把子彈安裝到彈夾中
        #老王.安裝子彈到彈夾中(彈夾,子彈)
        laowang.anzhuang_zidan(dan_jia, zi_dan)

    #6. 老王把彈夾安裝到槍中
    #老王.安裝彈夾到槍中(槍,彈夾)
    laowang.anzhuang_danjia(ak47, dan_jia)

    #test:測試彈夾的資訊
    #print(dan_jia)

    #test:測試槍的資訊
    #print(ak47)

    #7. 老王拿槍
    #老王.拿槍(槍)
    laowang.naqiang(ak47)

    #test:測試老王對象
    print(laowang)

    #8. 建立一個敵人
    gebi_laosong = Person("隔壁老宋")
    print(gebi_laosong)

    #9. 老王開槍打敵人
    #老王.扣扳機(隔壁老宋)
    laowang.kou_ban_ji(gebi_laosong)
    print(gebi_laosong)
    print(laowang)
    laowang.kou_ban_ji(gebi_laosong)
    print(gebi_laosong)
    print(laowang)
    laowang.kou_ban_ji(gebi_laosong)
    print(gebi_laosong)
    print(laowang)
    laowang.kou_ban_ji(gebi_laosong)
    print(gebi_laosong)
    print(laowang)
    laowang.kou_ban_ji(gebi_laosong)
    print(gebi_laosong)
    print(laowang)
    laowang.kou_ban_ji(gebi_laosong)
    print(gebi_laosong)
    print(laowang)
    laowang.kou_ban_ji(gebi_laosong)
    print(gebi_laosong)
    print(laowang)
    laowang.kou_ban_ji(gebi_laosong)
    print(gebi_laosong)
    print(laowang)
    laowang.kou_ban_ji(gebi_laosong)
    print(gebi_laosong)
    print(laowang)
    laowang.kou_ban_ji(gebi_laosong)
    print(gebi_laosong)
    print(laowang)
    laowang.kou_ban_ji(gebi_laosong)
    print(gebi_laosong)
    print(laowang)

if __name__ == '__main__':
    main()      

您可以考慮給部落客來個小小的打賞以資鼓勵,您的肯定将是我最大的動力。thx.

微信打賞

一個老王開槍案例帶你一步一步領略程式開發的魅力

支付寶打賞

一個老王開槍案例帶你一步一步領略程式開發的魅力

作  者:

Angel_Kitty

出  處:

http://www.cnblogs.com/ECJTUACM-873284962/

關于作者:潛心機器學習以及資訊安全的綜合研究。如有問題或建議,請多多賜教!

版權聲明:本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連結。

特此聲明:所有評論和私信都會在第一時間回複。也歡迎園子的大大們指正錯誤,共同進步。或者

直接私信

聲援部落客:如果您覺得文章對您有幫助,可以點選右下角【

推薦

】推薦一下該博文。您的鼓勵是作者堅持原創和持續寫作的最大動力!

繼續閱讀