葛日波,徐佳輝
(大連理工大學(xué)城市學(xué)院,遼寧 大連 116600)
Python中字符串切片技術(shù)在游戲開發(fā)中的應(yīng)用研究
葛日波,徐佳輝
(大連理工大學(xué)城市學(xué)院,遼寧 大連 116600)
切片是Python內(nèi)置的重要技術(shù),也是它的一大特色,文章介紹Python中3種常用的內(nèi)置數(shù)據(jù)及數(shù)據(jù)切片技術(shù),結(jié)合具體的游戲項(xiàng)目,說明切片技術(shù)的應(yīng)用技巧及運(yùn)行效果。
Python;切片技術(shù);游戲開發(fā);應(yīng)用研究
Python是一種面向?qū)ο蟮某绦蛟O(shè)計(jì)語言,1989年由荷蘭人Guido van Rossum發(fā)明。Python是純粹的自由軟件,被業(yè)界昵稱為“膠水語言”,因?yàn)樗鼡碛胸S富的API和工具,程序員能夠輕松地使用C、C++、CPython來編寫擴(kuò)充模塊,Python編譯器本身也可以被集成到其他需要腳本語言的程序內(nèi)。開發(fā)時(shí)可以先使用Python快速生成程序的原型,再對(duì)其中有特別要求的部分,用更合適的語言改寫,然后封裝到Python中,進(jìn)而大大提高開發(fā)效率[1]。Python語法簡(jiǎn)潔清晰,具有簡(jiǎn)單、易學(xué)、免費(fèi)、開源、可移植、可擴(kuò)展、可嵌入、面向?qū)ο蟮群芏鄡?yōu)點(diǎn),使得它一經(jīng)問世就受到了大量用戶的青睞,成為當(dāng)前最受歡迎的程序設(shè)計(jì)語言之一[2]。尤其是從2004年以后,Python在編程領(lǐng)域的占有率一直處于穩(wěn)步上升之中。根據(jù)TIOBE最新統(tǒng)計(jì)數(shù)據(jù)顯示,Python已超越C#,與Java、C、C++一起成為全球最流行的四大語言之一[3]。
目前,Python已經(jīng)被廣泛應(yīng)用于后端開發(fā)、游戲開發(fā)、網(wǎng)站開發(fā)、科學(xué)運(yùn)算、大數(shù)據(jù)分析、云計(jì)算,人工智能等眾多領(lǐng)域。在Google內(nèi)部的很多項(xiàng)目,例如Google Engine都使用了Python,Google 招募了許多 Python 高手為他們快速開發(fā)服務(wù)。隨著微軟將Python納入.Net 平臺(tái),相信Python的將來會(huì)得到更加強(qiáng)勁的發(fā)展[4]。從國(guó)內(nèi)市場(chǎng)來看,隨著國(guó)家創(chuàng)新發(fā)展戰(zhàn)略的調(diào)整以及一些尖端技術(shù)領(lǐng)域包括機(jī)械制造、航空航天、移動(dòng)互聯(lián)、大數(shù)據(jù)、云計(jì)算,人工智能等的蓬勃發(fā)展,未來對(duì)Python開發(fā)者的需要求將是大量的。
以更短的時(shí)間、更低的投入開發(fā)出高性價(jià)比的軟件一直以來是計(jì)算機(jī)業(yè)界的理想和追求。Python語言的出現(xiàn),為上述理想的實(shí)現(xiàn)提供了有力支持。正因如此,才使得Python語言備受關(guān)注,并在業(yè)界得到了廣泛應(yīng)用,學(xué)習(xí)和追隨者不斷增加。專家預(yù)測(cè),未來市場(chǎng)對(duì)Python技術(shù)人才的需求十分巨大,高等院校作為人才培養(yǎng)的主體,積極探索Python技術(shù)人才的培養(yǎng)具有重要意義。切片是Python內(nèi)置的重要技術(shù),也是它的一大特色,可以大大提高編程效率。
Python內(nèi)部具有豐富的數(shù)據(jù)類型,這也是它應(yīng)用廣泛的原因之一。其中字符串、元組和序列是最常用的3種數(shù)據(jù)類型。元組和序列是Python專有的,其他語言如C、C++、Java沒有該數(shù)據(jù)類型。盡管大多數(shù)語言也有字符串?dāng)?shù)據(jù)類型或者支持對(duì)字符串的操作,但Python中的字符串功能更強(qiáng)大,操作起來更方便。
1)創(chuàng)建字符串。
創(chuàng)建字符串很簡(jiǎn)單,只要為變量分配一個(gè)值即可,分配的值可以使用引號(hào)('或")進(jìn)行定界[5]。例如:
上面的代碼是創(chuàng)建字符串類型的兩條語句,分別創(chuàng)建了名字為var1、var2的字符串類型的變量,它們的值分別是“Hello World! ”和“12345”,其中var1的值使用單引號(hào)進(jìn)行定界,而var2的值使用雙引號(hào)進(jìn)行定界。
2)創(chuàng)建列表。
創(chuàng)建列表也很簡(jiǎn)單,只要把用逗號(hào)分隔的數(shù)據(jù)項(xiàng)用方括號(hào)括起來即可[6]。例如:
上面的3條語句分別定義了3個(gè)列表類型的變量list1、list2和list3,每條語句后面使用方括號(hào)括起來的多個(gè)用逗號(hào)隔開的數(shù)據(jù)項(xiàng)就是該列表變量的值。列表中的數(shù)據(jù)項(xiàng)可以是同種類型,也可以是不同類型,可以是包括列表和元組在內(nèi)任意數(shù)據(jù)類型。
3)創(chuàng)建元組。
創(chuàng)建元組與列表很類似,所不同的是要使用圓括號(hào)把數(shù)據(jù)項(xiàng)列表括起來[7]。例如:
上面的3條語句分別定義了3個(gè)元組類型的變量tup1、tup2和tup3。
需要說明的是,列表和元組在定義和使用上非常相似,所不同的是列表中的數(shù)據(jù)允許改變,而元組中的數(shù)據(jù)不可以改變。拿前面的例子來說,list1中的1997可以修改為1998,而tup1中的1997是不能修改的。元組和列表類型的引入,為處理復(fù)雜問題提供了支持。
使用Python系統(tǒng)提供的len函數(shù)可以獲取字符串、元組、列表中數(shù)據(jù)項(xiàng)的個(gè)數(shù)。一般格式是:
len(變量名)
以前面定義的數(shù)據(jù)為例:len(var1)的結(jié)果是12,len(list1)的結(jié)果是4,len(tup3)的結(jié)果是4。
字符串、元組、列表訪問數(shù)據(jù)的格式是一致的,都采用變量名后跟索引的方式。索引是用方括號(hào)括起來的一個(gè)數(shù)字。訪問數(shù)據(jù)的一般格式為:
變量名[數(shù)字]
數(shù)字表示數(shù)據(jù)項(xiàng)在集合中的位置,可以是非負(fù)數(shù),也可以是負(fù)數(shù)。當(dāng)數(shù)字為非負(fù)數(shù)時(shí),數(shù)據(jù)項(xiàng)的位置從左至右計(jì)算,依次為0,1,2,…,n-1;當(dāng)數(shù)字為負(fù)數(shù)時(shí),數(shù)據(jù)項(xiàng)的位置從右至左計(jì)算,依次為-1,-2,…,-n,這里的n是數(shù)據(jù)項(xiàng)的個(gè)數(shù)。圖1給出的是以var2和list1為例確定的數(shù)字與數(shù)據(jù)項(xiàng)位置之間的對(duì)應(yīng)關(guān)系。
圖1 索引數(shù)字與數(shù)據(jù)項(xiàng)之間的對(duì)應(yīng)關(guān)系示意圖
按照這種對(duì)應(yīng)關(guān)系,以前面定義的例子來說,Var1[0]的值是字符H,Var2[4]的值是字符5,list1[1]的值是字符串‘chemistry’,list2[3]的值是4,tup1[3]的值是2 000,tup3[2]的值是字符串“c”;Var1[-1]的值是字符!,Var2[-5]的值是字符1,list1[-4]的值是字符串‘chemistry’,tup3[-2]的值是字符串“c“。
字符串、列表、元組都是包含多個(gè)數(shù)據(jù)項(xiàng)的集合。在實(shí)際應(yīng)用中,經(jīng)常需要從給定的數(shù)據(jù)集合中提取符合條件的數(shù)據(jù)項(xiàng)。簡(jiǎn)單地說,就是從一個(gè)大的數(shù)據(jù)集合中提取其子集。Python中的切片技術(shù)正是為實(shí)現(xiàn)這一目的而設(shè)計(jì)的。切片顧名思義就是對(duì)數(shù)據(jù)實(shí)施分割的一種方法。字符串、列表、元組都可以實(shí)現(xiàn)切片操作[8]。切片操作的一般格式是:
變量名[數(shù)字1:數(shù)字2:數(shù)字3]
上述操作的作用是:從數(shù)字1開始,以數(shù)字3為間隔,截取從數(shù)字1到數(shù)字2之間(不包括數(shù)字2)的數(shù)據(jù)項(xiàng),結(jié)果仍然是原來的數(shù)據(jù)類型。換言之,切片獲得結(jié)果的數(shù)據(jù)類型與被切片對(duì)象的數(shù)據(jù)類型一致。需要說明的是,3個(gè)數(shù)字均可以省略不寫,但第一個(gè)冒號(hào)不可以省略。當(dāng)省略數(shù)字1時(shí),系統(tǒng)默認(rèn)為0,當(dāng)省略數(shù)字2時(shí),系統(tǒng)默認(rèn)為n(n為數(shù)據(jù)項(xiàng)個(gè)數(shù)),省略數(shù)字3時(shí),系統(tǒng)默認(rèn)為1。 基于前面創(chuàng)建的數(shù)據(jù)實(shí)例,下面給出了一些實(shí)施切片操作的情況:
切片技術(shù)的引入使得數(shù)據(jù)的分割變得異常簡(jiǎn)單,可以大大簡(jiǎn)化代碼,提高編程效率。
程序運(yùn)行時(shí),先輸出一個(gè)歡迎界面,然后自行從程序內(nèi)置的單詞表中隨機(jī)選取一個(gè)單詞,將單詞中的字母順序打亂構(gòu)成一個(gè)新的字符序列,將新構(gòu)的字符序列顯示給玩家,玩家根據(jù)程序給出的字符序列,猜測(cè)正確的單詞并通過鍵盤輸入方式提交,程序把玩家輸入的單詞和正確的單詞進(jìn)行比較,如果猜對(duì)了就輸出祝賀信息并結(jié)束程序;如果猜錯(cuò)了就給出猜錯(cuò)了的信息并提示玩家繼續(xù)猜,一直進(jìn)行到玩家猜對(duì)為止[9]。
開發(fā)程序必須從設(shè)計(jì)入手,設(shè)計(jì)包括數(shù)據(jù)結(jié)構(gòu)和算法兩部分。數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)是對(duì)程序中用到的變量及其類型進(jìn)行描述的過程,算法設(shè)計(jì)則是對(duì)解決問題的方法和步驟的描述[10]。
1)數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)。
通過分析,猜詞游戲程序中用到的變量共有6個(gè),它們的名字、類型與作用見表1。
表1 猜詞游戲用到的變量情況一覽表
2)算法設(shè)計(jì)。
圖2給出猜詞游戲完整的流程圖。進(jìn)行算法設(shè)計(jì)時(shí),應(yīng)該按照自上而下、逐層展開的原則進(jìn)行。初次設(shè)計(jì)時(shí),可以把程序的執(zhí)行分為以下5個(gè)步驟。
圖2 猜詞游戲完整的流程圖
步驟1:輸出歡迎界面。
步驟2:從單詞表WORDS中隨機(jī)抽取一個(gè)單詞存到word和correct中。
步驟3:把word中的字母順序打亂后存到j(luò)umble中。
步驟4:輸出jumble。
步驟5:提示用戶通過反復(fù)輸入guess來猜correct。
上面的5個(gè)步驟中,步驟1、步驟2和步驟4已經(jīng)足夠清晰,且很容易實(shí)現(xiàn),不需要再進(jìn)行設(shè)計(jì);步驟3和步驟5不夠明確,需要進(jìn)一步設(shè)計(jì)。步驟3是整個(gè)程序的關(guān)鍵部分,需要通過切片技術(shù)得以實(shí)現(xiàn)。該步驟可繼續(xù)分為以下5個(gè)步驟。
步驟3-1:創(chuàng)建一個(gè)空字符串jumble。
步驟3-2:若word非空則執(zhí)行步驟3-3,否則執(zhí)行步驟3-5。
步驟3-3:從word中隨機(jī)抽取一個(gè)字母存到j(luò)umble中。
步驟3-4:利用切片技術(shù)把已經(jīng)抽取出的那個(gè)字母從word中刪除,返回步驟3-2。
步驟3-5:結(jié)束步驟3。
上面的5個(gè)步驟中,步驟3-3需要進(jìn)一步設(shè)計(jì)。該步驟可繼續(xù)分解為以下兩個(gè)步驟:
步驟3-3-1:生成一個(gè)word長(zhǎng)度范圍內(nèi)的隨機(jī)整數(shù)存到position中。
步驟3-3-2:把position位置的那個(gè)字母word[position]存到j(luò)umble中。
鑒于篇幅的限制,有關(guān)步驟5的分解此處不作介紹,大家可以參照?qǐng)D2給出的整個(gè)算法完整的流程圖自己獨(dú)立完成分解。由于切片技術(shù)是解決問題的關(guān)鍵所在,此處給出切片實(shí)現(xiàn)的具體代碼如下。
word = word[:position] + word[(position+1):]
猜詞游戲在Python3.2開發(fā)環(huán)境中完成編碼和調(diào)試,運(yùn)行效果如圖3~圖5所示。
圖3 程序啟動(dòng)初始畫面
圖4 猜錯(cuò)時(shí)程序的運(yùn)行畫面
圖5 猜對(duì)時(shí)程序結(jié)束運(yùn)行的畫面
猜詞游戲的實(shí)現(xiàn)過程和運(yùn)行效果證明切片技術(shù)對(duì)算法優(yōu)化、精簡(jiǎn)代碼和提高運(yùn)行效率作用明顯。本文重點(diǎn)討論的是利用字符串切片技術(shù)解決猜詞游戲算法的設(shè)計(jì)和實(shí)現(xiàn),使用的純字符界面風(fēng)格,單詞表也是內(nèi)置在程序中,玩家無法干預(yù),在一定程度上影響了游戲的趣味性以及玩家的參與度和沉浸感,可以利用Python的GUI庫,文件操作和數(shù)據(jù)庫技術(shù)繼續(xù)完善。
[1] 嵩天, 黃天羽, 禮欣. Python語言: 程序設(shè)計(jì)課程教學(xué)改革的理想選擇[J].中國(guó)大學(xué)教學(xué), 2016(2): 42-47.
[2] 楊佩璐, 宋強(qiáng). Python寶典[M]. 北京: 電子工業(yè)出版社, 2014.
[3] 管華. 對(duì)當(dāng)今Python快速發(fā)展的研究與展望[J]. 信息系統(tǒng)工程, 2015(12): 114-116.
[4] 稱王. Python就業(yè)前景分析[EB/OL]. (2015-03-20)[2017-07-31]. http://forum.maiziedu.com/thread-696-1-1.html.
[5] 玩蛇網(wǎng). Python 字符串是什么及簡(jiǎn)單操作方法[EB/OL]. (2016-01-21)[2017-07-31]. http://www.iplaypy.com/jichu/str.html.
[6] Hetland M L. Python基礎(chǔ)教程[M]. 北京: 人民郵電出版社, 2010.
[7] Punch W F, Enbody R. Python入門經(jīng)典[M]. 張敏, 等譯. 北京: 機(jī)械工業(yè)出版社, 2012.
[8] Barry P. 深入淺出Python[M]. 南京: 東南大學(xué)出版社, 2011.
[9] Dawson M. Python編程初學(xué)者指南[M]. 北京: 人民郵電出版社, 2014.
[10] 吳萍, 朱晴婷, 蒲鵬, 等. 算法與程序設(shè)計(jì)基礎(chǔ)(Python版)[M]. 北京: 清華大學(xué)出版社,2015.
1672-5913(2017)11-0111-04
G642
遼寧省2017年度大學(xué)生創(chuàng)新訓(xùn)練項(xiàng)目(201713198000004)。
葛日波,男,教授,研究方向?yàn)樗惴ɡ碚撆c應(yīng)用研究,ececity@dlut.edu.cn
(編輯:彭遠(yuǎn)紅)