基于Python的貪吃蛇游戲設(shè)計(jì)與實(shí)現(xiàn)_第1頁
基于Python的貪吃蛇游戲設(shè)計(jì)與實(shí)現(xiàn)_第2頁
基于Python的貪吃蛇游戲設(shè)計(jì)與實(shí)現(xiàn)_第3頁
基于Python的貪吃蛇游戲設(shè)計(jì)與實(shí)現(xiàn)_第4頁
基于Python的貪吃蛇游戲設(shè)計(jì)與實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

一、緒論(一)研究現(xiàn)狀與背景游戲是如今社會(huì)非常火熱的娛樂活動(dòng)之一,特別是在進(jìn)入網(wǎng)絡(luò)時(shí)代之后,各種各樣的游戲如雨后春筍般的涌現(xiàn)。有些游戲如日中天,讓游戲公司賺的盆滿缽滿,而有些游戲的壽命卻如曇花一現(xiàn)般短暫,隱于塵埃。但是不管哪款游戲,都一定有它存在的價(jià)值,或是推動(dòng)游戲行業(yè)的發(fā)展,或是給人們帶來歡樂。當(dāng)然,對(duì)于人們來說,影音視頻、電子閱讀、K歌娛樂,旅游都是不錯(cuò)的娛樂選擇。但是隨著現(xiàn)代化建設(shè)的不斷加快,這些傳統(tǒng)的娛樂方式,早已滿足不了人們的需求,而游戲也就是在這個(gè)時(shí)候漸漸走入人們的視野。不管是出于打發(fā)閑暇時(shí)光的想法,還是放松在忙碌一天之后的疲憊身心,游戲已經(jīng)是很多人的第一選擇。換一種說法,現(xiàn)在年輕人的生活之中也越來越離不開游戲。早在1976年,美國(guó)街機(jī)游戲生產(chǎn)商\t"/item/%E8%B4%AA%E9%A3%9F%E8%9B%87/_blank"Gremlin便推出了在后來引領(lǐng)了游戲行業(yè)的這么一款經(jīng)典街機(jī)游戲,Blockade。玩法就如同它的名字一樣,封鎖,屏幕上會(huì)有兩個(gè)游戲角色,而兩位玩家分別去控制自己角色的左右行進(jìn)方向,經(jīng)過的地方則會(huì)生成障礙物,誰先碰到障礙物則誰輸?shù)袅擞螒?。Blockade游戲一經(jīng)推出便受到大眾追捧,游戲公司紛紛效仿開發(fā)類似游戲,也出現(xiàn)在各種操作平臺(tái)上。但是真正讓這種游戲形式家喻戶曉,走向世界的還是諾基亞公司在21年之后推出的手機(jī)產(chǎn)品上搭載的貪吃蛇游戲——Snake。貪吃蛇的規(guī)則是,用鍵盤操控屏幕里小蛇的行進(jìn)方向去吃豆子,吃的豆子越多小蛇的身體則會(huì)越來越長(zhǎng),蛇頭觸碰到蛇身或是障礙物時(shí)則游戲結(jié)束。由于貪吃蛇游戲玩法簡(jiǎn)單、硬件要求低,無論是上廁所時(shí)、排隊(duì)時(shí)、等待汽車時(shí),它都能滿足各種需求場(chǎng)景下的應(yīng)用。而在那個(gè)游戲行業(yè)競(jìng)爭(zhēng)并不大的時(shí)代,使得它能做到人盡皆知。相對(duì)于其它游戲來說,貪吃蛇是一個(gè)帶有悲劇性的游戲。很多游戲都是的規(guī)則是玩家打到通關(guān),以游戲操縱者的勝利而告終,但是貪吃蛇確是以小蛇的死亡結(jié)束游戲。不管你玩法多么嫻熟,有多高超的技藝,隨著小蛇的身體增長(zhǎng)只會(huì)離死亡越來越近,離游戲的結(jié)束也越來越近,在蛇身越來越長(zhǎng)的時(shí)候肯能你考慮的不再是如何去吃到豆子,而是如何避免蛇頭碰到蛇身或是障礙?;蛟S貪吃蛇想告訴我們的道理是不要疲于奔命,要做到生活和事業(yè)兼顧。樹大招風(fēng),福兮禍倚,隨時(shí)面對(duì)生活中可能發(fā)生的一切。我相信每款游戲都能給我們帶來一定的積極意義。(二)行性分析科學(xué)性、預(yù)見性、公正性、可靠性是一個(gè)項(xiàng)目可行性分析必須具備的特點(diǎn)。但是由于此次的項(xiàng)目并不會(huì)上線或作商用盈利,所以本文的可行性分析僅對(duì)我個(gè)人而言闡述。本次畢業(yè)設(shè)計(jì)的可行性分析大致包括以下三個(gè)方面。經(jīng)濟(jì)可行性,此次畢業(yè)設(shè)計(jì)開發(fā)的是一個(gè)小型單機(jī)貪吃蛇游戲系統(tǒng),對(duì)于現(xiàn)在的個(gè)人筆記本電腦硬件來說完全可以承擔(dān)此次系統(tǒng)開發(fā)的語言編寫、測(cè)試以及運(yùn)行等任務(wù)。而開發(fā)人員分配方面,個(gè)人足以完成此次系統(tǒng)開發(fā)的全部任務(wù),所需預(yù)算不大。綜上,此次的系統(tǒng)設(shè)計(jì)經(jīng)濟(jì)可行性通過。技術(shù)可行性指的是開發(fā)者所擁有的技術(shù)以及資源是否能滿足項(xiàng)目的開發(fā)任務(wù)。此次貪吃蛇小游戲的開發(fā)語言,我選擇的是Python。Python是一種面向?qū)ο蟮木幊陶Z言,同時(shí)具有低級(jí)語言與高級(jí)語言的優(yōu)點(diǎn)[1]。整個(gè)系統(tǒng)完全可以依靠Python強(qiáng)大的標(biāo)準(zhǔn)庫以及第三方庫來實(shí)現(xiàn),它在代碼的模塊化要求上也有一定的保證,方便游戲在各個(gè)平臺(tái)上的移植,減少不必要的工作量,也有利于代碼的讀寫與修改。本系統(tǒng)所需語言技術(shù)開發(fā)層面不高,而且Python語法簡(jiǎn)單明了,開發(fā)人員完全可以單獨(dú)實(shí)現(xiàn)整個(gè)系統(tǒng)的開發(fā)。運(yùn)行可行性,單機(jī)版貪吃蛇小游戲所消耗的各類資源非常小。無論是公共場(chǎng)所的電腦還是個(gè)人電腦,以及移植到其他類型的平臺(tái)上,在軟件和硬件上都能夠滿足運(yùn)行所需要的基本條件。而且游戲操作簡(jiǎn)單,玩家只需在知道游戲規(guī)則的情況下便能進(jìn)行游戲。二、需求分析(一)功能性需求不管一款什么樣的軟件都應(yīng)該實(shí)現(xiàn)它相對(duì)的功能,而此次的貪吃蛇作為一款小型的單機(jī)游戲作用就是為人們提供多樣化休閑娛樂的選擇之一。簡(jiǎn)單性,毋庸置疑這是貪吃蛇應(yīng)有的特點(diǎn),不論是操作簡(jiǎn)單還是游戲內(nèi)容簡(jiǎn)單,都能使得它能面向各個(gè)年齡階段的人群。對(duì)于那些全身心投入工作、整日奔波的人來說,他們不可能投入過多的時(shí)間和精力在游戲上,所以貪吃蛇這類小游戲是一個(gè)不錯(cuò)的選擇,也能滿足其娛樂需求。也正是因?yàn)楹?jiǎn)單性,貪吃蛇沒有像其他大型游戲的趣味性和豐富度。所以,為了增加游戲的競(jìng)爭(zhēng)力,本次的系統(tǒng)將加入游戲難度選擇模塊。(二)非功能性需求軟件產(chǎn)品開發(fā)設(shè)計(jì)不僅僅只是把滿足用戶業(yè)務(wù)需求作為第一要素,而且還應(yīng)該具備其他一些重要的特性,比如系統(tǒng)的可靠性、可擴(kuò)充性、適應(yīng)性以及性能等。而這就是非功能性需求。貪吃蛇作為此次畢業(yè)設(shè)計(jì)的論題,它應(yīng)該具備的就是可靠性和比較好的系統(tǒng)UI界面。對(duì)于可靠性來說,此次運(yùn)用的是Python來編寫系統(tǒng),所以不管是代碼的維護(hù)性還是程序響應(yīng)速度都能夠得到很好的保證。而一個(gè)好的系統(tǒng)UI界面能夠讓用戶在除了享受游戲帶來的樂趣之外,帶來更好的一個(gè)觀感,也從另一方面增加了產(chǎn)品的競(jìng)爭(zhēng)力。三、游戲及開發(fā)工具簡(jiǎn)介(一)游戲簡(jiǎn)介本次設(shè)計(jì)的游戲——貪吃蛇,是一種消遣益智類的小游戲。在用戶進(jìn)入游戲開始界面時(shí)選擇對(duì)應(yīng)游戲難度即可開始游戲,游戲之初是一條很短的小蛇在屏幕上行進(jìn),而用戶則是通過方向鍵控制小蛇的方向去吃掉游戲中的食物,吃到的食物越多蛇的身體就會(huì)越長(zhǎng)、分?jǐn)?shù)也會(huì)越高。游戲進(jìn)行到中后期時(shí),越來越長(zhǎng)的小蛇更需要用戶小心的操控,不僅在給玩家?guī)硪欢ǖ膴蕵沸缘耐瑫r(shí)也是對(duì)大腦反應(yīng)速度的一種鍛煉。當(dāng)蛇頭觸碰到蛇身或是屏幕邊緣時(shí),則游戲結(jié)束。(二)Python簡(jiǎn)介1.Python的運(yùn)行原理作為一種解釋型腳本語言,Python的運(yùn)行原理和C與C++相比大不相同。那解釋型腳本語言又是什么呢?大家都知道高級(jí)語言對(duì)于計(jì)算機(jī)而言是不能直接識(shí)別的,所以當(dāng)開發(fā)者想要運(yùn)行一個(gè)由高級(jí)語言編寫的程序的時(shí)候就需要一個(gè)合適的“翻譯器”來作為一個(gè)中間介質(zhì),把編寫程序的高級(jí)語言轉(zhuǎn)變成計(jì)算機(jī)能直接識(shí)別的機(jī)器語言。這個(gè)轉(zhuǎn)換過程也大致可以分為兩類,一是編譯,二是解釋[2]。在我們運(yùn)行以.py結(jié)尾的Python程序時(shí),Python解釋器會(huì)把由高級(jí)語言組成的源代碼編譯成字節(jié)碼然后提交到PVM(PythonVirtualMachine,Python虛擬機(jī),它是Python的運(yùn)行引擎)中做進(jìn)一步處理之后執(zhí)行程序,最后由Python輸出結(jié)果[3]。運(yùn)行原理如圖3-1所示。圖3-1Python運(yùn)行原理圖2.Python的特點(diǎn)“簡(jiǎn)單、明確、優(yōu)雅”是Python遵循的設(shè)計(jì)理念[4],相較于其他編程語言更容易上手,代碼也更具可讀性。因?yàn)镻ython開源的本質(zhì),使得它的移植性很高,開發(fā)人員只需做少許修改便可將程序移植到其它平臺(tái),這包含了市面上大部分主流平臺(tái),如Windows、Linux、OS/2、FreeBSD、Solaris、VMS等。其次,Python具有良好的可擴(kuò)展性,如果開發(fā)者由于某種原因并不想程序中的部分算法被公開,則這部分可以用C或C++來編寫,它們同樣可以在Python程序中運(yùn)行,要是想提高某一段代碼的運(yùn)行速度也可以使用同樣的方法來實(shí)現(xiàn)[5]。再者,Python也因其可嵌入性被人們經(jīng)常戲稱為膠水語言,不同語言編寫的不同模塊都能通過Python而結(jié)合在一起,從而給用戶提供高效能的腳本功能,而在那些真正需要運(yùn)用其他語言優(yōu)化的地方,Python都有強(qiáng)大的庫和API支持[6]。Python豐富的庫更是讓其成為“黃金語言”的一大因素,除了內(nèi)置的標(biāo)準(zhǔn)庫以外,Python社區(qū)更是提供了海量的第三方庫Twisted、wxPython、Python圖像庫等。這些庫在處理電子郵件、文檔生成、正則表達(dá)式、密碼系統(tǒng)、數(shù)據(jù)庫、圖形用戶界面(GUI)、FTP、單元測(cè)試等眾多工作上提供了不少便攜。這也是為什么眾多項(xiàng)目選擇Python作為核心語言的原因,它被廣泛運(yùn)用于大數(shù)據(jù)分析、圖像處理、爬蟲、Web、自動(dòng)化測(cè)試等領(lǐng)域。我相信當(dāng)大家熱衷于某一款軟件時(shí),并不單單是因?yàn)樗鶐淼母鞣N利好,還因?yàn)橛幸蝗号c你志同道合的人,你們可以探討使用時(shí)的心得、可以暢想軟件的迭代。人生不是孤獨(dú)的旅行,編程也不會(huì)是。每個(gè)人都會(huì)在項(xiàng)目開發(fā)中遇到不同的問題,大多數(shù)程序員都渴望有那么一個(gè)互幫互助、聯(lián)系緊密的社區(qū)或是平臺(tái)。程序員可以在這里向解決過類似問題的人尋求幫助或是建議,而Python社區(qū)對(duì)我這種初學(xué)者而言無疑是堅(jiān)強(qiáng)的后盾[7]。3.PyGame簡(jiǎn)介PyGame是Python眾多庫中的一個(gè),PyGame可以用來繪制圖形、實(shí)現(xiàn)動(dòng)畫以及讓游戲按照設(shè)定幀率平穩(wěn)運(yùn)行。它是基于SDL(SimpleDirectMediaLayer)寫就的游戲庫。而與DirectX(微軟公司創(chuàng)建的多媒體營(yíng)運(yùn)程序接口)相當(dāng)?shù)腟DL的用途是用來控制多媒體的跨平臺(tái)庫,被用于數(shù)百種游戲之中。開發(fā)者在最初的目標(biāo)是讓做困難的事情變簡(jiǎn)單,讓容易的事情變得更容易,于是將SDL和Python兩者結(jié)合起來組建成了現(xiàn)在的PyGame。由于PyGame讓游戲變得動(dòng)態(tài)起來所采用的是幀更新和輪詢的方式(幀更新就是不斷地更新畫面,輪詢則是不斷地詢問用戶輸入),在繪制比較復(fù)雜的圖像的時(shí)候會(huì)出現(xiàn)“卡幀”現(xiàn)象,所以PyGame并不適合制作大型游戲以及3D游戲,而對(duì)于2D游戲則能起到不小幫助[8,9]。本次貪吃蛇游戲系統(tǒng)設(shè)計(jì)所需要用到的框架以及常用函數(shù)都包含在PyGame之中,處于開發(fā)時(shí)間成本的考慮,本項(xiàng)目會(huì)直接調(diào)用PyGame。PyGame的使用步驟如下:首先是導(dǎo)入PyGame庫及其中所包含的常量至Python程序中,然后經(jīng)過初始化之后我們就可以在代碼中訪問并調(diào)用PyGame中的所有資源。importpygame#導(dǎo)入pygame模塊frompygame.localsimport*#導(dǎo)入pygame中的常量pygame.init()#初始化pygame(三)PyCharm簡(jiǎn)介所謂工欲善其事必先利其器,PyCharm從眾多程序開發(fā)應(yīng)用中脫穎而出。它不僅擁有其他類似IDE的功能,如調(diào)試、項(xiàng)目管理、語法高亮、版本控制、單元測(cè)試等,還提供了供Web開發(fā)人員使用的Django框架,大大增加了開發(fā)人員的生產(chǎn)效率[10]。在本次的系統(tǒng)開發(fā)中可能用到最多的兩個(gè)功能就是代碼補(bǔ)全和智能重構(gòu),所以PyCharm在本次項(xiàng)目中也起到不小作用。四、概要設(shè)計(jì)(一)功能介紹本貪吃蛇游戲系統(tǒng)的實(shí)現(xiàn)就是在屏幕顯示區(qū)域內(nèi)繪制出一條小蛇,同時(shí)在與小蛇身體不重合的屏幕顯示區(qū)域內(nèi)繪制出一個(gè)食物,游戲玩家通過鍵盤上的方向鍵來操控小蛇的行進(jìn)方向去吃掉食物,食物被吃掉后又會(huì)在顯示區(qū)域內(nèi)隨機(jī)出現(xiàn)另一個(gè)食物,而小蛇每吃下一個(gè)食物身體便會(huì)增長(zhǎng)一段,如此反復(fù),蛇越長(zhǎng)時(shí)則對(duì)游戲玩家來說越難操作。當(dāng)蛇的頭部撞擊到屏幕邊緣或是蛇身的任意一個(gè)部位的時(shí)候,游戲結(jié)束[11]。貪吃蛇游戲?qū)崿F(xiàn)的關(guān)鍵就在于蛇身圖形組建和蛇行進(jìn)軌跡的繪制。我們可以通過畫小矩形塊(rect屬性)的方式來畫出小蛇,在小蛇的每次移動(dòng)的時(shí)候,刪掉蛇身的最后一個(gè)矩形塊,在蛇頭增加一個(gè)新的矩形塊,就相當(dāng)于把蛇的最后一個(gè)矩形塊加在蛇頭的位置。小蛇每移動(dòng)一個(gè)單位,屏幕就重新繪制一次,這樣就可以實(shí)現(xiàn)小蛇行進(jìn)的動(dòng)態(tài)效果。而在蛇吃下食物的時(shí)候,蛇頭覆蓋食物,在蛇尾加上一個(gè)小矩形塊,同時(shí)利用random模塊隨機(jī)繪制另一個(gè)食物(上一個(gè)食物此時(shí)消失)[12]。(二)程序流程設(shè)計(jì)1.程序流程圖本次設(shè)計(jì)的游戲程序運(yùn)行的流程框圖如圖4-1所示。圖4-1程序流程框圖2.界面設(shè)計(jì)首先定義程序運(yùn)行界面的大小,背景色等,便于在各個(gè)界面顯示統(tǒng)一,為玩家提供更好的觀感。游戲界面分為:開始界面、游戲界面和結(jié)束界面。在開始界面時(shí),程序運(yùn)行窗口左上角顯示自定義的游戲名稱,居中位置顯示導(dǎo)入的背景圖片,下方顯示玩法說明及操作指南;在游戲界面時(shí),整個(gè)程序窗口用于游戲,小蛇可在窗口中任意行進(jìn),食物顯示為藍(lán)色圓形,右上角顯示玩家分?jǐn)?shù),每吃掉一個(gè)食物增加一分;當(dāng)游戲結(jié)束時(shí),顯示結(jié)束界面,窗口居中位置為“GameOver”字樣圖片,下方則顯示游戲提示“請(qǐng)按任意鍵重新游戲或Esc鍵退出游戲”。3.功能設(shè)計(jì)除了游戲的基本功能實(shí)現(xiàn)之外,為了增加游戲的可玩性設(shè)置了F1加速、F2減速、F3無敵等功能。在游戲中還添加了暫停功能,玩家可通過SPACE鍵來暫停/繼續(xù)游戲。每當(dāng)玩家吃到5個(gè)食物時(shí)隨機(jī)生成一堵長(zhǎng)度在1-5之間的障礙物,而且速度也會(huì)增加。在游戲結(jié)束時(shí),可按除ESC以外的任意鍵來重新開始游戲,按ESC鍵則退出程序。(三)游戲過程游戲開始時(shí)小蛇會(huì)有一個(gè)初始方向,如果玩家不輸入有效的方向操作,小蛇則會(huì)一直按次方向前進(jìn),而且小蛇的不能反方向移動(dòng),也就是說不能將蛇尾當(dāng)作蛇頭來移動(dòng)。當(dāng)用戶鍵入有效的方向之后,蛇頭會(huì)率先朝玩家給定的方向移動(dòng),而蛇身隨著蛇頭的移動(dòng)而移動(dòng)(覆蓋此前的軌跡)。貪吃蛇移動(dòng)實(shí)現(xiàn)的方式就是在移動(dòng)的方向繪制一個(gè)矩形塊當(dāng)作蛇頭,而蛇尾則刪掉一個(gè)矩形塊,整條蛇重新繪制刷新在屏幕中,這樣看起來蛇就向前移動(dòng)了一個(gè)單位的距離。在本系統(tǒng)中游戲的碰撞檢測(cè)包含了三種情況:一是蛇吃到食物,此時(shí)蛇身增加一個(gè)矩形塊;二是蛇頭和蛇身的碰撞,此時(shí)游戲結(jié)束;三是蛇頭與障礙物的碰撞,正常情況下游戲也會(huì)結(jié)束(無敵模式下貪吃蛇不會(huì)死亡)。五、系統(tǒng)實(shí)現(xiàn)本次系統(tǒng)設(shè)計(jì)用到的主要模塊及作用如下表5-1所示。表5-1貪吃蛇系統(tǒng)主要模塊 模塊作用pygamePython的跨平臺(tái)模塊,用于游戲開發(fā)os操作系統(tǒng)相關(guān)的操作和調(diào)用sys系統(tǒng)信息和接口random生成隨機(jī)實(shí)數(shù)time時(shí)間模塊,控制游戲幀率(一)功能概覽本次系統(tǒng)設(shè)計(jì)用到的主要函數(shù)及作用如下表5-2所示。表5-2貪吃蛇系統(tǒng)主要函數(shù)函數(shù)作用main()主函數(shù),控制游戲進(jìn)程running_game游戲運(yùn)行主體draw_food畫出食物draw_snake畫出貪吃蛇move_snake貪吃蛇的移動(dòng)snake_is_alive貪吃蛇的碰撞檢測(cè)get_random_location生成隨機(jī)食物show_start_info顯示開始信息show_gameover_info顯示結(jié)束信息event.get()監(jiān)聽鍵盤事件draw_wall生成障礙物(二)構(gòu)建開始界面游戲的開始界面應(yīng)該首先定義好窗口的大小,所需要用到的顏色、字體,導(dǎo)入歡迎界面的背景圖片。接下來就是界面的布局以及鍵盤和鼠標(biāo)的監(jiān)聽檢測(cè)。主要代碼如下:defshow_start_info(screen):#設(shè)置游戲提示,導(dǎo)入背景圖片font=pygame.font.Font(base+'\\myfont.ttf',40)tip=font.render('請(qǐng)選擇游戲難度',True,(65,105,225))gamestart=pygame.image.load(base+'\\111.jpg')#將各個(gè)模塊繪制到相應(yīng)位置screen.blit(gamestart,(140,30))screen.blit(tip,(240,550))pygame.display.update()#定義蛇的初始速度globalsnake_speed#鼠標(biāo)以及鍵盤的監(jiān)聽事件,在開始界面按下除了ESC鍵之外的任意鍵即可開始游戲。鼠標(biāo)點(diǎn)擊按鈕也會(huì)立即開始游戲,且小蛇擁有不同的行進(jìn)速度。whileTrue:foreventinpygame.event.get():ifevent.type==QUIT:quitgame()elifevent.type==KEYDOWN:if(event.key==K_ESCAPE):quitgame()else:returnelifevent.type==pygame.MOUSEBUTTONDOWN:ifb1.pressed(pygame.mouse.get_pos()):snake_speed=5returnifb2.pressed(pygame.mouse.get_pos()):snake_speed=10returnifb3.pressed(pygame.mouse.get_pos()):snake_speed=15return(三)蛇與食物的繪制因?yàn)樵谟螒蜻\(yùn)行主體的函數(shù)中已經(jīng)定義好了使用random()函數(shù)生成的貪吃蛇、初始坐標(biāo)和食物坐標(biāo),這一段只需將貪吃蛇和食物在屏幕上使用.draw屬性繪制出來并給蛇和食物加上顏色即可。#定義draw_snake()函數(shù)將貪吃蛇畫出來defdraw_snake(screen,snake_coords):#設(shè)定蛇的位置forcoordinsnake_coords:x=coord['x']*snake_sizey=coord['y']*snake_size#蛇身的第一層顏色wormSegmentRect=pygame.Rect(x,y,snake_size,snake_size)pygame.draw.rect(screen,Green,wormSegmentRect)#蛇身的第二層顏色wormInnerSegmentRect=pygame.Rect(x+4,y+4,snake_size-8,snake_size-8)pygame.draw.rect(screen,blue,wormInnerSegmentRect)#食物的坐標(biāo)位置等于食物的相對(duì)坐標(biāo)乘以蛇的單位大小defdraw_food(screen,food):x=food['x']*snake_sizey=food['y']*snake_sizeappleRect=pygame.Rect(x,y,snake_size,snake_size)#使用.draw屬性畫出食物pygame.draw.rect(screen,Red,appleRect)(四)蛇的移動(dòng)這里只對(duì)蛇的行進(jìn)坐標(biāo)的改變做出說明,蛇的行進(jìn)方向在其他模塊中做了鍵盤監(jiān)聽檢測(cè)的對(duì)應(yīng)定義。如果蛇的移動(dòng)方向是向上(這里的“上”指的是玩家視角的“上”),則蛇的新頭坐標(biāo)x值不變,y減一;如果蛇的移動(dòng)方向是向下,則蛇的新頭坐標(biāo)x值不變,y加一;如果蛇的移動(dòng)方向是向左,則蛇的新頭坐標(biāo)x值減一,y不變;如果蛇的移動(dòng)方向是向右,則蛇的新頭坐標(biāo)x值加一,y不變。defmove_snake(direction,snake_coords):ifdirection==UP:newHead={'x':snake_coords[HEAD]['x'],'y':snake_coords[HEAD]['y']-1}elifdirection==DOWN:newHead={'x':snake_coords[HEAD]['x'],'y':snake_coords[HEAD]['y']+1}elifdirection==LEFT:newHead={'x':snake_coords[HEAD]['x']-1,'y':snake_coords[HEAD]['y']}elifdirection==RIGHT:newHead={'x':snake_coords[HEAD]['x']+1,'y':snake_coords[HEAD]['y']}#插入蛇新頭的坐標(biāo),以實(shí)現(xiàn)蛇的動(dòng)態(tài)效果snake_coords.insert(0,newHead)(五)游戲運(yùn)行主體在running_game()函數(shù)中定義了蛇的初始位置及初始方向、速度。還對(duì)鍵盤監(jiān)聽事件做了對(duì)應(yīng)的綁定,四個(gè)方向鍵控制蛇的前進(jìn)方向,在游戲中按下SPACE鍵可使游戲暫停或繼續(xù),按下ESC鍵退出程序。F1貪吃蛇加速,F(xiàn)2貪吃蛇減速,F(xiàn)3開啟/關(guān)閉無敵模式。同時(shí),running_game()函數(shù)也是整個(gè)游戲的運(yùn)行主體,集合了程序中的大部分函數(shù)來控制游戲的進(jìn)程。defrunning_game(screen,snake_speed_clock):#貪吃蛇的生成:貪吃蛇的的初始位置由random()生成,并且是在坐標(biāo)在3與地圖的寬高間隔8個(gè)單位的位置之內(nèi),定義貪吃蛇的初始長(zhǎng)度為3節(jié)startx=random.randint(3,map_width-8)starty=random.randint(3,map_height-8)snake_coords=[{'x':startx,'y':starty},{'x':startx-1,'y':starty},{'x':startx-2,'y':starty}]#開始時(shí)向右移動(dòng),初始化蛇的行進(jìn)速度direction=RIGHTfood=get_random_location()globalsnake_speed#如果在游戲不是暫停的情況下按下“ESC”鍵則退出游戲whileTrue:pause=Falseforeventinpygame.event.get():ifevent.type==QUIT:quitgame()#使用鍵盤監(jiān)聽檢測(cè)事件實(shí)現(xiàn)對(duì)應(yīng)按鍵的功能綁定elifevent.type==KEYDOWN:if(event.key==K_LEFTorevent.key==K_a)anddirection!=RIGHT:direction=LEFTelif(event.key==K_RIGHTorevent.key==K_d)anddirection!=LEFT:direction=RIGHTelif(event.key==K_UPorevent.key==K_w)anddirection!=DOWN:direction=UPelif(event.key==K_DOWNorevent.key==K_s)anddirection!=UP:direction=DOWNelifevent.key==K_ESCAPE:quitgame()elifevent.key==window.EVENT_ADD:snake_speed=snake_speed+1elifevent==window.EVENT_SUB:snake_speed=snake_speed-1#無敵模式的開啟/關(guān)閉elifevent==window.EVENT_KING:ifsnake.s_king==True:snake.s_king=Falseelse:snake.s_king=Trueelifevent.key==K_SPACE:whilenotpause:foreventinpygame.event.get():ifevent.type==KEYDOWN:ifevent.key==K_SPACE:pause=notpause#調(diào)用move_snake()函數(shù)來實(shí)現(xiàn)貪吃蛇的移動(dòng)move_snake(direction,snake_coords)ret=snake_is_alive(snake_coords)ifnotret:breaksnake_is_eat_food(snake_coords,food)screen.fill(BG_COLOR)draw_snake(screen,snake_coords)draw_food(screen,food)draw_score(screen,len(snake_coords)-5)pygame.display.update()#控制游戲幀率,這里也就是貪吃蛇的速度,因?yàn)槌绦蚶L制的速度越快貪吃蛇看起來運(yùn)動(dòng)地也就越快snake_speed_clock.tick(snake_speed)5.6碰撞檢測(cè)碰撞檢測(cè)分為三種情況(蛇與障礙物的碰撞、蛇頭與蛇身之間的碰撞、蛇頭吃到食物時(shí)的碰撞),而這里只對(duì)貪吃蛇存活狀態(tài)產(chǎn)生影響的兩種情況進(jìn)行了定義,也就是蛇碰到障礙物和蛇碰到自己的身體,蛇吃到食物的碰撞在snake_is_eat_food()中定義。defsnake_is_alive(snake_coords):#蛇的存活狀態(tài)tag=True#如果蛇頭坐標(biāo)中的x或是y與地圖邊緣的坐標(biāo)相等的話就判定蛇撞墻了,此時(shí)將蛇的存貨狀態(tài)tag的值改為Falseifsnake_coords[HEAD]['x']==-1orsnake_coords[HEAD]['x']==map_widthorsnake_coords[HEAD]['y']==-1or\snake_coords[HEAD]['y']==map_height:tag=False#蛇自身的碰撞檢測(cè)則是蛇頭的坐標(biāo)x,y不能與蛇身坐標(biāo)中的任何一個(gè)相等forsnake_bodyinsnake_coords[1:]:ifsnake_body['x']==snake_coords[HEAD]['x']andsnake_body['y']==snake_coords[HEAD]['y']:tag=Falsereturntag6系統(tǒng)測(cè)試6.1開始游戲游戲開始的時(shí)候會(huì)在程序窗口內(nèi)隨機(jī)位置生成一個(gè)長(zhǎng)度為5的貪吃蛇,蛇頭為醒目的紅色,而蛇身是綠色。同樣地,會(huì)在地圖內(nèi)隨機(jī)生成長(zhǎng)度在1-5之間的黑色障礙物,普通模式下貪吃蛇觸碰到障礙物則游戲結(jié)束。為了區(qū)分貪吃蛇和食物,食物是用圓形的形式畫出,并采用藍(lán)色。游戲開始界面截圖如圖6-1所示。圖6-1游戲開始界面6.2生成障礙物為了增加游戲的可玩性,特別加入了生成障礙物的功能,障礙的生成位置隨機(jī),長(zhǎng)度在1-5個(gè)小方塊,以黑色填充。每當(dāng)玩家吃到5個(gè)食物時(shí),障礙物就會(huì)多一個(gè),并且貪吃蛇的行進(jìn)速度也會(huì)增加一級(jí)。當(dāng)玩家需要調(diào)節(jié)速度的時(shí)候,可通過F1加速、F2減速來實(shí)現(xiàn)。障礙物的固定長(zhǎng)度為5,但是在生成時(shí)碰到屏幕邊緣時(shí)會(huì)停止生成,所以就會(huì)有長(zhǎng)度1-5的障礙物出現(xiàn)的情況,也更加增添了游戲的豐富性。游戲生成障礙物界面截圖如圖6-2所示。(1) (2)圖6-2生成障礙物界面6.3無敵功能考慮到貪吃蛇會(huì)隨著吃到的食物變得越來越長(zhǎng),速度也越來越快,玩家不便控制很容易會(huì)導(dǎo)致游戲結(jié)束。所以特別加入了無敵功能,玩家只需按下F3鍵則可開啟/關(guān)閉無敵模式。在無敵模式下,貪吃蛇可在地圖中任意穿行,碰到障礙物和蛇身也不會(huì)死亡。游戲無敵功能界面截圖如圖6-3所示。(1)(2)圖6-3無敵功能界面6.4系統(tǒng)測(cè)試程序運(yùn)行良好,運(yùn)行中不報(bào)錯(cuò)、不卡頓,本系統(tǒng)對(duì)電腦內(nèi)存以及CPU的占用率也比較小,滿足了貪吃蛇游戲隨時(shí)運(yùn)行的特點(diǎn),且基本能在每臺(tái)電腦端運(yùn)行,對(duì)硬件設(shè)備要求較小。系統(tǒng)對(duì)CPU以及內(nèi)存的占用截圖如圖6-4所示。圖6-4CPU以及內(nèi)存的占用七、優(yōu)化與總結(jié)(一)優(yōu)化升級(jí)設(shè)想此次貪吃蛇游戲系統(tǒng)的設(shè)計(jì)只是簡(jiǎn)單的實(shí)現(xiàn)了游戲的運(yùn)行與部分功能,在試玩過市面上其他版本的貪吃蛇之后,我覺得在升級(jí)優(yōu)化時(shí)可以加入關(guān)卡設(shè)置,選擇不同的關(guān)卡則在游

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論