一、前言
我身邊的很多同學都認為學計算機專業的人,代碼寫的好很正常,認為自己不是學計算機專業的,不會寫代碼很正常,或者這么說,覺得會寫代碼是一種天賦。其實不然,我們現在必須要清楚當代社會的局勢,當代社會朝着信息化的方向快速的發展,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()