一个老王开枪案例带你一步一步领略程序开发的魅力
一、前言
我身邊的很多同學(xué)都認(rèn)為學(xué)計(jì)算機(jī)專業(yè)的人,代碼寫的好很正常,認(rèn)為自己不是學(xué)計(jì)算機(jī)專業(yè)的,不會(huì)寫代碼很正常,或者這么說,覺得會(huì)寫代碼是一種天賦。其實(shí)不然,我們現(xiàn)在必須要清楚當(dāng)代社會(huì)的局勢(shì),當(dāng)代社會(huì)朝著信息化的方向快速的發(fā)展,AI的時(shí)代即將到來(lái),不會(huì)寫代碼的大學(xué)生是不是很low了?何況新加坡總統(tǒng)李顯龍寫代碼都溜得飛起來(lái),作為一個(gè)總統(tǒng)都會(huì)寫代碼,我們又何嘗不要去學(xué)呢?幾乎所有專業(yè)都有開設(shè)編程課程,這是一種思維的體操,把寫代碼當(dāng)作一種娛樂也未嘗不可?
不要認(rèn)為寫代碼是件很難的事情,沒有人一出生就什么都會(huì),天才也是要靠勤奮的吖!
有些同學(xué)說,代碼很長(zhǎng)很難理解,看不懂。其實(shí)不管做什么事,你只要有耐心,肯鉆研,多學(xué)多做多問,一切問題都能迎刃而解。
下面我將從實(shí)際案例出發(fā),帶你體驗(yàn)程序開發(fā)獨(dú)有的魅力,讓你愛上編程!!!
二、案例及剖析
老王和隔壁的老宋是對(duì)老冤家,有一天老王回家,發(fā)現(xiàn)隔壁老宋和他妻子在家,多年的恩怨爆發(fā)了,老王跑到柜子里拿著一把槍直奔房間,老王開槍把隔壁老宋打死了,第二天老王就去公安局自首了。。。。
可能有些同學(xué)會(huì)覺得這個(gè)故事很奇葩,很扯淡,emmmmm,反正都是編的故事,就不要在意這么多細(xì)節(jié)了hhhh,我們需要做的就是用程序來(lái)描述下老王開槍打死隔壁老宋這一過程
有同學(xué)就會(huì)有疑問,不就是老婆跟別人跑了然后拿槍打死那個(gè)第三者嘛,這有什么好稀奇的?誒誒誒,計(jì)算機(jī)應(yīng)該怎么去理解呢,我們應(yīng)該怎么去設(shè)計(jì)這一過程呢?
我們把這一過程概括為以下階段:
? #1. 創(chuàng)建老王對(duì)象
? #2. 創(chuàng)建一個(gè)槍對(duì)象
?#3. 創(chuàng)建一個(gè)彈夾對(duì)象
? #4. 創(chuàng)建一些子彈
? #5. 創(chuàng)建一個(gè)隔壁老宋
?#6. 老王把子彈安裝到彈夾中
? #7. 老王把彈夾安裝到槍中
? #8. 老王拿槍
?#9. 老王開槍打隔壁老宋
這就是程序化的設(shè)計(jì)思想,到這里,大家是不是對(duì)這種程序化的思想多少了解了些呢?
我們可以繼續(xù)來(lái)看,要實(shí)現(xiàn)這一過程,我們將用到當(dāng)前的主流語(yǔ)言Python來(lái)實(shí)現(xiàn),具體過程如下:
首先,我們先寫出基本的框架:
def main():"""用來(lái)控制整個(gè)程序的流程"""pass#1. 創(chuàng)建老王對(duì)象#2. 創(chuàng)建一個(gè)槍對(duì)象#3. 創(chuàng)建一個(gè)彈夾對(duì)象#4. 創(chuàng)建一些子彈#5. 創(chuàng)建一個(gè)敵人#6. 老王把子彈安裝到彈夾中#7. 老王把彈夾安裝到槍中#8. 老王拿槍#9. 老王開槍打敵人if __name__ == '__main__':main()定義一個(gè)main函數(shù),用來(lái)控制整個(gè)程序的流程
__name__ 是當(dāng)前模塊名,當(dāng)模塊被直接運(yùn)行時(shí)模塊名為 __main__ 。這句話的意思就是,當(dāng)模塊被直接運(yùn)行時(shí),以下代碼塊將被運(yùn)行,當(dāng)模塊是被導(dǎo)入時(shí),代碼塊不被運(yùn)行。
第一步,我們需要?jiǎng)?chuàng)建一個(gè)老王對(duì)象,我們可以這么去寫:
laowang = Person("老王")此時(shí)需要調(diào)用到一個(gè)Person類,于是我們就需要去創(chuàng)建一個(gè)Person類:
class Person(object):"""人的類"""def __init__(self, name):super(Person, self).__init__()self.name = name我們傳入了一個(gè)參數(shù)為老王,于是我們需要定義一個(gè)name的形參
接著第二步,我們需要?jiǎng)?chuàng)建一個(gè)槍對(duì)象
ak47 = Gun("AK47")此時(shí)我們用到了一個(gè)Gun的類,并且傳入了一個(gè)實(shí)參AK47,于是我們需要去創(chuàng)建一個(gè)這樣的類:
class Gun(object):"""槍類"""def __init__(self, name):super(Gun, self).__init__()self.name = name#用來(lái)記錄槍的類型第三步,我們需要?jiǎng)?chuàng)建一個(gè)彈夾對(duì)象
dan_jia = Danjia(20)這里我們?cè)O(shè)置彈夾裝的子彈數(shù)為20
此時(shí)我們調(diào)用到了一個(gè)Danjia的類,我們繼續(xù)去創(chuàng)建這個(gè)類
class Danjia(object):"""彈夾類"""def __init__(self, max_num):super(Danjia, self).__init__()self.max_num = max_num#用來(lái)記錄彈夾的最大容量傳入的參數(shù)max_num用來(lái)記錄彈夾的最大容量
第四步,我們需要去創(chuàng)建一些子彈
zi_dan = Zidan(10)在這里,我們?cè)O(shè)置子彈數(shù)為10
并且我們還需要?jiǎng)?chuàng)建一個(gè)Zidan的類
class Zidan(object):"""子彈類"""def __init__(self, sha_shang_li):super(Zidan, self).__init__()self.sha_shang_li = sha_shang_li#這顆子彈的威力我們?cè)O(shè)置了子彈的威力參數(shù),用sha_shang_li參數(shù)表示
到現(xiàn)在為止,我們把所有對(duì)象都創(chuàng)建完了
接下來(lái)我們需要對(duì)行為進(jìn)行模擬
我們來(lái)到第五步,我們需要設(shè)計(jì)出老王把子彈安裝到彈夾中這一過程
我們用中文進(jìn)行模擬:
老王.安裝子彈到彈夾中(彈夾,子彈)
#老王.安裝子彈到彈夾中(彈夾,子彈)laowang.anzhuang_zidan(dan_jia, zi_dan)我們定義了一個(gè)anzhuang_zidan這一方法,結(jié)合實(shí)際生活,安裝子彈這一過程是人來(lái)完成的,所以我們?cè)赑erson類中定義此方法:
def anzhuang_zidan(self, dan_jia_temp, zi_dan_temp):"""把子彈裝到彈夾中"""#彈夾.保存子彈(子彈)dan_jia_temp.baocun_zidan(zi_dan_temp)此時(shí)我們需要彈夾去保存子彈,此時(shí)我們需要在彈夾中定義baocun_zidan這一方法,這一方法當(dāng)然是在Danjia類中進(jìn)行定義:
def baocun_zidan(self, zi_dan_temp):"""將這顆子彈保存"""self.zidan_list.append(zi_dan_temp)我們?yōu)榱四軌虮4孀訌?#xff0c;我們定義了一個(gè)列表zidan_list用來(lái)記錄所有的子彈的引用,所以我們?cè)贒anjia類中進(jìn)行初始化操作:
def __init__(self, max_num):super(Danjia, self).__init__()self.max_num = max_num#用來(lái)記錄彈夾的最大容量self.zidan_list = []#用來(lái)記錄所有的子彈的引用?第五步到這里就實(shí)現(xiàn)完成了
接著第六步老王把彈夾安裝到槍中
我們用更形象的語(yǔ)言來(lái)進(jìn)行描述:
老王.安裝彈夾到槍中(槍,彈夾)
#老王.安裝彈夾到槍中(槍,彈夾)laowang.anzhuang_danjia(ak47, dan_jia)我們定義了一個(gè)anzhuang_danjia這一方法,結(jié)合實(shí)際生活,安裝彈夾這一過程也是由人來(lái)完成的,所以我們?cè)赑erson類中定義此方法:
def anzhuang_danjia(self, gun_temp, dan_jia_temp):"""把彈夾安裝到槍中"""#槍.保存彈夾(彈夾)gun_temp.baocun_danjia(dan_jia_temp)此時(shí)我們傳入了兩個(gè)參數(shù)gun_temp和dan_jia_temp,我們創(chuàng)建了一個(gè)gun_temp.baocun_danjia方法,用來(lái)保存彈夾,所以在Gun中,我們需要定義此方法:
def baocun_danjia(self, dan_jia_temp):"""用一個(gè)屬性來(lái)保存這個(gè)彈夾對(duì)象的引用"""self.danjia = dan_jia_temp而對(duì)Gun類,我們需要進(jìn)行初始化操作
def __init__(self, name):super(Gun, self).__init__()self.name = name#用來(lái)記錄槍的類型self.danjia = None#用來(lái)記錄彈夾對(duì)象的引用此時(shí)我們需要測(cè)試彈夾信息和槍的信息
我們需要在彈夾中定義如下語(yǔ)句:
def __str__(self):return "彈夾的信息為:%d/%d"%(len(self.zidan_list), self.max_num)記錄子彈的剩余數(shù)/子彈的最大容量
而測(cè)試槍信息,我們?cè)跇屵@一類中定義了如下語(yǔ)句:
def __str__(self):if self.danjia:return "槍的信息為:%s, %s"%(self.name, self.danjia)else:return "槍的信息為:%s,這把槍中沒有彈夾"%(self.name)至此我們測(cè)試完成了如上所有操作
第七步老王拿槍,我們可以寫出如下語(yǔ)句:
老王.拿槍(槍)
#老王.拿槍(槍)laowang.naqiang(ak47)我們定義了naqiang這一方法,我們知道,只有人才會(huì)拿槍啊,所以我們需要在Person類中定義一個(gè)naqiang的方法:
def naqiang(self, gun_temp):"""拿起一把槍"""self.gun = gun_temp然后我們需要去測(cè)試一下測(cè)試?yán)贤鯇?duì)象
print(laowang)要測(cè)試一對(duì)象,我們需要定義些人的屬性,比如hp,所以我們?cè)赑erson類中進(jìn)行初始化的添加
def __init__(self, name):super(Person, self).__init__()self.name = nameself.gun = None#用來(lái)保存槍對(duì)象的引用self.hp = 100開始進(jìn)行一個(gè)測(cè)試:
def __str__(self):if self.gun:return "%s的血量為:%d, 他有槍 %s"%(self.name, self.hp, self.gun)else:return "%s的血量為%d, 他沒有槍"%(self.name, self.hp)到此我們完成了測(cè)試階段
第八步,我們?nèi)?chuàng)建一個(gè)敵人
#8. 創(chuàng)建一個(gè)敵人gebi_laosong = Person("隔壁老宋")print(gebi_laosong)再通過第九步,老王開槍打敵人
我們可以寫出如下語(yǔ)句:
老王.扣扳機(jī)(隔壁老宋)
#老王.扣扳機(jī)(隔壁老宋) laowang.kou_ban_ji(gebi_laosong)print(gebi_laosong)print(laowang)此時(shí)我們定義了一個(gè)kou_ban_ji的方法,通過調(diào)用這個(gè)方法,達(dá)到敵人hp減少的目的
所以我們需要在Person類中定義此方法:
def kou_ban_ji(self, diren):"""讓槍發(fā)射子彈去打敵人"""#槍.開火(敵人) self.gun.fire(diren)并且在此方法中又加定義了一個(gè)開槍的方法,而通過槍才能打出子彈,所以在Gun中定義了此方法
def fire(self, diren):"""槍從彈夾中獲取一發(fā)子彈,然后讓這發(fā)子彈去擊中敵人"""#先從彈夾中取子彈#彈夾.彈出一發(fā)子彈()zidan_temp = self.danjia.tanchu_zidan()#讓這個(gè)子彈去傷害敵人if zidan_temp:#子彈.打中敵人(敵人) zidan_temp.dazhong(diren)else:print("彈夾中沒有子彈了。。。。")并且我們進(jìn)行了子彈數(shù)測(cè)試
子彈要從彈夾中彈出去,我們繼續(xù)在Danjia中定義tanchu_zidan方法:
def tanchu_zidan(self):"""彈出最上面的那顆子彈"""if self.zidan_list:return self.zidan_list.pop()else:return None并且子彈打中人會(huì)讓人掉hp,所以我們需要在子彈中定義一個(gè)dazhong方法:
def dazhong(self, diren):"""讓敵人掉血"""#敵人.掉血(一顆子彈的威力) diren.xiao_xue(self.sha_shang_li)人會(huì)掉hp,繼續(xù)在Person類中定義xiao_xue方法:
def xiao_xue(self, sha_shang_li):"""根據(jù)殺傷力,掉相應(yīng)的血量"""self.hp -= sha_shang_li至此,通過測(cè)試,我們已經(jīng)完成了整個(gè)流程的設(shè)計(jì)和開發(fā),雖然很簡(jiǎn)單的一個(gè)問題,但是在程序設(shè)計(jì)階段,每一步驟都是緊密相連的,這就是作為一個(gè)程序狗每天需要面對(duì)的問題,看起來(lái)很冗長(zhǎng),其實(shí)思路并不復(fù)雜,一個(gè)不懂程序的人都能看懂的執(zhí)行步驟,我希望越來(lái)越多的人能夠喜歡編程,我們國(guó)家缺的就是這種人才,只要每個(gè)人多貢獻(xiàn)出自己的一份力量,AI的到來(lái)將離我們更近一步!!!
附上以上所提到的源碼,我進(jìn)行了匯總,源碼如下:
class Person(object):"""人的類"""def __init__(self, name):super(Person, self).__init__()self.name = nameself.gun = None#用來(lái)保存槍對(duì)象的引用self.hp = 100def 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_tempdef __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.namedef kou_ban_ji(self, diren):"""讓槍發(fā)射子彈去打敵人"""#槍.開火(敵人) self.gun.fire(diren)def xiao_xue(self, sha_shang_li):"""根據(jù)殺傷力,掉相應(yīng)的血量"""self.hp -= sha_shang_liclass Gun(object):"""槍類"""def __init__(self, name):super(Gun, self).__init__()self.name = name#用來(lái)記錄槍的類型self.danjia = None#用來(lái)記錄彈夾對(duì)象的引用def baocun_danjia(self, dan_jia_temp):"""用一個(gè)屬性來(lái)保存這個(gè)彈夾對(duì)象的引用"""self.danjia = dan_jia_tempdef __str__(self):if self.danjia:return "槍的信息為:%s, %s"%(self.name, self.danjia)else:return "槍的信息為:%s,這把槍中沒有彈夾"%(self.name)def fire(self, diren):"""槍從彈夾中獲取一發(fā)子彈,然后讓這發(fā)子彈去擊中敵人"""#先從彈夾中取子彈#彈夾.彈出一發(fā)子彈()zidan_temp = self.danjia.tanchu_zidan()#讓這個(gè)子彈去傷害敵人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#用來(lái)記錄彈夾的最大容量self.zidan_list = []#用來(lái)記錄所有的子彈的引用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 Noneclass 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():"""用來(lái)控制整個(gè)程序的流程"""#1. 創(chuàng)建老王對(duì)象laowang = Person("老王")#2. 創(chuàng)建一個(gè)槍對(duì)象ak47 = Gun("AK47")#3. 創(chuàng)建一個(gè)彈夾對(duì)象dan_jia = Danjia(20)#4. 創(chuàng)建一些子彈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:測(cè)試彈夾的信息#print(dan_jia)#test:測(cè)試槍的信息#print(ak47)#7. 老王拿槍#老王.拿槍(槍) laowang.naqiang(ak47)#test:測(cè)試?yán)贤鯇?duì)象print(laowang)#8. 創(chuàng)建一個(gè)敵人gebi_laosong = Person("隔壁老宋")print(gebi_laosong)#9. 老王開槍打敵人#老王.扣扳機(jī)(隔壁老宋) 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()?
轉(zhuǎn)載于:https://www.cnblogs.com/ECJTUACM-873284962/p/8552593.html
總結(jié)
以上是生活随笔為你收集整理的一个老王开枪案例带你一步一步领略程序开发的魅力的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 操作系统笔记(六)调度
- 下一篇: 最小公倍数核心算法记录